将vim命令行执行映射到键

时间:2018-02-16 17:27:42

标签: vim

因此我使用的很多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时,这可以摆脱错误,但它仍然没有进入我的剪贴板。

1 个答案:

答案 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>