2011-08-04 3 views
7

次のような方法がありますか?Vimスクリプトで2つのカスタム関数を使用する方法はありますか?

command! -nargs=* -complete=customlist,CustomFunc1 -complete=customlist,CustomFunc2 Foo call MyFunction(<f-args>) 

VimのCMDラインから関数fooを呼び出すときに、ユーザーはタブの完全2つの引数にできるようになります。自動補完は、2つの異なるリストから引き出されます。

<TAB>を押す

:Foo arg1 good<TAB> whi<TAB> 

は言葉を完了します。

:Foo arg1 goodyear white 

答えて

7

引数が であるため、補完機能に十分な情報が渡されています。コマンドラインの現在のカーソル位置が であることがわかっている場合は、現在編集中の の引数の数を調べることができます。ここでは、その番号を という唯一の補完候補として返す関数です。

" Custom completion function for the command 'Foo' 
function! FooComplete(arg, line, pos) 
    let l = split(a:line[:a:pos-1], '\%(\%(\%(^\|[^\\]\)\\\)\@<!\s\)\+', 1) 
    let n = len(l) - index(l, 'Foo') - 1 
    return [string(n)] 
endfunction 

(彼らはすでに書かれている場合) 特定の引数を完了関数のいずれかを呼び出して、最後の行に置き換えます。これらの範囲の限界、又はカウント(スペースの両方で許可 ある)、場合かもしれないので、 コマンド名の前に空白で区切られた単語を無視する必要があること、例えば、

let funcs = ['FooCompleteFirst', 'FooCompleteSecond'] 
return call(funcs[n], [a:arg, a:line, a:pos]) 

注コマンドにはその1つがあります。

コマンドラインを引数に分割するために使用される正規表現は、引数の一部である アカウントのエスケープされた空白を受け取り、 のセパレータではありません。 (もちろん、補完関数は、 の引数が複数ある場合には通常どおり、 候補の空白をエスケープする必要があります)

+0

ありがとう!私はこれから実際的な解決策を得ることができます、より後で調査します。 – centerback

1

vimでこれを行うための組み込み方法はありません。この状況で私がやることは、論理を補完関数に埋め込むことです。あなたが-complete=customlist,CompletionFunctionを設定すると、指定した関数は、この順に、3つの引数によって呼び出されます

  • 現在の引数
  • この時点
  • カーソル位置までのコマンドライン全体

したがって、これらを分析して、2番目のパラメータのように見えるかどうかによって別の関数を呼び出すことができます。ここでは一例です。この例で

command! -nargs=* -complete=customlist,FooComplete Foo call Foo(<f-args>) 
function! Foo(...) 
    " ... 
endfunction 

function! FooComplete(current_arg, command_line, cursor_position) 
    " split by whitespace to get the separate components: 
    let parts = split(a:command_line, '\s\+') 

    if len(parts) > 2 
    " then we're definitely finished with the first argument: 
    return SecondCompletion(a:current_arg) 
    elseif len(parts) > 1 && a:current_arg =~ '^\s*$' 
    " then we've entered the first argument, but the current one is still blank: 
    return SecondCompletion(a:current_arg) 
    else 
    " we're still on the first argument: 
    return FirstCompletion(a:current_arg) 
    endif 
endfunction 

function! FirstCompletion(arg) 
    " ... 
endfunction 

function! SecondCompletion(arg) 
    " ... 
endfunction 

1つの問題は、空白文字が含まれて補完するために失敗するだろうということですので、それが可能だ場合、あなたはより慎重にチェックをしなければならないとしています。

関連する問題