Aşağıdaki kodu deneyebilirsiniz:
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
İlk olarak s:option_values
amacı seçeneklerinizi (anahtarları olarak) ve değerlerini (listelerdeki değerleri olarak) içermek olan bir sözlük tanımlar . Burada bir örnek olarak, değerler + 3 seçenek saklanır:
'foldmethod'
, 'bufhidden'
, 'virtualedit'
.
set wildcharm=<c-z>
Bu satır 'wildcharm'
seçeneği ayarlar <c-z>
ve Vim'e bir eşleme görürse wildmenü etkinleştirmesi gerektiğini söyler. Bu seçeneği ayarlamadan <tab>
, bir eşleştirmeye yazarsanız , basit bir sekme karakteri ekleyecektir.
cnoremap <expr> <tab>
<tab>
Komut satırına her bastığınızda bir ifadenin değerlendirmesini yazacak bir eşleme tanımına başlayın .
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
Eşleme, komut ^\s*set\s\+\w\+=
satırının, formu izleyen bir çizgi set option=
olan kalıpla eşleşip eşleşmediğini veya wildmenu'nun etkin olup olmadığını sınar.
\ '<c-z>' :
Önceki test başarılı olursa, haritalama wildmenu etkinleştirir.
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
Aksi takdirde, sistem komutunu :set
özel komutla değiştirir :Set
ve wildmenü etkinleştirir.
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
Adı burada bulunan özel bir tamamlama işlevini kullanabilmesi dışında :Set
, aynı şeyi yapan özel komutu tanımlayın .:set
s:SetComplete()
function! s:SetComplete(A, L, P) abort
Özel tamamlama işlevinin tanımına başlayın.
Önerileri / adayları bir liste aracılığıyla döndürmelidir. Komut ağa otomatik olarak 3 argümanlar gönderecektir:
:Set
- şu anda tamamlanmakta olan argümanın baş kısmı (yani
option=...
)
- tüm komut satırı
- içindeki imleç konumu
Daha :h :command-completion-customlist
fazla bilgi için bakınız .
let option = matchstr(a:A, '^.*\ze=')
Tamamlanan bağımsız değişkenten seçeneğin adını çıkarın.
if !has_key(s:option_values, option)
return
endif
option
Sözlüğünüzde olup olmadığını kontrol edin . Değilse, işlev hiçbir şey döndürmez.
let candidates = copy(s:option_values[option])
Seçeneğin sözlüğünüzden alabileceği değerler listesinin bir kopyasını alın.
call map(candidates, 'option . "=" . v:val')
Listedeki her bir değer için candidates
, dizeyi option=
( option
değerlendirilecek olan) önüne ekleyin .
return filter(candidates, 'v:val =~ "^" . a:A')
candidates
Başlangıcı tamamlanan bağımsız değişkenle eşleşmeyen öğeleri kaldırın ve sonucu döndürün.