0

也许这违背了 VI 的传统禅意,但是当谈到在 Vi 中使用重新绑定键时,我感到非常不知所措,特别是什么可以/不能绑定。自从迁移到 nvim 并使用可视模式进行选择/复制/粘贴,以及在插入模式下不再能够访问 Home/End 以跳转到行的开头/结尾以来,我一直特别头疼。

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

4

2 回答 2

2

你真的不能这样做。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 安装,并且您的映射不会比默认映射“更好”。

于 2016-03-24T18:10:27.883 回答
1

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

set all&

但是您实际上不能希望使用单个命令“取消绑定”“默认绑定”,因为:

  • 它们不是“绑定”,它们是“命令”,
  • 反正没有这样的命令。

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

于 2016-03-24T17:59:35.187 回答