【问题标题】:passing argument to a vim "execute"将参数传递给vim“执行”
【发布时间】:2016-10-03 22:31:45
【问题描述】:

在 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 中扫描包含目录列表的文本并即时创建它们。

【问题讨论】:

标签: vim arguments parameter-passing execute


【解决方案1】:

这就是答案:

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

%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 =""

【讨论】:

    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 2022-10-07
    • 2019-09-27
    相关资源
    最近更新 更多