2012-08-22 36 views
3

我开始使用与我现有地图冲突的插件,但不是重新映射所有地图,而只是添加前缀。我以为我可以用LocalLeader做到这一点。你可以针对不同的Vim插件使用不同的localleaders吗?

Vimdoc说:

<LocalLeader>就像<Leader>,除了它使用 设置 “maplocalleader”,而不是把 “mapleader”。 <LocalLeader>将被用于 用于缓冲区本地的映射。

似乎设置localleader的唯一方法就是设置一个全局变量(文档不提到这一点,但b:maplocalleader没有工作):

let maplocalleader = '\\' 

而且我不看看我会干净地取消设置该变量(一个autocmd,清除后,插件安装!?)

有没有办法做到这一点?或者是LocalLeader只提供一个全局前缀和一个文件类型专用前缀?

回答

3

你最后的预感是正确的。如果插件使用<Leader>(并且它应该除非它是一个文件类型插件),那么在与maplocalleader混淆时就没有用处。

重映射通过<Plug>映射正规化完成,插件希望提供映射。一些插件确实定义了很多类似的映射,其中一些定义了g:pluginname_mappingprefix(或者以上)变量,以免您必须单独重映射所有映射。如果你的插件没有,也许写插件作者的建议/补丁。

+0

所以在我的情况下,我不得不要求插件作者添加指定自定义前缀的能力? (我想如果他们保存当前值,设置配置的值并在完成时恢复保存的值,他们可以使用LocalLeader来执行此操作。) – idbrii

+1

如果有''映射,插件(您的名字不要告诉我们)不需要改变,对于很多映射来说这是单调乏味的。一个自定义的前缀更像是' c'或',c';正如我所说的,LocalLeader是用于缓冲区本地映射的。 –

+0

该插件是vimclojure。 – idbrii

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。对于一些写得不好的插件(我的意思是那些在源代码时发出错误的插件)将放在:try块中将会在发生错误的地方中断执行。不过大部分时间都不应该发生。您可能还想使用*/ftplugin/plugin-name.vim作为模式,而不是plugin-name.vim

相关问题