次のコードを試すことができます:
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
先頭から完了している引数と一致しないアイテムを削除し、結果を返します。