如何 "rewrite" 现有 vim 键绑定?

How to "rewrite" existing vim key bindings?

我想指定 CTRL+L 去下一个选项卡 (:tabnext)。我把它放在 ~/.vimrc:

nmap <c-l> :tabnext<CR>

它运行良好,但我遇到了一个情况,当我在多个 windows 上分屏时它不起作用。 CTRL+L 似乎与默认分配的“重绘屏幕”动作冲突。例如,当我在中心按下 CTRL+L 时 window 我什么也得不到(见屏幕截图):

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

我从终端使用 vim。

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

如果您看一下 :help netrw-ctrl-l,您会发现它不仅仅是重绘 - 它还会刷新目录。所以它是从插件映射的,仅覆盖 netrw windows 的默认 ctrl-l 映射。

如果您在 window 中执行 :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 的脚趾。

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