2011-12-25 7 views
1

特定の状況で "K"の動作を変更しようとしていますが、他のすべての機能で元の機能を維持しようとしています。ここで私は機能にKを使用するので、それが再マッピングの結果として、Kの新しいマッピングが使用されていると呼ばれていたときに、しかし、私の失敗した特定の状況でマッピングの動作を変更し、他のすべての機能を再利用

function! GetDocumentation() 
    if &filetype == 'java' 
     JavaDocSearch 
    else 
     normal K 
    endif 
endfunction 

nnoremap K :call GetDocumentation()<CR> 

だ、と私は無限再帰を取得します。私は何とか関数の要点をnnoremap行に適合させることができたと思いますが、それは扱いにくいように見えます。キーの元のマッピングを強制的に使用するのが良いでしょう。

希望します。

ありがとうございました。

答えて

3

なし:normalコマンド!修飾子-としてそれはノーマルモードが 考慮に取っマッピングをコマンドとして その引数を関数は、実行中に使用されています。このため、デフォルトのハンドラをオーバーライドしたマッピングを実行するのは、

 normal K 

です。だから、

 normal! K 
2

、次のように行を変更し、コマンドをシャドウイング@ibを マッピングを無視します。あなたはここに:normal!を使用しているはずです。しかし、機能が過剰です:次の式マッピングは十分です:

nnoremap <expr> K ((&filetype is# "java")?(":JavaDocSearch\n"):("K")) 

このマッピングが原因noreに自分自身をトリガしても、8つのライン短いません。

+0

ありがとうございます!この方法を念頭に置いておきます。 –

+0

不要なかっこが多すぎると、表現の美しさが損なわれます。この場合、それらはすべてシームレスに削除できます: ':nnoremap K&ftは# 'java'ですか? ":JavaDocSearch \ n": "K"です。 –

+0

@ b。これらの括弧は、オペレータの優先順位の違いを覚えていない限り、異なる言語でプログラムを書くことができます。主なアイデアは、「追加の括弧は傷つけることはできませんが、できることはありません」です。 – ZyX

関連する問題