VIM:同时保存并运行?

时间:2009-03-02 01:54:29

标签: python vim

我做了很多Python快速模拟的东西,我不断保存(:w)然后运行(:!!)。我想知道,有没有办法结合这些行动。也许是一个“保存并运行”命令。

感谢您的帮助。

12 个答案:

答案 0 :(得分:62)

好的,您正在寻找的最简单的形式是管道命令。它允许您在同一行上运行多个cmdline命令。在你的情况下,这两个命令是写`w`并执行当前文件`! %:p`。如果你有一个特定的命令,你运行当前文件,第二个命令变为,例如, `!python%:p`。所以,对你提问的最简单的答案就是:

:w | ! %:p
 ^ ^ ^
 | | |--Execute current file
 | |--Chain two commands
 |--Save current file

最后要注意的是,并非所有命令都可以链接。根据{{​​3}},某些命令接受管道作为参数,从而打破链......

答案 1 :(得分:27)

选项1:

编写与此类似的功能并将其放在启动设置中:

function myex()
   execute ':w'
   execute ':!!'
endfunction

你甚至可以将一个关键组合映射到它 - 看一下文档。


选项2(更好):

查看重新映射击键的文档 - 您可以通过简单的密钥重映射来完成它。以下工作,但有“filename.py”硬编码。也许你可以深入研究并找出如何用当前文件替换它?

:map <F2> <Esc>:w<CR>:!filename.py<CR>

映射后,您只需在命令模式下按F2即可。

imap,vmap等...是不同模式的映射。以上仅适用于命令模式。以下内容也应该在插入模式下工作:

:imap <F2> <Esc>:w<CR>:!filename.py<CR>a

VIM手册第40.1节非常有帮助。

答案 2 :(得分:11)

使用autowrite选项:

:set autowrite
  

在每个文件中写下文件的内容(如果已修改):next,:rewind,:last,:first,:previous,:stop,:suspend,:tag,:!,:make,CTRL-]和CTRL- ^命令[...]

答案 3 :(得分:5)

命令组合似乎可以通过|字符工作,所以可能会将:w|!your-command-here别名化为不同的组合键吗?

答案 4 :(得分:5)

你走了:

:nmap <F1> :w<cr>:!%<cr>

save&amp;跑 (你必须处于n模式 - 只需添加esc和a for i模式)

答案 5 :(得分:4)

另一种可能性:

au BufWriteCmd *.py write | !!

虽然每次保存都会run,但这可能不是你想要的。

答案 6 :(得分:2)

这就是我在.vimrc中放置的内容,就像魅力一样

nnoremap <leader>r :w<CR>:!!<CR>

当然,您需要在此之前运行一次shell命令,以便知道要执行的命令。

例如:

:!node ./test.js

答案 7 :(得分:2)

在vim中,您可以简单地将当前缓冲区的任何范围重定向到外部命令(无论是bash,python还是您自己的python脚本)。

# redirect whole buffer to python
:%w !python

假设您当前的缓冲区包含两行,如下所示

import numpy as np
print np.arange(12).reshape(3,4)

然后:%w !python将运行它,是否保存。并打印下面的东西 终端,

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

当然,你可以做一些持久的事情,例如一些键盘图。

nnoremap <F8> :.w !python<CR>
vnoremap <F8> :w !python<CR>

第一个运行当前行,第二个运行视觉选择,通过python解释器。

#!! be careful, in vim ':w!python' and ':.w !python' are very different, the
first write (create or overwrite) a file named 'python' with contents of
current buffer, the second redirect the selected cmdline range (here dot .,
which mean current line) to external command (here 'python').

对于cmdline范围,请参阅

:h cmdline-ranges

不低于一,关于正常命令,而不是cmdline一。

:h command-range

受到https://stackoverflow.com/a/19883963/3625404

的启发

答案 8 :(得分:1)

我从vim提示wiki获得了以下内容:

command! -complete=file -nargs=+ shell call s:runshellcommand(<q-args>)
function! s:runshellcommand(cmdline)
  botright vnew
  setlocal buftype=nofile bufhidden=wipe nobuflisted noswapfile nowrap
  call setline(1,a:cmdline)
  call setline(2,substitute(a:cmdline,'.','=','g'))
  execute 'silent $read !'.escape(a:cmdline,'%#')
  setlocal nomodifiable
  1
endfunction

但在第三行改为新的vnew,然后对于python,我有以下

map <F9> :w:Shell python %<cr><c-w>

点击f9保存,运行并将输出转储到一个新的垂直分割暂存缓冲区,以便轻松查看/保存等...也点击cw所以我只需要按h / c关闭它/移回我的代码。

答案 9 :(得分:0)

尝试在Bash中进行。

如果是名为t.c的C文件,这非常方便:

vi t.c &&  cc t.c -o t && ./t

和符号(&&)确保一条错误消息破坏了命令链。

对于Python,这可能更容易:

vi t.py && python t.py

答案 10 :(得分:0)

这也将在插入模式下起作用 ...

" F5 => Save & Run python3 "
nnoremap <F5> :w <CR> :!sh -c 'python3 %' <CR>
inoremap <F5> <Esc> :w <CR> :!sh -c 'python3 %' <CR>

我一直使用它来测试太长的内容,以至于无法在解释器中重新输入^^

答案 11 :(得分:-12)

  1. 考虑切换到IDLE。 F5可以做到一切。

  2. 考虑转换到Komodo。您可以定义命令,以便F5执行所有操作。