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

4

我希望将CTRL+L指定为下一个标签页(:tabnext)。我将它放在了~/.vimrc文件中:

nmap <c-l> :tabnext<CR>

它可以正常工作,但是当我将屏幕分割成几个窗口时,我遇到了一个问题,它无法正常工作。似乎CTRL+L与默认情况下分配的“重绘屏幕”操作发生冲突。例如,当我在中心窗口上按下CTRL+L时,什么都不会发生(请参见截图):

enter image description here

但是,当我在左侧或右侧窗口上按下相同的键时,它可以正常工作。 我认为我需要“重新编写”默认操作,对吗?

我使用终端中的vim。


我认为更可能的情况是管理中心窗口的插件执行了自己的 nmap <c-l>,并覆盖了你的绑定(因为插件是在 .vimrc 之后执行的)。检查插件是否有配置变量可以防止绑定;如果没有,你可能需要编辑插件以删除绑定,或将你的绑定放在稍后执行的文件中。 - Amadan
我没有使用任何自定义插件,只是在Ubuntu中默认安装的Vim 7.4。 - Timur Fayzrakhmanov
我不太懂Vim,使用不到一周,请您能详细解释一下您的意思吗? - Timur Fayzrakhmanov
2个回答

10

如果我没看错的话,中间的窗口是 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的脚


现在我的.vimrc文件中有以下内容:nmap NetrwRefresh nmap :tabnext nmap :tabprevious但它仍然无法工作。我做错了什么? - Timur Fayzrakhmanov

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接