将参数传递给vim“执行”

时间:2016-06-03 18:47:20

标签: vim arguments parameter-passing execute

在Vim中,我希望逐行扫描文本,并将其内容传递给外部shell命令。 例如,我有一个名单列表,并希望对列表的每个名称打招呼。 我已经设法做的如下。

鉴于此文:

John Doe

    Jane Doe

Baby Doe

我可以使用此命令仅查找名字,并使用反向引用语法(\ 0或\ 1)在替换命令中重用该标记。

:%g/\w\+/ s//--\0--/

这是输出:

--John-- Doe

    --Jane-- Doe

--Baby-- Doe

我现在要做的是更改“执行”shell命令的“替换”命令。

此命令

:%g / \ w \ + / exe“!echo hello”“world”

工作正常,但如何参数化呢?

到目前为止,我已经尝试过了:

:%g / \ w \ + / exe“!echo hello”\ 0

这也是:

:%g / \ w \ + / exe“!echo hello”&

没有成功......

这个问题有很多价值,因为你可以从Vim扫描包含目录列表的文本并动态创建它们。

1 个答案:

答案 0 :(得分:2)

所以这就是答案:

以下命令将扫描文本,修剪换行符和空格以对文本中的每个名称说“hello”:

%g/\<\w\+\>/ y A | exe ' !echo hello '. substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '') | let @a =""

下一个将为文件的每个非空行创建一个目录。这次,添加了 shellescape()功能:

%g/\<\w\+\>/ y A | exe ' !mkdir '. shellescape(substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '')) | let @a =""

如果您需要创建“静默”目录,请执行以下命令:

%g/\<\w\+\>/ y A | exe 'silent !mkdir ' . shellescape(substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '')) | let @a =""

<强> P.S。 :

您还可以使用几乎相同的命令清理文件(删除空行并修剪非空行)到新文件中:

%g/\<\w\+\>/ y A | exe 'silent !echo ' . substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '') . ">> new_file.txt" | let @a =""