如何“重写”现有的vim键绑定?

时间:2015-10-26 16:48:16

标签: vim vim-tabular

我想指定 CTRL + L 转到下一个标签(:tabnext)。我把它放在~/.vimrc

nmap <c-l> :tabnext<CR>

它工作正常,但是当我在几个窗口上分割屏幕时,我遇到了一个不起作用的情况。似乎 CTRL + L 与默认分配的“重绘屏幕”操作冲突。例如,当我在中心窗口按 CTRL + L 时,我什么也得不到(见截图):

enter image description here

然而,当我在左侧或右侧窗户上按下它时,它工作正常.. 我想我需要“重写”默认动作,不是吗?

我在终端使用vim。

2 个答案:

答案 0 :(得分:4)

如果我没有弄错的话,中间的窗口是netrw(Vim的文件管理标准插件)。它不是一个自定义插件,但它仍然是一个插件。

如果您查看:help netrw-ctrl-l,您会发现它不仅仅是重绘 - 它还会刷新目录。因此它从插件映射,仅覆盖netrw窗口的默认ctrl-l映射。

如果在该窗口中执行:verbose nmap <c-l>,您将在Vim安装的autoload/netrw.vim文件中看到它的确切位置:在那里,我们找到了这个片段:

if !hasmapto('<Plug>NetrwRefresh')
 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
endif

其中说,如果<Plug>NetrwRefresh未绑定任何内容,则绑定<c-l>。这提供了一个简单的解决方案:由于netrw.vim与其他所有内容一样,在.vimrc之后加载,如果您将这些映射定义为其他键,则不会将其分配给<c-l> ,并且不会覆盖您的映射。所以,只需在.vimrc

中执行此操作即可
 nmap <unique> <c-r> <Plug>NetrwRefresh

然而,更好的方法是不要踩到Vim的脚趾。

答案 1 :(得分:1)

Netrw v155a(参见http://www.drchip.org/astronaut/vim/index.html#NETRW)通过不同地映射ctrl-L解决了这个问题;它现在调用(未重新映射)ctrl-L作为其刷新的一部分。因此,即使在netrw窗口中,ctrl-L也可以刷新所有窗口。