你能为不同的Vim插件提供不同的本地读者吗?

时间:2012-08-22 15:14:09

标签: vim plugins vim-plugin

我开始使用与现有地图冲突的插件,但我只是想添加一个前缀,而不是重新映射它的所有地图。我以为我可以用LocalLeader做到这一点。

Vimdoc说:

  

<LocalLeader>就像<Leader>一样,只是它使用了   “maplocalleader”而不是“mapleader”。 <LocalLeader>将被使用   对于缓冲区本地的映射。

似乎设置localleader的唯一方法是设置一个全局变量(文档不提这个,但b:maplocalleader不起作用):

let maplocalleader = '\\'

而且我没有看到我如何干净地取消设置该变量(在设置插件后清除它的autocmd!)

有办法做到这一点吗?或者LocalLeader只提供一个全局前缀和一个特定于文件类型的前缀?

2 个答案:

答案 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