题 VIM:同时保存并运行?


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

谢谢你的帮助。


33
2018-03-02 01:54


起源


你能看看我的回答吗?我认为它正确回答了你的问题。 - Douglas Mayle


答案:


选项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节非常有用。


25
2018-03-02 02:27



有关文件名,请参阅展开选项。我认为expand(“%:p”)会为你提供文件名。 - Caleb Huitt - cjhuitt
刚刚测试过。效果很好。将“map <F5> <Esc>:w <CR>:!%:p <CR>”添加到您的vimrc(不带引号)。 - bernie


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

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

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


52
2018-03-06 16:10



一体化命令。这是我要寻找的答案,而不是脚本或映射。我不知道 | 用于链接命令。谢谢! - dwerner


使用 autowrite 选项:

:set autowrite

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


11
2018-03-02 13:15





命令组合似乎可以解决 | 字符,所以也许像别名 :w|!your-command-here 一个独特的组合键?


5
2018-03-02 02:00





干得好:

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

保存并运行 (你必须处于n模式 - 只需添加esc和a for i模式)


5
2018-03-02 02:41



对于x位设置和的python脚本 #!/bin/bash/env python 作为第一行, map <F1> <Esc> :w<CR> :!./%<CR> 在$ HOME / .vimrc中运行正常。 (map或nmap,F1或其他)。 - lllluuukke


另一种可能性

au BufWriteCmd *.py write | !!

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


4
2018-06-29 08:33





这就是我放入我的内容 .vimrc 并且像一个魅力

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

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

例如:

:!node ./test.js

2
2017-08-31 05:58





在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


2
2017-10-12 15:18



实际上,这个答案更像IDE一样的答案。现代IDE不会在“运行”之前保存文件。我赞成这一个。 - minion


我从vim提示维基得到以下内容:

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


1
2018-03-02 11:58





尝试在Bash中进行。

在调用C文件的情况下 t.c,这很方便:

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

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

对于Python,这可能更容易:

vi t.py && python t.py

0
2017-09-01 02:05