5

既存のマップと競合するプラグインの使用を開始しましたが、すべてのマップを再マップする代わりに、プレフィックスを追加したいだけです。LocalLeaderでこれができると思いました。

Vimdoc は次のように述べています。

<LocalLeader><Leader>「mapleader」の代わりに「maplocalleader」を使用する点を除いて、 と 同じです。<LocalLeader>バッファに対してローカルなマッピングに使用されます。

localleader を設定する唯一の方法は、グローバル変数を設定することのようです (ドキュメントではこれについて言及されていませんが、b:maplocalleader機能しませんでした):

let maplocalleader = '\\'

そして、その変数をきれいに設定解除する方法がわかりません(プラグインのセットアップ後にそれをクリアするautocmd!?)

これを行う方法はありますか?それとも、LocalLeader は 1 つのグローバル プレフィックスと 1 つのファイルタイプ固有のプレフィックスを与えるだけですか?

4

2 に答える 2

3

あなたの最後の勘は正しいです。プラグインが使用する場合(ファイルタイプのプラグインでない限り使用する必要があります<Leader>)、.maplocalleader

<Plug>再マッピングは、プラグインがうまくいけば提供するマッピングを介して標準的に行われます。一部のプラグインは多くの同様のマッピングを定義しますが、それらのいくつかはg:pluginname_mappingprefix(またはそのような) 変数を定義して、すべてのマッピングを個別に再マッピングする必要がないようにします。プラグインがそうでない場合は、プラグインの作成者に提案/パッチを書いてください。

于 2012-08-22T15:35:26.237 に答える
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('_')

inは、プラグインがソースされた後SourceCmdに復元する唯一の方法ですが、ここでのイベントは、内部でソースされたファイルに対して起動されません。一部の不適切に作成されたプラグイン (つまり、ソース中にエラーを発生するプラグイン)の場合、ブロック内に配置すると、エラーが発生した時点で実行が中断されます。ただし、ほとんどの場合は発生しないはずです。の代わりにパターンとして使用することもできます。maplocalleaderSourceCmdplugin-name.vim:source:try*/ftplugin/plugin-name.vimplugin-name.vim

于 2012-08-22T16:37:51.497 に答える