直接在vim/mvim/gvim中执行脚本

ran*_*its 39 vi vim macvim

TextMate有一个很好的功能,允许您从当前上下文中执行脚本,并在单独的窗口中显示输出.这使您可以随时编写和测试代码.我几乎可以肯定MacVim/gVIM有类似的功能,但我不确定它是什么.目前我将缓冲区保存到磁盘,然后转到命令行并在这方面执行脚本.如何使用vim改进该工作流程?

小智 70

您可以使用该!命令在vim中执行此操作.例如,要计算当前文件中的单词数,您可以执行以下操作:

:! wc %
Run Code Online (Sandbox Code Playgroud)

%被当前文件名替换.要运行脚本,您可以在文件上调用解释器 - 例如,如果您正在编写perl脚本:

:! perl %
Run Code Online (Sandbox Code Playgroud)

  • 并[重复最后一个`:`命令](http://vim.wikia.com/wiki/Repeat_last_colon_command):*键入`@@`或*键入`:`并使用向上光标@jts:也许你会加上这个. (3认同)
  • 在运行之前还要保存脚本:`:w | python%`([多个命令](http://unix.stackexchange.com/questions/144568/how-do-i-write-a-command-in-vim-to-run-multiple-commands))重复最后一个`:`命令: (2认同)

cam*_*tus 16

vim教程:在Vim中映射键

您可以映射键,以便perl执行上面jts建议的当前脚本.

map <C-p> :w<CR>:!perl %<CR>
Run Code Online (Sandbox Code Playgroud)

将映射Ctrl + P写入文件并通过perl运行它

imap <C-p> <Esc>:w<CR>:!perl %<CR>
Run Code Online (Sandbox Code Playgroud)

让你在插入模式下调用它.

你的vim/home文件夹中应该有.vimrc(_vimrc for Windows)文件.它有关于vim应该如何表现的说明.

map <C-p> :w<CR>:!perl %<CR> 只是将Ctrl + p映射到的指令:

a)写入当前文件 :w

b)使用%(当前打开的文件)作为参数运行命令(perl) :!perl %

<CR>在每个命令代表"回车"之后:执行特定命令的指令.imap与map相同,但在插入模式下侦听Ctrl + p.

  • 你的答案非常好.您能否进一步解释其部分,使其更加完整并使社区受益? (2认同)
  • 希望我没有让答案更加混乱 (2认同)

Vla*_*uer 7

这里的所有建议都只是展示:!{cmd} %,它将当前缓冲区传递给 shell cmd。但是还有一个选项:write !{cmd} ,比如:write !sh命令的作用是当前缓冲区的每一行都在shell中执行。
它通常很有用,例如,当您向缓冲区添加了几行,并希望立即查看执行结果而不先保存缓冲区。
也可以执行某个范围,而不是缓冲区的全部内容:
:[range]write !{cmd}


Ama*_*9MF 6

你可以从vim直接运行它:

:!./script.sh


Nik*_*ohl 6

保存文件并使用解释器调用脚本

例如.:

:!python %
Run Code Online (Sandbox Code Playgroud)


Cas*_*bel 5

听起来您正在寻找!

:!{cmd}{cmd}用shell执行。

%如果需要将其传递给脚本,则可以使用来表示当前文件名:

!proofread-script %
Run Code Online (Sandbox Code Playgroud)

您还可以使用!范围,将命令用作过滤器:

!{motion}{filter}    " from normal mode
:{range}!{filter}    " from command mode
Run Code Online (Sandbox Code Playgroud)

(在第一种情况下,与许多其他命令一样,当您键入动作时,它会将您传递到命令模式,将动作转换为一个范围,例如:.,.+2!

最后,如果您实际上不需要从文件中传递输入,但希望在文件中输出,那本质上是一个微不足道的过滤器,最快的方法是!!{cmd}. 这将用命令的输出替换当前行。


Max*_*xim 5

要执行当前可执行脚本,请使用

:!./%
Run Code Online (Sandbox Code Playgroud)

!执行 shell 命令,% 是当前文件名,./ 在前面添加当前目录。