首页 > 解决方案 > 使用插件重新映射之间的冲突

问题描述

我目前正在使用NERD 评论器插件来定义允许我注释/取消注释代码块的某些映射。默认映射之一是:

[count]<leader>c<space>切换选定行的注释状态。如果最上面的选定行被注释,则所有选定的行都被取消注释,反之亦然。( NERDCommenterToggle)

我已经使用nmap <C-_> <plug>NERDCommenterToggle和重新映射了这个选项vmap <C-_> <plug>NERDCommenterToggle

我的意图是在正常和可视模式下使用<C-_>.

发生冲突是因为我将空格键设置为我的领导键,并且我还将它设置为折叠的重映射:nnoremap <space> za

当我将所有这些放在一起.vimrc按时<C-_>折叠文档的一部分,如果它是“可折叠的”,否则它会切换评论。

我能想到的唯一原因是,在幕后,<C-_>仍然调用插件的默认映射,因为它包含映射到空格键的前导键,所以折叠代码。

我对 vimscript 没有那么深入,所以我不知道这是否是预期的行为,但在我看来很奇怪,即使我重新映射了NERDCommenterToggle命令,它仍然调用默认映射。我的印象是<plug>使用手柄来避免此类问题。

如果这确实是预期的行为,有没有办法在NERDCommenterToggle不与原始映射冲突的情况下创建映射?

编辑:

我删除了我的领导密钥到空间的映射,问题仍然存在,这对我来说没有任何意义。基本上现在我有地图:

并且由于某种原因,它们相互干扰,按下“control + /”(<C-_>)会触发折叠地图。

标签: vimvim-plugin

解决方案


背景

映射的全部意义在于<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>映射仍然存在并且您的领导者是<Space>,因此您一定会发现冲突。

A计划

禁用插件定义默认映射的能力:

let g:NERDCreateDefaultMappings = 0

按照:help NERDCreateDefaultMappings。这使您可以控制,因此您可以从提供<Plug>的映射中自由构建所需的任何映射,而不会妨碍默认映射。

B计划

请注意,在技术上也可以通过以下方式“取消映射”该讨厌<Leader>c<Space>的映射:

nunmap <Leader>c<Space>

但是插件在你的来源之后vimrc定义了它的默认映射,所以你不能简单地将上面的行添加到你的vimrc,因为它会a)抛出一个错误,因为目标映射当时不存在,并且b)没有做任何有用的事情反正。使用该方法有效地打开了相当多的蠕虫罐,所以我推荐计划 A。


推荐阅读