也许这违背了 VI 的传统禅意,但是当谈到在 Vi 中使用重新绑定键时,我感到非常不知所措,特别是什么可以/不能绑定。自从迁移到 nvim 并使用可视模式进行选择/复制/粘贴,以及在插入模式下不再能够访问 Home/End 以跳转到行的开头/结尾以来,我一直特别头疼。
我在想解决这个问题的方法,就像我对我的 tmux 配置所做的那样,发出一个命令来取消绑定我的 vimrc 中的所有键,然后重新绑定它们。这样,就不会混淆什么是绑定,并且我可以随时轻松更改和引用更改。我对这一切都错了吗?
你真的不能这样做。Vim 对待“内置映射”不同于“用户定义的映射”。您不能真正“取消映射”内置映射。
从技术上讲,它将内置映射存储在不同的 C 结构中,而不是使用:map
. 当你这样做时:unmap
,它只是将它从用户定义的结构中删除(顺便说一下,我在上周的How to find out a key is mapped to what? at vi.SE 中简要但不完整地概述了它的工作原理)。
你唯一能做的就是:
" Remap all ascii characters; everything below 33 is a control character
for i in range(33, 127)
" | needs some extra love
if i == 124 | continue | endif
execute 'nnoremap ' . nr2char(i) . ' <Nop>'
execute 'nnoremap <C-' . nr2char(i) . '> <Nop>'
endfor
" The above won't remap stuff like `<F1>`, `<Up>`
nnoremap <Bar> <Nop>
nnoremap <F1> <Nop>
nnoremap <Up> <Nop>
" ... etc ... You can use a loop for this as well...
" Now make our own mappings
nnoremap : :
" ...etc...
对于vnoremap
, 等也是如此,但这不会重新映射<C-w><C-w>
,gJ
等,因此您需要为此添加更多例外(这些映射的“第二个键”甚至不在结构中,而是switch
/ case
!)
然而。不要这样做。因为现在依赖于你的 vimrc,你也只有你能理解。只需学习默认映射。这意味着您可以使用任何开箱即用的 Vim 安装,并且您的映射不会比默认映射“更好”。
您可以将此行放在顶部附近,vimrc
以将所有选项重置为其默认值:
set all&
但是您实际上不能希望使用单个命令“取消绑定”“默认绑定”,因为:
您可以将每个默认命令重新映射到<nop>
( :help <nop>
) ,但这听起来像做很多工作却收效甚微。