在 vim 中运行外部命令

Cra*_*lus 6 vim wc vi-mode

看来,如果我在里面运行以下内容vim

:w !wc -w

我得到了文件的字数。但我不明白语法。这是如何工作的,我将如何指定我想要一个段落的字数而不是整个文件的字数?

Mat*_*ott 5

当您发出 时:w !wc -w,vim 会创建一个临时文件,然后将该文件通过管道传送到 之后的命令!,或者更确切地说,它将您的数据放在一个临时文件中,并要求您的 shell 执行一个类似于以下内容的命令:

 (wc -w) < /tmp/vHhjUPf/2
Run Code Online (Sandbox Code Playgroud)

最后一部分是 vim 将数据存储在其中的一些随机文件夹/文件名。需要注意的一件有趣的事情是,此命令将在不兼容的 shell 中失败,例如fish。这是因为 fish 使用(cmd)命令替换的语法而不是传统用法。


小智 3

要指定要传递给外部命令的数据范围,请键入:

:<range>w !<command>
Run Code Online (Sandbox Code Playgroud)

例如,

:1,5w !wc -w
Run Code Online (Sandbox Code Playgroud)

将计算第 1 行和第 5 行所包围的范围内的单词数。键入:h 10.3以获取有关范围的更多信息。

您还可以使用

:<range>!<command>
Run Code Online (Sandbox Code Playgroud)

将第 1 行到第 5 行的内容替换为命令的输出,这在使用外部命令过滤文本时非常有用。(例如用于排序。)键入:h !以获取有关过滤器的更多信息。

如果您希望运行外部命令而不让 Vim 将文本传递到其标准输入,请像这样运行命令::!command

  • 在可视模式下,`!` 扩展为 `'&lt;,'&gt;!`。`&lt;` 和 `&gt;` 是分别标记当前/最后一个视觉选择的开始和结束的标记。“mark”是使用标记作为范围一部分的语法。 (2认同)