因此我使用的很多subversion repos都有一个格式化的第一行需要成为提交的一部分,否则它将被拒绝。我想在vim中映射一个键来进行" svn log --limit 1",找到该行,并将其粘贴到当前光标位置下,以便我写一个提交消息(通过svn commit
)。
我发现这个网站提供了一个很好的命令:link
从vim内部,如果我执行:r !svn log --limit 1 | grep something
,我想从subversion日志中获取的确切行将被粘贴到光标下。这完全是我想要发生的事情。
但是,如果我尝试将其映射到我的.vimrc中的键(F9),它就不起作用了。这是一行:
map <F9>:r !svn log --limit 1 | grep something
但是,每次打开vim时,我都会看到以下内容,而不是工作:
$vim
!grep -n mystring /dev/null | tee /tmp/<random chars>
Press ENTER or type command to continue
不确定我做错了什么,或者如何将该命令映射到密钥。
编辑:显然我需要做的一件事就是逃避管道角色。映射现在变为
map <F9>:r !svn log --limit 1 \| grep something
当我启动vim时,这可以摆脱错误,但它仍然没有进入我的剪贴板。
答案 0 :(得分:3)
答案其实非常简单。 bar命令将两个不同的命令分隔到同一行。您的意图是
map <F9> --> ":r !svn log --limit 1 | grep something"
但你得到的是
"map <F9>:r !svn log --limit 1" | "grep something"
因此,它运行两个不同的命令,映射和grep命令。要解决此问题,只需在映射中使用\|
。
现在,您的命令还有其他一些问题:
由于<F9>:r
中没有空格,vim会将<F9>:r
映射到!svn log...
,而不是将<F9>
映射到:r !svn...
。这可以通过添加空格来修复。
除非您在最后添加<cr>
,否则实际上不会运行该命令。
使用nnoremap
代替map
是一种很好的形式。这样可以防止映射冲突。
将所有这些建议放在一起,你应该使用的最后一个命令是
nnoremap <F9> :r !svn log --limit 1 \| grep something<cr>