如何从 Vim 中运行 Unix 命令?

fun*_*hun 133 unix vim

当我在 vim 中时,如何运行 Unix 命令?

Cal*_*leb 147

进入命令模式Esc,然后运行:!unix_command。从:bang 开始的提示符运行的任何内容都!将作为 unix shell 命令运行。您将看到输出并允许点击一个键以返回您在 vim 中的工作。

如果您在可视模式下选择了文本并希望将其作为 STDIN 发送到命令,请点击!!并输入您的命令。命令的结果将替换您选择的文本。

  • 此外,`!!` *没有*选择任何文本将使您运行命令,然后在当前光标位置插入结果——如果您不需要/不想,则无需将内容发送到 STDIN 并替换它。 (27认同)
  • 此外,如果您只是想将命令的输出放在您的文档中,只需执行 `:r!unix_command`。这对于诸如`date`之类的命令很有用 (13认同)
  • 您还可以通过 shell(或任何解释器)执行 vi 缓冲区的多行,并将它们替换为执行结果。例如:`:10,20!sh` 或者,形成标记的行,`'a,'b!sh` (4认同)
  • 我认为值得注意的另一件事是,这取决于您使用的操作系统。如果您使用的是 Windows,它将执行 Windows shell 命令。许多阅读本文的人已经知道这一点,但对于来自 Google 的人来说,我认为这值得一提。 (2认同)

Jay*_*ton 40

VIM 帮助镜像:

:shell        :sh[ell]        start a shell
:!            :!{command}     execute {command} with a shell
Run Code Online (Sandbox Code Playgroud)

如果您运行的是 neovim,或者 vim 8.1 或更高版本,还有终端

:terminal     :terminal {cmd}         open a terminal window
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用 neovim 代替 vim,则 `:shell` 会替换为更强大的 `:terminal`。请参阅[此处](https://github.com/neovim/neovim/issues/2794)。 (3认同)

小智 19

除了上述答案之外,您还可以使用当前的 vim 缓冲区内容作为 shell 命令的标准输入,使用:%!.

例如,假设您想过滤当前 vim 窗口内容中的行以仅包含其中包含子字符串的行ca。你可以使用:

:%! grep ca
Run Code Online (Sandbox Code Playgroud)

这将自动过滤行,放置 grep 输出而不是当前行。