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

Tim*_*nov 3 vim vim-tabular

我想分配CTRL+L转到下一个选项卡 ( :tabnext)。我把它放在~/.vimrc

nmap <c-l> :tabnext<CR>
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

但是,当我在左侧或右侧窗口上按相同的按钮时,它工作正常.. 我想我需要“重写”默认操作,不是吗?

我从终端使用 vim。

Ama*_*dan 7

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

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

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

if !hasmapto('<Plug>NetrwRefresh')
 nmap <buffer> <unique> <c-l> <Plug>NetrwRefresh
 imap <buffer> <unique> <c-l> <Plug>NetrwRefresh
endif
Run Code Online (Sandbox Code Playgroud)

也就是说,如果<Plug>NetrwRefresh没有绑定到任何东西,那么 bind <c-l>。这提供了一个简单的解决方案:因为netrw.vim与其他所有内容一样,是在 之后加载的.vimrc,如果您将这些映射定义为某个其他键,则不会将它们分配给<c-l>,并且您的映射也不会被覆盖。所以只需在您的.vimrc

 nmap <unique> <c-r> <Plug>NetrwRefresh
Run Code Online (Sandbox Code Playgroud)

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