2012-08-22 69 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

相關問題