我经常使用Python进行快速模拟,需要不断地保存(:w),然后运行(:!!)。有没有一种方法可以将这两个操作组合起来?
也许可以使用“保存并运行”命令。
好的,最简单的方法是使用管道命令。它允许您在同一行上运行多个命令行命令。在您的情况下,这两个命令是写入 `w` 和执行当前文件 `!%:p`。如果您有一个特定的命令用于运行当前文件,则第二个命令变为,例如`!python %:p`。因此,对于您的问题,最简单的答案如下:
:w | ! %:p
^ ^ ^
| | |--Execute current file
| |--Chain two commands
|--Save current file
最后需要注意的一点是,并非所有命令都可以被链接在一起。根据Vim文档所述,某些命令接受一个管道作为参数,因此会中断链式操作...
|
用于链接命令。谢谢! - dwerner选项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节非常有用。
使用autowrite选项:
:set autowrite
如果文件已被修改,在每个 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^ 命令中,将文件的内容写入。
Here you go:
:nmap <F1> :w<cr>:!%<cr>
保存并运行(您必须处于n模式中 - 只需添加esc和一个for i模式)。
#!/bin/bash/env python
的Python脚本,在$HOME/.vimrc中使用map <F1> <Esc> :w<CR> :!./%<CR>
可以正常工作(map或nmap,F1或其他键)。 - lllluuukke命令组合似乎可以通过 |
字符实现,因此可以将类似于 :w|!your-command-here
的别名绑定到一个独特的按键组合上。
另外一种可能性:
au BufWriteCmd *.py write | !!
运行
,但这可能并不是您想要的。# 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>
#!! 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, and the second redirects the selected cmdline range (here dot .,
which mean current line) to external command (here 'python').
命令行范围,请参见
:h cmdline-ranges
:h command-range
这是受到从Vim中执行当前行的Bash命令启发而来的。
这是我放在我的.vimrc
文件中的代码,可以完美地工作:
nnoremap <leader>r :w<CR>:!!<CR>
:!node ./test.js
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
map <F9> :w:Shell python %<cr><c-w>
尝试在Bash中完成它。
对于名为t.c
的C文件,这非常方便:
vi t.c && cc t.c -o t && ./t
符号(&&
)确保一个错误消息会中断命令链。
对于Python来说,这可能更容易:
vi t.py && python t.py