Vim——正如你可能已经了解的那样——是一个包含很多特性的强大的编辑器。我们已经写了好多关于 Vim 的教程,覆盖了 基本用法、 插件, 还有一些 其他的 有用的 特性。鉴于 Vim 提供了多如海洋的特性,我们总能找到一些有用的东西来和我们的读者分享。
在这篇教程中,我们将会重点关注你如何在编辑窗口执行外部的命令,并且访问命令行 shell。
但是在我们开始之前,很有必要提醒一下,在这篇教程中提及到的所有例子、命令行和说明,我们已经在 Ubuntu 14.04 上测试过,我们使用的的 Vim 版本是 7.4 。
在 Vim 中执行外部命令
有的时候,你可能需要在 Vim 编辑窗口中执行外部的命令。例如,想象一下这种场景:你已经在 Vim 中打开了一个文件,并做了一些修改,然后等你尝试保存这些修改的时候,Vim 抛出一个错误说你没有足够的权限。

现在,退出当前的 vim 会话,重新使用足够的权限打开文件将意味着你会丢失所做的所有修改,所以,你可能赞同,在大多数情况不是只有一个选择。像这样的情况,在编辑器内部运行外部命令的能力将会派上用场。
稍后我们再回来上面的用例,但是现在,让我们了解下如何在 vim 中运行基本的命令。
假设你在编辑一个文件,希望知道这个文件包含的行数、单词数和字符数。为了达到这个目的,在 vim 的命令行模式下,只需要输入冒号 :,接下来一个感叹号 !,最后是要执行的命令(这个例子中使用的是 wc)和紧接着的文件名(使用 % 表示当前文件)。
:! wc %
这是一个例子:
填入的上面提及的命令行准备执行:

下面是终端上的输出:

在你看到输出之后,输入回车键,你将会退回到你的 vim 会话中。
你正在编写代码或者脚本,并且希望尽快知道这段代码或者脚本是否包含编译时错误或者语法错误,这个时候,这种特性真的很方便。
继续,如果需求是添加输出到文件中,使用 :read ! 命令。接下来是一个例子:
:read ! wc %
read 命令会把外部命令的输出作为新的一行插入到编辑的文件中的当前行的下面一行。如果你愿意,你也可以指定一个特定的行号——输出将会添加到特定行之后。
例如,下面的命令将会在文件的第二行之后添加 wc 的输出。
:2read ! wc %
注意: 使用 $ 在最后一行插入, 0 在第一行前面插入。
现在,回到最开始我们讨论的一个用例,下面的命令将会帮助你保存文件而不需要先关闭文件(这将意味着没有保存的内容不会丢失)然后使用 sudo 命令重新打开。
:w ! sudo tee %

在 Vim 中访问 shell
除了可以执行单独的命令,你也可以在 vim 中放入自己新创建的 shell。为了达到这种目的,在编辑器中你必须要做的是运行以下的命令:
:shell
或者:
:sh
当你执行完了你的 shell 任务,输入 exit —— 这将带你回到原来离开的 Vim 会话中。
要谨记的漏洞
虽然在真实世界中,能够访问的 shell 绝对符合它们的用户权限,但是它也可以被用于提权技术。正如我们在早期的一篇文章(在 sudoedit 上)解释的那样,即使你提供给一个用户 sudo 的权限只是通过 Vim 编辑一个文件,他们仍可以使用这项技术从编辑器中运行一个新的 shell,而且他们可以做 root 用户或者管理员用户可以做的所有内容。
总结
能够在 Vim 中运行外部命令在好多场景中(有些场景我们已经在这篇文章中提及了)都是一个很有用的特性。这个功能的学习曲线并不麻烦,所以初学者和有经验的用户都可以好好使用它。
Linux Mint 20.2“Uma”中的新
EasyWSL工具将 Linux Docker 映
适用于 Linux 5.16 的新 Zst
适用于Linux的Windows子系统
Linux系统xlsatom命令如何使
删除桌面图标快捷方式教程
很多软件在安装的时候会默认在桌面上创建一个快捷方式,这些......
0x80131500打不开商店
当我们在打开win10的应用商店的时候有些用户会遇到0x80131500这样......
键盘失灵故障排查:为什么我的键盘有时
键盘失灵的问题往往是用户在使用电脑时最常遇到的烦恼之一。......
Word 2007技巧:设置“允许跨页断行”
在使用Word 2007插入和编辑表格时,有时会根据排版需要使表格中......
InDesign怎么插入表格文本-InDesign插入表格
InDesign怎么插入表格文本呢?如果各位亲们还不了解的话,就来这......
今天小编为大家带来的是Linux的特殊权限SUID、SGID和SBIT讲解。希望对大家会有帮助,有需要的朋友一起去看看吧...
今天小编将为大家带来的是Linux下增大可打开文件描述符的最大数的方法,希望对大家会有帮助,有需要的朋友一起去看看吧...
最近一些朋友问小编Linux Mint如何设置面板位置以及添加面板元素?今天小编将为大家分享的是Linux Mint设置面板位置以及添加面板元素的方法,希望对大家会有帮助,有需要的朋友一起去...
最近一些朋友问小编Linux在无root的权限下如何安装程序?今天小编将为大家带来的是Linux在无root的权限下安装程序的方法,希望对大家会有帮助,有需要的朋友一起去看看吧...
您是否检查过您的 PC 是否符合更新到 Windows 11 的条件,但结果却令人失望?在 Windows 10 之外继续使用笔记本电脑或台式机的少数选择之一是安装 Linux。这就是为什么这...
最近一些朋友问小编在Linux下如何确定网卡所使用驱动程序?今天小编要为大家带来的是在Linux下确定网卡所使用驱动程序的方法,希望对大家会有帮助,有需要的朋友一起去看看吧...
最近一些朋友问小编Linux下如何查看16进制文件?今天小编将为大家带来Linux下查看16进制文件的方法,有需要的朋友一起去看看吧...
微软已经向开发通道中的Windows Insiders宣布了Windows 10 Insider Preview Build 20246 。 通过内部版本20246,Microsoft使用户可以轻松地通过单行命令(wsl.exe nda...
最近一些朋友问小编RedHat Linux 5无法使用ifconfig怎么办?今天小编就为大家分享RedHat Linux 5无法使用ifconfig的解决方法,有需要的朋友可以参考...
这篇文章的内容主要讲述的是Linux连接windows的ftp,unzip出现问题的解决方法,希望对大家会有帮助,下面就随小编一起去看看具体的操作吧...
最近一些朋友问小编Linux Mount NTFS分区造成的权限问题如何解决?今天小编将为大家带来的是Linux Mount NTFS分区造成的权限问题的解决方案,希望对大家会有帮助,有需要的朋友一起去看看...
这篇文章主要介绍了linux sed 多行处理详细总结,需要的朋友可以参考下...
今天小编为大家带来的是Linux中RedHat CentOS Ubuntu Fedora的区别详解,希望对大家会有帮助,有需要的朋友一起去看看吧...
一些朋友不知道在Linux系统中如何把文件拷贝到U盘。今天小编就为大家带来的是Linux系统中把文件拷贝到U盘的方法,希望对大家会有帮助,有需要的朋友一起去看看吧...
Emacs是公认的最好的代码编辑器之一。由于默认编码跟文档编码不同会导致Emacs经常出现乱码!这种情况该如何解决呢?下面小编就为大家分享Linux下打开Emacs出现乱码的解决方法!有需要...