如何 "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.
我想指定 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.