vim - 使用插件重新映射之间的冲突
问题描述
我目前正在使用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
不与原始映射冲突的情况下创建映射?
编辑:
我删除了我的领导密钥到空间的映射,问题仍然存在,这对我来说没有任何意义。基本上现在我有地图:
nmap <C-_> <plug>NERDCommenterToggle
nnoremap <space> za
并且由于某种原因,它们相互干扰,按下“control + /”(<C-_>
)会触发折叠地图。
解决方案
背景
映射的全部意义在于<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。
推荐阅读
- c# - 使用 IS_MEMBER 在 Windows 窗体应用程序中测试权限有什么问题?
- javascript - 如何更新 JSON 文件的键值?
- python - 具有图输入和图输出的图神经网络
- java - 将 AnnotatedElement 转换为类类型
- google-apps-script - 为什么脚本的结果中有 AM 或 PM?
- c++ - 如何在类之外定义函数
- regex - 用于获得最多 2 级路径的正则表达式
- javascript - 当ul为空添加li标签时如何将jquery转换为React JS?
- reactjs - 在 React Native Expo 中为 App 组件创建包装器
- c++ - 使用 cmake 将第三方共享库(*.so)集成到多个项目中