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

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

你可以在vim中使用! 命令。 例如要计算当前文件中的字数,可以这样做:

 :! wc % 

%被replace为当前的文件名。 要运行一个脚本,你可以在文件上调用解释器 – 例如,如果你正在编写一个perl脚本:

 :! perl % 

vim教程: 在Vim中映射键

你可以映射键,让perl执行上面jtsbuild议的当前脚本。

 map <Cp> :w<CR>:!perl %<CR> 

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

 imap <Cp> <Esc>:w<CR>:!perl %<CR> 

让你在插入模式下调用相同。

您的vim / home文件夹中应该有.vimrc(Windows的_vimrc)文件。 它有关于vim如何performance的说明。

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

a)写入当前文件:w

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

每个命令之后的<CR>代表“回车”:执行特定命令的指令。 imap和map一样,但在插入模式下监听Ctrl + p。

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

例如。:

 :!python % 

你可以从vim运行它:

:!./script.sh

这听起来像你正在寻找!

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

你可以用%来表示当前的文件名,如果你需要把它传递给脚本:

 !proofread-script % 

你也可以用! 用一个范围,用命令作为filter:

 !{motion}{filter} " from normal mode :{range}!{filter} " from command mode 

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

最后,如果你实际上不需要从你的文件中传递input,而是希望在你的文件中输出,那实际上是一个简单的filter,最快的方法就是!!{cmd} 。 这将用命令的输出replace当前行。

把这个小片段放到你的.vimrc中,用一个按键(如F5 )执行当前文件,并将结果显示在一个新的分割面板缓冲区中。

:! 是好的,但你需要切换到您的terminal看到的结果。

虽然你可以用ctrl-z来做到这一点,并把vim带回fg但这仍然意味着你需要切换上下文。

这个片段的工作方式是首先猜测基于filetype的可执行filetype ,然后以当前文件作为参数运行它。

接下来,一个方便的实用程序方法将输出转储到一个新的缓冲区中。

这不是完美的,但对于常见的工作stream程来说非常快。

这里是复制下面的代码片段:

 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" """""""""""""""""""""""""" RUN CURRENT FILE """"""""""""""""""""""""""""" """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Execute current file nnoremap <F5> :call ExecuteFile()<CR> " Will attempt to execute the current file based on the `&filetype` " You need to manually map the filetypes you use most commonly to the " correct shell command. function! ExecuteFile() let filetype_to_command = { \ 'javascript': 'node', \ 'coffee': 'coffee', \ 'python': 'python', \ 'html': 'open', \ 'sh': 'sh' \ } let cmd = get(filetype_to_command, &filetype, &filetype) call RunShellCommand(cmd." %s") endfunction " Enter any shell command and have the output appear in a new buffer " For example, to word count the current file: " " :Shell wc %s " " Thanks to: http://vim.wikia.com/wiki/Display_output_of_shell_commands_in_new_window command! -complete=shellcmd -nargs=+ Shell call RunShellCommand(<q-args>) function! RunShellCommand(cmdline) echo a:cmdline let expanded_cmdline = a:cmdline for part in split(a:cmdline, ' ') if part[0] =~ '\v[%#<]' let expanded_part = fnameescape(expand(part)) let expanded_cmdline = substitute(expanded_cmdline, part, expanded_part, '') endif endfor botright new setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap call setline(1, 'You entered: ' . a:cmdline) call setline(2, 'Expanded Form: ' .expanded_cmdline) call setline(3,substitute(getline(2),'.','=','g')) execute '$read !'. expanded_cmdline setlocal nomodifiable 1 endfunction 

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

那么这取决于你的操作系统 – 其实我没有在M $ Window $上testing它 – 但是Conque是其中最好的插件之一: http : //code.google.com/p/conque/

事实上,它可以更好,但工作。 你可以在一个vim“窗口”中embedded一个shell窗口。