Vim中执行Linux命令的几种方式

Vim 编辑器不仅提供了大量的命令来方便和加快我们的文件编辑工作,在此编辑器中,我们还可以直接使用 Linux 命令来进一步提高文件编辑的效率,这就是 Vim 编辑器的所谓过滤功能。

由于 Vim 编辑器中支持直接执行 Linux 命令,从而可以方便快捷地对文件完成以下操作:
  1. 将一个命令的输出结果存入正在编辑的文件;
  2. 将正在编辑的文件中的一些数据作为某个指定 Linux 命令的输入。

下面,通过一个简单的例子,来演示如何在 Vim 编辑器中执行 Linux 命令。

首先,我们新建一个 demo.txt 文件,并手动输入如下内容,并将光标移动至下一行开头:

https://www.xinbaoku.com

在此基础上,按 Esc 令 Vim 返回到命令模式,再按下!!,这时在窗口的左下角会出现:.!的提示信息,这就表明我们可以输入 Linux 命令了。例如,我们输入 date 命令,如图 1 所示:


图 1 向文件中输入命令的执行结果

注意,窗口左下角的:.!表示操作文本的范围,其中 . 表示从光标所在行开始,! 表示后续会执行 Linux 命令,整体表示命令的执行结果将插入到光标所在行的位置,因此,如果光标所在位置处有数据,就会被命令的执行结果直接覆盖掉。

确认光标位置无误后,按 Enter(回车)键,这时会发现系统当前的日期和时间写到了 demo.txt 文件中第 2 行的位置:

https://www.xinbaoku.com
Tue Nov 12 07:20:49 PST 2017

在此基础上,再向该文件中手动输入以下数据:

https://www.xinbaoku.com
Tue Nov 12 07:20:49 PST 2017
1 新宝库
3 www.xinbaoku.com
2 Linux教程

输出完成之后,将光标调整至第 3 行第 1 个字符的位置,然后按 Esc 使 Vim 进行命令模式,并按下!}组合键,你会看到窗口的左下角出现:.,$!的提示信息,如图 2 所示。


图 2 Vim命令模式下按 !} 的提示信息

其中 . 表示光标所在的当前行,$ 表示文件最后一行,因此和之前不同,这次选取的是文件中第 3 行及之后的所有内容。

在此基础上,我们使用 sort 命令对选中文本按照第 1 列进行降序排序,执行命令如下:

:.,$!sort -nr -k1

有关 sort 命令的用法,由于不是本节重点,这里不再做过多讲解。

按 Enter(回车)键,可以看到,demo.txt 文件中的内容变成:

https://www.xinbaoku.com
Tue Nov 12 07:20:49 PST 2017
3 www.xinbaoku.com
2 Linux教程
1 新宝库

由此,通过将所选文件作为 sort 命令的输入,实现了对该部分文本的降序排序操作。

除此之外,表 3 罗列出了常用的几种 Vim 和 Linux 命令搭配使用的方式

表 3 Vim执行Linux命令的方式
格式 功能
:!命令 直接运行一个 Linux 命令,运行完毕之后,即可返回到 Vim 中。
:w!命令 将 Vim 中所有的文本内容作为指定命令的输入。但命令的执行结果不会写入到当前文件中。
:r!命令 将命令执行的结果写入到当前 Vim 中,例如 :!ls 表示将 ls 的执行结果输入到 Vim 中。
:nr!命令 其中 n 为数字,表示将命令的执行结果写入到 Vim 第 n 行的位置。例如,:3r!date 表示将 date 命令的执行结果写入到第 3 行文本处。
:n,m!命令 其中 n 表示起始行号,m为结束行号,功能是将 Vim 中指定的部分文本作为某个命令的输入,同时将命令的输出也插入到当前指定的位置。
:n,m w!命令 其中 n 表示起始行号,m为结束行号,其功能是 Vim 中指定的部分文本作为某个命令的输入,但命令的执行结果不会写入到文件中。
!!date 向 Vim 中插入当前时间。