【问题标题】:Overriding a remapping from a plugin?覆盖插件的重新映射?
【发布时间】:2012-09-28 00:25:33
【问题描述】:

安装vim-ruby-debugger 后,该插件“劫持”了几个映射。就像<leader>n<leader>t 一样,我分别用于 NERDTreeToggle 和 Command-T 查找。

罪魁祸首在hardcoded mappings in this ruby-debugger

我希望将这些重新映射为<leader>rdX,即:以 *r*uby-*d*ebugger 为前缀。显然,我可以简单地破解插件并更改那里的映射。但这似乎有点太老套了(并且可能会在更新时中断)。

如何取消映射这些映射,以便 vim 再次回退到我自己的映射?这样我就可以重新映射我的 .vimrc 中的命令(它应该在哪里,恕我直言)。

【问题讨论】:

  • 使用 git,git pull 不会让您的更改在合并时消失。
  • 更好,在 github 上 fork 这个存储库,添加自定义映射的可能性(通过将 noremap <leader>b … 更改为 execute 'nnoremap' get(g:, 'ruby_debugger_map_toggle_breakpoint', '<leader>b') '…' 来更快地做到这一点),然后执行拉取请求。随着建议的更改映射将使用g:ruby_debugger_map_toggle_breakpoint 变量进行自定义。
  • 第二种解决方案比使用某种解决方法要好得多(例如将不应覆盖的映射放置到~/.vim/after/plugin/mappings.vim,第一个建议的解决方案或使用某种我的map.maparg ~/.vim/after/plugin/mappings.vim 目录保存,然后map.map 再次映射它们,但要映射到<leader>rd*,使用正常的noremap 命令用于您的NerdTree 插件)。我相信您不是唯一需要自定义映射能力的人。
  • 正如您的链接行所暗示的,如果您在 .vimrc 文件中添加 let g:ruby_debugger_no_maps=1,插件将不会设置映射。

标签: vim remap


【解决方案1】:

首先,我同意 ZyX 的 cmets 认为这是应该修复的插件问题。请插件作者提供自定义。

没有简单的方法来取消映射,因为当映射被覆盖时,Vim 不会记住原始映射。您必须记下原始映射(:map ... 当有问题的插件被暂时禁用时,或在 Vim 脚本中查看它们的定义),然后在有问题的插件之后重新执行它们已加载(减去它可能具有的任何 <unique> 标志,因为这些标志会导致重新执行时出错)。这在.vimrc是做不到的,它是先源码的;我会为此推荐一个像~/.vim/after/plugin/zzzmappings.vim 这样的地方。

【讨论】:

    【解决方案2】:

    我将所有映射保存在 after/plugin/keys.vim 中。这似乎确保它们始终优先于插件映射。 (我用了一堆插件,冲突似乎得到了解决)(here's my nvim config)

    FWIW,我还将文件类型特定的映射保存在同一个文件夹中,但将它们写为带有 <buffer> 关键字的 autocmd FileType 命令。例如,下面是一个与bullets.vimToggleCheckbox函数冲突的映射(如果没有,它会在项目符号中添加一个空复选框)

    autocmd FileType markdown nnoremap <buffer> <expr> <leader>x (getline('.') =~ '^\s*- \[' ? ':ToggleCheckbox<cr>' : '0/-<space><cr>la[<space>]<space><esc>')
    

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 2012-02-20
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-08
      • 2018-11-10
      • 2021-06-10
      相关资源
      最近更新 更多