Anda dapat mencoba kode berikut:
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
Pertama mendefinisikan kamus s:option_values
yang tujuannya adalah untuk berisi pilihan Anda (sebagai kuncinya) dan nilainya (sebagai nilainya yang daftar). Di sini, sebagai contoh, 3 pilihan + nilai-nilai yang disimpan:
'foldmethod'
, 'bufhidden'
, 'virtualedit'
.
set wildcharm=<c-z>
Baris ini menetapkan 'wildcharm'
opsi dan memberi tahu Vim bahwa jika dilihat <c-z>
dalam pemetaan, ia harus mengaktifkan wildmenu. Tanpa mengatur opsi ini, jika Anda menulis <tab>
dalam pemetaan, itu hanya akan memasukkan karakter tab literal.
cnoremap <expr> <tab>
Mulailah definisi pemetaan yang akan mengetik evaluasi ekspresi setiap kali Anda menekan <tab>
pada baris perintah.
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
Pemetaan akan menguji apakah baris perintah cocok dengan pola ^\s*set\s\+\w\+=
, yang merupakan garis yang mengikuti formulir set option=
, atau jika wildmenu aktif.
\ '<c-z>' :
Jika tes sebelumnya berhasil, pemetaan mengaktifkan wildmenu.
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
Jika tidak, itu menggantikan perintah sistem :set
dengan perintah kustom :Set
, dan mengaktifkan wildmenu.
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
Tetapkan perintah kustom :Set
yang melakukan hal yang sama :set
, kecuali itu dapat menggunakan fungsi penyelesaian kustom yang namanya ada di sini s:SetComplete()
.
function! s:SetComplete(A, L, P) abort
Mulai definisi fungsi penyelesaian kustom.
Itu harus mengembalikan saran / kandidat melalui daftar.
The :Set
perintah secara otomatis akan mengirimkan 3 argumen untuk itu:
- bagian utama dari argumen yang saat ini sedang diselesaikan pada (yaitu
option=...
)
- seluruh baris perintah
- posisi kursor di dalamnya
Lihat :h :command-completion-customlist
untuk informasi lebih lanjut.
let option = matchstr(a:A, '^.*\ze=')
Ekstrak nama opsi dari argumen yang sedang diselesaikan.
if !has_key(s:option_values, option)
return
endif
Periksa apakah option
ada di kamus Anda. Jika tidak, fungsi tidak mengembalikan apa pun.
let candidates = copy(s:option_values[option])
Dapatkan salinan daftar nilai yang dapat diambil opsi dari kamus Anda.
call map(candidates, 'option . "=" . v:val')
Untuk setiap nilai dalam daftar candidates
, tambahkan string option=
(di mana option
akan dievaluasi).
return filter(candidates, 'v:val =~ "^" . a:A')
Hapus item dari candidates
awal yang tidak cocok dengan argumen yang sedang diselesaikan, dan kembalikan hasilnya.