我开始使用与现有地图冲突的插件,但我只是想添加一个前缀,而不是重新映射它的所有地图。我以为我可以用LocalLeader做到这一点。
Vimdoc说:
<LocalLeader>
就像<Leader>
一样,只是它使用了 “maplocalleader”而不是“mapleader”。<LocalLeader>
将被使用 对于缓冲区本地的映射。
似乎设置localleader的唯一方法是设置一个全局变量(文档不提这个,但b:maplocalleader
不起作用):
let maplocalleader = '\\'
而且我没有看到我如何干净地取消设置该变量(在设置插件后清除它的autocmd!)
有办法做到这一点吗?或者LocalLeader只提供一个全局前缀和一个特定于文件类型的前缀?
答案 0 :(得分:3)
你的最后一次预感是正确的。如果该插件使用<Leader>
(除非它是一个文件类型插件,否则它应该被删除),对于弄乱maplocalleader
没有用。
通过<Plug>
映射规范地重新映射,插件有望提供。一些插件确实定义了许多类似的映射,其中一些定义了一个g:pluginname_mappingprefix
(或左右)变量,以避免必须单独重新映射所有映射。如果您的插件没有,可以写一个建议/补丁给插件作者。
答案 1 :(得分:2)
虽然@IngoKarkat解决方案是首选解决方案,但有一个黑客可以让你做你想做的事:SourcePre
事件:
autocmd SourcePre * :let maplocalleader='\\'
autocmd SourcePre plugin-name.vim :let maplocalleader='_'
。这也适用于<Leader>
。有很多情况虽然这不起作用。您也可以使用SourceCmd
来完成这项工作,使用
function s:Source(newmll)
try
let oldmll=g:maplocalleader
let g:maplocalleader=a:newmll
source <amatch>
finally
let g:maplocalleader=oldmll
endtry
endfunction
let maplocalleader='\\'
autocmd SourceCmd plugin-name.vim :call s:Source('_')
SourceCmd
中的是我看到在插件获取后恢复maplocalleader
的唯一方式,但SourceCmd
事件不会针对plugin-name.vim
内的任何文件启动。对于一些编写得不好的插件(我的意思是,那些在源处发出错误的插件)将:source
置于:try
块内将会在发生错误时中断执行。不过大部分时间都不应该发生。您可能还希望使用*/ftplugin/plugin-name.vim
作为模式,而不是plugin-name.vim
。