![在vim中运行外部命令](https://linux22.com/image/48972/%E5%9C%A8vim%E4%B8%AD%E8%BF%90%E8%A1%8C%E5%A4%96%E9%83%A8%E5%91%BD%E4%BB%A4.png)
似乎如果我在以下内容中运行vim
:
:w !wc -w
我得到了文件的字数。但我不明白语法。这是如何工作的以及如何指定我想要一个段落的字数而不是整个文件的字数?
答案1
当您发出 时:w !wc -w
,vim 创建一个临时文件,然后将该文件通过管道传递给 后面的命令!
,或者更确切地说,它将您的数据放入临时文件中,并要求您的 shell 执行如下所示的命令:
(wc -w) < /tmp/vHhjUPf/2
最后一部分是 vim 存储数据的随机文件夹/文件名。需要注意的一件有趣的事情是,此命令在不兼容的 shell 中会失败,例如鱼。这是因为 Fish 使用(cmd)
命令替换语法而不是传统用法。
答案2
要指定要传递给外部命令的数据范围,请键入:
:<range>w !<command>
例如,
:1,5w !wc -w
将计算第 1 行和第 5 行所包围的范围内的单词数。键入:h 10.3
以获取有关范围的更多信息。
您还可以使用
:<range>!<command>
将第 1 行到第 5 行的内容替换为命令的输出,这在使用外部命令过滤文本时非常有用。 (例如用于排序。)键入:h !
以获取有关过滤器的更多信息。
如果您希望运行外部命令而不让 Vim 将文本传递到其标准输入,请像这样运行命令::!command
。
答案3
vim 命令:w
只是将当前文件写入磁盘。
使用:w newfilename
您将当前文件写入新文件名。
该命令带参数:!ls -al
运行外部程序并显示结果。ls
-al
您提到的命令 ( :w !wc -w
) 将(可能)简单地将当前文件写入到外部命令 ( ) 的管道中,wc -w
而外部命令又将计算当前文件中的单词数。