我做了很多Python快速模拟的东西,我不断保存(:w)然后运行(:!!)。我想知道,有没有办法结合这些行动。也许是一个“保存并运行”命令。
感谢您的帮助。
答案 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
的启发
答案 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)
考虑切换到IDLE。 F5可以做到一切。
考虑转换到Komodo。您可以定义命令,以便F5执行所有操作。