我想从Vim中逐行扫描文本,并将其内容传递给外部shell命令。
例如,我有一个名称列表,并想与列表中的每个名称打招呼。
我已经设法做的如下。
鉴于此文本:
John Doe
Jane Doe
Baby Doe
我可以使用此命令仅查找名字,并使用后向引用语法(\ 0或\ 1)在替代命令中重用令牌。
:%g/\w\+/ s//--\0--/
这是输出:
--John-- Doe
--Jane-- Doe
--Baby-- Doe
我现在想做的就是将我的“ substitute”命令更改为“ execute” shell命令。
这个命令
:%g / \ w \ + / exe“!echo hello”“ world”
工作正常,但如何对其进行参数化?
到目前为止,我已经尝试过了:
:%g / \ w \ + / exe“!echo hello” \ 0
这也是:
:%g / \ w \ + / exe“!echo hello”&
没有成功...
这个问题具有很大的价值,因为您可以从Vim中扫描包含目录列表的文本并快速创建它们。
最佳答案
所以这是答案:
以下命令将扫描文本,修剪换行符和空格以对文本中的每个名称说“ 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 =""
附言:
您也可以使用几乎相同的命令将文件清理(除去空行并修剪非空行)到新文件中:%g/\<\w\+\>/ y A | exe 'silent !echo ' . substitute(substitute(@a, '\n\+\s*', '', ''), '\s*\n\+', '', '') . ">> new_file.txt" | let @a =""