コマンドラインのオプション値の自動補完


10

私がこれを試みた回数を数えることはできません:

:set foldmethod=syn^I

オプション値では補完が機能しないようです!

オプションが複雑な文字列であり、補完が意味をなさない場合があります。(例'comments'

しかし、一般的なユースケースにワイルドチャー補完を提供するための取り組みはありましたか?

そうでない場合、上記の例をどのように機能させることができますか?(私が文字列の1つに完了したいと仮定します['manual', 'indent', 'expr', 'marker', 'syntax']。)

回答:


3

次のコードを試すことができます:

let s:option_values = {'foldmethod'  : ['manual', 'indent', 'expr', 'marker', 'syntax'],
                     \ 'bufhidden'   : ['hide', 'unload', 'delete', 'wipe'],
                     \ 'virtualedit' : ['block', 'insert', 'all', 'onemore'] ,}

set wildcharm=<c-z>

cnoremap <expr> <tab>
            \ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
            \ '<c-z>' :
            \ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'

command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>

function! s:SetComplete(A, L, P) abort
    let option = matchstr(a:A, '^.*\ze=')
    if !has_key(s:option_values, option)
        return
    endif
    let candidates = copy(s:option_values[option])
    call map(candidates, 'option . "=" . v:val')
    return filter(candidates, 'v:val =~ "^" . a:A')
endfunction

まずs:option_values、オプション(キーとして)とその値(リストである値として)を含めることを目的とする辞書を定義します。ここでは、一例として、3つのオプション+の値が格納されています:
'foldmethod''bufhidden''virtualedit'

set wildcharm=<c-z>

この行は'wildcharm'オプションを設定<c-z>し、マッピングに表示される場合はワイルドメニューをアクティブにする必要があることをVimに伝えます。このオプションを設定しない場合<tab>、マッピングを書き込むと、リテラルのタブ文字が挿入されます。

cnoremap <expr> <tab>

<tab>コマンドラインでヒットするたびに式の評価を入力するマッピングの定義を開始します。

\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?

マッピングは、コマンドラインがパターン^\s*set\s\+\w\+=に一致するかどうかをテストします。これは、フォームset option=に続く行であるか、またはワイルドメニューがアクティブかどうかをテストします。

\ '<c-z>' :

前のテストが成功した場合、マッピングはワイルドメニューをアクティブにします。

\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'

それ以外の場合は、システムコマンド:setをカスタムコマンドに置き換え:Set、ワイルドメニューをアクティブにします。

command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>

名前がここにあるカスタム補完関数を使用できることを除いて:Set、と同じことをするカスタムコマンドを定義し:setますs:SetComplete()

function! s:SetComplete(A, L, P) abort

カスタム補完関数の定義を開始します。

リストを通じて候補/候補を返す必要があります。コマンドが自動的にそれに3つの引数を送信します。
:Set

  • 現在完了している引数の先頭部分(つまりoption=...
  • コマンドライン全体
  • その中のカーソル位置

詳細については:h :command-completion-customlist、を参照してください。

let option = matchstr(a:A, '^.*\ze=')

完了している引数からオプションの名前を抽出します。

if !has_key(s:option_values, option)
    return
endif

option辞書にあるかどうかを確認します。そうでない場合、関数は何も返しません。

let candidates = copy(s:option_values[option])

オプションが辞書から取得できる値のリストのコピーを取得します。

call map(candidates, 'option . "=" . v:val')

リスト内の各値についてcandidates、文字列を追加しますoption=option評価される場所)。

return filter(candidates, 'v:val =~ "^" . a:A')

candidates先頭から完了している引数と一致しないアイテムを削除し、結果を返します。


2

私の知る限り、cmdline-completionを提供していない組み込みコマンドに追加することはできません。補完をサポートする別のコマンド(ここ:Setでは大文字で定義できますS)でコマンドを "オーバーライド" するか、不足しているものを追加するためにvimソースコードにハッキングします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.