我目前正在使用 NERD commenter plugin定义某些映射,允许我注释/取消注释代码块。默认映射之一是:
[count]<leader>c<space>
Toggles the comment state of the selected line(s). If the topmost selected line is commented, all selected lines are uncommented and vice versa.(NERDCommenterToggle
)
我已使用 nmap <C-_> <plug>NERDCommenterToggle
重新映射了此选项和vmap <C-_> <plug>NERDCommenterToggle
我的目的是使用 <C-_>
在正常和可视模式下在注释和未注释之间切换.
出现冲突是因为我将空格键设置为我的前导键,并且还将其设置为折叠的重新映射:nnoremap <space> za
.
当我把所有这些放在我的 .vimrc
上时按<C-_>
如果文档的部分是“可折叠的”,则折叠该部分,否则切换注释。
我能想到发生这种情况的唯一原因是,在幕后,<C-_>
仍然调用插件的默认映射,因为它包含映射到空格键的前导键,所以正在折叠代码。
我对 vimscript 不太了解,所以我不知道这是否是预期的行为,但在我看来很奇怪,即使我已经重新映射了 NERDCommenterToggle
命令,它仍然调用默认 map 。我的印象是<plug>
使用句柄来避免此类问题。
如果这确实是预期的行为,有没有办法创建到 NERDCommenterToggle
的映射不会与原始映射冲突吗?
编辑:
我删除了领导者 key 到空间的映射,但问题仍然存在,这对我来说没有任何意义。基本上现在我有了 map :
-
nmap <C-_> <plug>NERDCommenterToggle
-
nnoremap <space> za
由于某种原因,它们相互干扰,按下“control +/”( <C-_>
)会触发折叠 map 。
最佳答案
背景
<Plug>
的全部要点映射为插件开发人员提供了一种干净的方式,让最终用户可以创建自己的映射,而无需调用内部函数等。该界面的一些好处是:
- 最终用户易于使用,
- 可以在不影响最终用户的情况下更改实现,
- 简化文档,
- 碰撞预防,
- 等等
理想情况下,插件开发人员应该仅公开<Plug>
映射,如果只是为了防止与其他第三方插件或最终用户的其他映射发生冲突。但这完全留给开发人员:使用 <Plug>
绝不会产生任何影响。最终用户的映射会阻止插件开发人员创建自己的默认映射。
问题
在本例中,作者选择创建开箱即用的默认映射( g:NERDCreateDefaultMappings
设置为 1
)以及其 <Plug>
等价物。这使得同一个功能有两个映射(更多,实际上是因为模式,但让我们保持简单):
nnoremap <Plug>NERDCommenterToggle :call nerdcommenter#Comment("nx", "Toggle")'
nmap <Leader>c<Space> <Plug>NERDCommenterToggle
向其中添加第三个:
nmap <C-_> <plug>NERDCommenterToggle
由于默认<Leader>c<Space>
map 还在,你的领导是 <Space>
,你一定会发现冲突。
A计划
禁用插件定义默认映射的能力:
let g:NERDCreateDefaultMappings = 0
根据:help NERDCreateDefaultMappings
。这让您可以掌控一切,因此您可以自由地从提供的 <Plug>
构建您需要的任何映射。没有默认映射妨碍的映射。
B计划
请注意,从技术上讲,也可以“取消映射”那个讨厌的 <Leader>c<Space>
映射为:
nunmap <Leader>c<Space>
但是该插件在您的 vimrc
之后定义了其默认映射已获取,因此您不能简单地将上面的行添加到您的 vimrc
中因为它会 a) 抛出错误,因为当时目标映射不存在,b) 无论如何都不做任何有用的事情。有效地使用该方法会引发大量蠕虫,因此我推荐 A 计划。
关于vim - 使用插件的重新映射之间的冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69809603/