在 vimrc 中包含所有默认绑定?

Include all default binds in vimrc?

也许这违背了 VI 的传统理念,但在 Vi 中使用重新绑定键时,我感到非常不知所措,尤其是 can/cannot 绑定的内容。自从使用视觉模式 selecting/copying/pasting 转移到 nvim 以来,我感到特别头疼,并且在插入模式下不再能够访问 Home/End 以跳转到一行的 beginning/end 。

我在想解决这个问题的方法,就像我对我的 tmux 配置所做的一样,是发出一个命令来取消绑定我的 vimrc 中的所有键,然后重新绑定它们。这样,就不会混淆什么是绑定,而且我可以随时轻松更改和引用更改。我做错了吗?

您可以将此行放在 vimrc 的顶部附近,以将所有 选项 重置为其默认值:

set all&

但是你不能现实地希望 "unbind" 使用单个命令 "default bindings" 因为:

  • 他们不是"bindings",他们是"commands",
  • 反正没有这样的命令。

您可以将每个默认命令重新映射到 <nop> (:help <nop>),但这听起来像是做了大量工作却收效甚微。

你真的做不到。 Vim 对待 "built-in mappings" 不同于 "user-defined mappings"。你真的不能 "unmap" 内置映射。

从技术上讲,它将内置映射存储在与使用 :map 定义的用户定义映射不同的 C 结构中。当您执行 :unmap 时,它只是将其从用户定义的结构中删除(顺便说一下,我上周在 How to find out what a key is mapped to? 的 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 等,因此您需要为此添加更多例外(这些映射的 "second key" 甚至不在结构中,而是 switch/case!)

不过。 不要这样做。因为现在依靠你的vimrc,你和只有你能理解。只需学习默认映射。这将意味着您可以使用任何开箱即用的 Vim 安装,并且您的映射不会比默认映射 "better" 多多少少。