我试图在vim中进行键映射,(a)保存当前文件(b)执行git操作,使用shell(c)退出当前的vim编辑器。
我已经尝试了以下方法,但仍无法弄清楚。
方法1 - 在Vim命令行中
:w | !git commit -am "auto" | q
方法2 - 在.vimrc中
map :W :w \| !git commit -am "auto"
map :L :Wq
问题
问题是管道|
只能用于附加shell命令。我该怎么做'a Vim command' + 'a shell command' + 'a Vim command'
?如何在shell命令后管道vim命令?
答案 0 :(得分:2)
您需要分别执行这三个命令。这是<CR>
的用途:
nnoremap <key> :w<CR>:!git commit -am "auto"<CR>:qa<CR>
答案 1 :(得分:1)
您是否尝试过vim-fugitive?
您可以使用该插件 git commit -am ,然后添加您的git命令。
所以你会写一些类似的东西:
Gcommit -am "auto"
我简要测试了一下。我把它放到我的.vimrc中:
function! CommitAndQuit()
execute "Gcommit -am 'auto'"
execute "q"
endfunction
然后输入:call CommitAndQuit()
,它会做你想要的。
答案 2 :(得分:1)
当我到达这里时,这感觉很相关!
因此,如果您想在命令中绑定它,您将无法使用<cr>
,管道也将无效。
在这种情况下,正确的做法是使用一个函数,只需从该命令调用该函数。
在这个例子中,我有一个shell脚本来grep一些日志文件的错误,并将结果输出到.errors,然后在quickfix中打开。重绘是因为静音会使用外部命令混淆你的屏幕!
function! ReadErrors()
silent !read-errors
redraw!
cfile .errors
endfunction
command! ReadErrors call ReadErrors()
答案 3 :(得分:0)
A&#39; |&#39;在{cmd}中传递给shell,您不能使用它来附加Vim命令。见|:bar |。
答案 4 :(得分:0)
我在这里看到3种情况:
如果要添加新的vim命令,以便键入:W
将写入缓冲区,执行git commit和退出vim,则需要遵循JonnyRaa的回答。即,定义一个函数,然后定义执行该函数的命令:
function! WriteCommitAndQuit()
w
silent !git commit -am "auto"
q
endfunction
command! W WriteCommitAndQuit()
注意:
:
进入命令行模式后直接执行。silent
来避免出现“按Enter或键入命令以继续”的提示。write
和quit
而不是w
和q
,以获得更好的代码。 (相反,如果您急忙将silent
缩短为sil
……)如果您只想按一个键即可运行这些命令,则需要添加一个映射,将shell命令放在中间的技巧是使用<CR>
模拟按下ENTER键:
map <F10> :w<CR>:silent !git commit -am "auto"<CR>:q<CR>
注意:
:
并直接键入来执行。silent
来代替<CR>
。有时候,您需要重复执行一系列命令,但是值得一提的是,将它们暂存到vimrc中是不重要的,因为它们是临时的,将来将不再有用。在这种情况下,我只执行该行,然后依靠向上箭头将该行再次从历史记录中移出并执行它。 在这种情况下,技巧是使用Ctrl-V,Ctrl-J在命令中间添加转义的LF字符:
:w | silent !git commit -am "auto" ^@ q
注意:
^@
是我按Ctrl-V,Ctrl-J时显示的内容。如果您按下Shift-6,Shift-2,将无法使用。但是,如果按Ctrl-Shift-2,它似乎确实起作用。]
是美国广播公司(ABC)的第27个字母。答案 5 :(得分:-1)
我使用此命令将当前文件路径复制到系统剪贴板。
map <silent> <leader>vv :echo expand('%:p') \| !syscopy.sh <cr>