在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窗口。