vim - 将参数传递给 vim "execute"

标签 vim arguments parameter-passing execute

在 Vim 中,我想逐行扫描文本,并将其内容传递给外部 shell 命令。
例如,我有一个名字列表,想向列表中的每个名字问好。
我已经设法做的是如下。

鉴于此文本:

John Doe

    Jane Doe

Baby Doe

我可以使用此命令仅查找名字,并使用反向引用语法(\0 或\1)在替代命令中重用 token 。
:%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"&

没有成功...

这个问题很有值(value),因为您可以从 Vim 扫描包含目录列表的文本并即时创建它们。

最佳答案

所以这里是答案:

以下命令将扫描文本,修剪换行符和空格以对文本中的每个名称说“你好”:
%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 =""

关于vim - 将参数传递给 vim "execute",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37621470/

相关文章:

Vimscript : how pass variable/float into string?

vim - 如何在vim中没有光标跳转的情况下获得匹配的大括号突出显示

c - 在 C 中作为用户输入的文件路径

c# - 按 ref 或按值 (C#) 传递方法参数的一般简短指南?

vim - 如何在 Windows 7 中关闭 gvim 中的所有字体提示?

javascript - 如何动态获取执行另一个Function的Function Name?

arguments - 在障碍条件中使用 protected 条目参数

c# - 启动新进程时如何指定带空格的参数

r - 将一个函数应用于两个列表?

vim - 突出显示 Python 字符串文字中的 SQL