来自帮助:help backtick-expansion
:
On Unix and a few other systems you can also use backticks for the file name
argument, for example:
:next `find . -name ver\\*.c -print`
:view `ls -t *.patch \| head -n1`
The backslashes before the star are required to prevent the shell from
expanding "ver*.c" prior to execution of the find program. The backslash
before the shell pipe symbol "|" prevents Vim from parsing it as command
termination.
如果键入从帮助中获取的命令,则会收到错误消息:
:next `find . -name ver\\*.c -print
E79: Cannot expand wildcards
为什么帮助中的示例使用两个反斜杠而不是一个反斜杠,为什么它不起作用?
以下工作:
如果我在
find
程序之前删除了两个反斜杠之一,它们可以防止星星被外壳扩展::next `find . -name ver\*.c -print`
如果删除两个反斜杠并在模式周围加上单引号
ver*.c
::next `find . -name 'ver*.c' -print`
到目前为止,规则似乎是:
如果shell命令中包含星号,并且您不希望shell在命令前将其展开,则在其前面加上一个反斜杠或在pattern周围加上单引号。
但是帮助给出了另一个示例:
:view `ls -t *.patch \| head -n1`
此命令无需任何修改即可工作,不需要单引号,也不需要反斜杠。
我想它起作用的原因是因为ls
命令(与命令的-name
参数相反find
)接受多个文件参数,并且看到shell扩展没有问题*.patch
。
现在,让我们说,我想看看所有的文件扩展名为.conf
内部/etc
文件夹和管道输出find
,以grep
获得仅包含字符串匹配input
。
在外壳程序中,从任何工作目录中,我将输入:
find /etc -name '*.conf' | grep input
它会工作。
在vim中,我将键入相同的命令,在命令前后加上反引号,并在管道符号前加上反斜杠,以防止vim将其解释为命令终止:
:next `find /etc -name '*.conf' \| grep input`
而且有效。
现在,如果键入不带管道和的相同命令grep input
,则会出现错误:
:next `find /etc -name '*.conf'`
E79: Cannot expand wildcards
即使我用单引号保护了星号,在这种情况下为什么也会出现错误?
并且为什么现在会出现错误,而不仅仅是在管道和之前出现错误grep input
?
为了理解,我想出了一个简单的命令:
find . -name '*.conf'
它.conf
在工作目录中查找所有带有扩展名的文件。该命令在外壳中有效。
为了在vim中进行测试,我输入了::next `find . -name '*.conf'`
并且它可以工作。在这种情况下,点代表我当前的工作目录,如Ex命令显示的那样,:pwd
这是我的主目录,/home/username
因为我从该目录启动了vim会话。
为什么当我要求在当前工作目录中进行搜索时它为什么起作用,而当我要求在任意文件夹中进行搜索时却不起作用/etc
?
现在,如果使用vim Ex命令将工作目录从更改/home/username
为/etc
,:cd /etc
然后重试与以前相同的命令,则会再次出错:
:next `find . -name '*.conf'`
E79: Cannot expand wildcards
为什么当我位于主目录中时,相同的命令起作用,而当我处于目录中时,为什么不起作用/etc
?
我敢肯定有一些逻辑,但是我找不到。
用任意的shell命令(包含星号,管道,从任何工作目录中的任何目录中搜索)填充arglist的一般正确语法是什么?
我正在使用vim版本7.4.942,而zsh是我的默认shell。我用最少的vim -u NORC -N
bash和zsh 初始化()测试了这些命令。
我需要配置vim来调用bash而不是zsh吗?
vim $(find . -name ver\*.c -print)
,vim $(ls -t *.patch | head -n1)
,vim $(find /etc -name '*.conf' | grep input)
,vim $(find /etc -name '*.conf')
,vim $(find . -name '*.conf')
--remote
,请参见:vi.stackexchange.com/a/5618/4939),但我很好奇如何知道直接在当前会话中执行此操作。如果不可能的话,但是在阅读了帮助之后,看来可以完成。如果是这样,我想理解为什么vim对类似命令的反应如此不同。
find /etc -name '*.conf'
不起作用的情况下,我认为该命令会产生一些有趣的名称,这可能是通过管道传递时起作用的原因grep
。
vim $(find . -name ver*.c)