Vim-您可能已经知道-是一个功能强大的编辑器,包含许多功能。我们已经写了很多关于Vim的教程,涵盖了基本用法、插件和一些其他有用的功能。鉴于Vim提供的海量功能,我们总能找到一些有用的东西与我们的读者分享。在本教程中,我们将重点介绍如何在编辑器窗口中执行外部命令并访问命令行shell。但在我们开始之前,有必要提醒一下,本教程中提到的所有示例、命令行和说明均已在Ubuntu14.04上测试过,我们使用的Vim版本为7.4。在Vim中执行外部命令有时,您可能需要在Vim编辑窗口中执行外部命令。例如,想象这样一个场景:你在Vim中打开了一个文件,做了一些更改,当你试图保存这些更改时,Vim抛出一个错误,说你没有足够的权限。在Vim中执行命令行现在,退出当前vim会话并以足够的权限重新打开文件将意味着丢失您所做的所有修改,因此,您可能同意,在大多数情况下不仅有一个选项。在这种情况下,在编辑器中运行外部命令的能力将派上用场。我们稍后会回到上面的用例,但现在,让我们了解如何在vim中运行基本命令。假设您正在编辑一个文件,想知道该文件包含的行数、单词数和字符数。为了达到这个目的,在vim的命令行模式下,只需要输入一个冒号:,后面跟着一个感叹号!,***就是要执行的命令(本例中使用wc)和紧随其后的文件名(使用%表示当前文件)。:!wc%下面是一个例子:填写上面提到的命令行Readytoexecute:Commandreadytoexecuteinvim下面是终端的输出:命令输出看到输出后,按回车,你就会掉线回到你的vim会话。当您在编写代码或脚本并想尽快知道这段代码或脚本是否包含编译时错误或语法错误时,此功能非常方便。继续,如果需要将输出添加到文件,请使用:read!命令。下面是一个示例::read!wc%read命令会将外部命令的输出作为新行插入到已编辑文件中当前行的下方。如果愿意,您还可以指定特定的行号-输出将附加在特定行之后。例如,以下命令会将wc的输出附加到文件的第二行之后。:2read!wc%注意:使用$表示在最后一行插入,0表示在第一行之前插入。现在,回到我们在开头讨论的一个用例,以下命令将帮助您保存文件而不先关闭它(这意味着未保存的内容不会丢失),然后使用sudo命令重新打开它.:w!sudotee%在Vim中访问shell除了执行个别命令外,您还可以将自己新建的shell放入vim中。为此,您只需在编辑器中运行以下命令::shell或::sh当您完成shell任务时,键入exit-这将带您回到您在Vim会话中离开的地方.需要牢记的漏洞虽然在现实世界中,可访问的shell与其用户权限是绝对一致的,但它也可以用于权限提升技术。正如我们在之前的一篇文章(关于sudoedit)中解释的那样,即使您授予用户sudo权限以仅通过Vim编辑文件,他们仍然可以使用此技术从编辑器中运行新的shell,并且他们可以做任何事情root用户或管理员用户可以做。总结能够在Vim中运行外部命令在许多情况下都是一项有用的功能(我们在本文中介绍了其中一些情况)。此功能的学习曲线很轻,因此初学者和有经验的用户都可以享受使用它的乐趣。您使用此功能已有一段时间了吗?你有什么要分享的吗?在下面的评论中留下您的想法。
