我想分配CTRL+L转到下一个选项卡 ( :tabnext)。我把它放在~/.vimrc:
nmap <c-l> :tabnext<CR>
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是当我在多个窗口上分屏时,我遇到了它不起作用的情况。似乎CTRL+L与默认分配的“重绘屏幕”操作冲突。例如,当我在中央窗口按下CTRL+L时,我什么也得不到(见截图):
但是,当我在左侧或右侧窗口上按相同的按钮时,它工作正常.. 我想我需要“重写”默认操作,不是吗?
我从终端使用 vim。
如果我没记错的话,中间的窗口是 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 的脚趾。