คุณสามารถลองรหัสต่อไปนี้:
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'
ตัวเลือกและบอก Vim ว่าหากเห็น<c-z>
ในการทำแผนที่ต้องเปิดใช้งาน wildmenu โดยไม่ต้องตั้งค่าตัวเลือกนี้หากคุณเขียน<tab>
ในการแมปมันก็จะแทรกตัวอักษรแท็บตัวอักษร
cnoremap <expr> <tab>
เริ่มต้นนิยามของการแม็พซึ่งจะพิมพ์การประเมินผลของนิพจน์ทุกครั้งที่คุณกด<tab>
ที่บรรทัดคำสั่ง
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
การแมปทดสอบว่าบรรทัดคำสั่งตรงกับรูปแบบ^\s*set\s\+\w\+=
ซึ่งเป็นบรรทัดต่อจากแบบฟอร์มset option=
หรือถ้า wildmenu ทำงานอยู่
\ '<c-z>' :
หากการทดสอบก่อนหน้านี้สำเร็จการทำแผนที่จะเปิดใช้งาน wildmenu
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
มิฉะนั้นจะแทนที่คำสั่งระบบ:set
ด้วยคำสั่งที่กำหนดเอง:Set
และเปิดใช้งาน wildmenu
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
จุดเริ่มต้นที่ไม่ตรงกับอาร์กิวเมนต์ที่เสร็จสมบูรณ์แล้วและส่งคืนผลลัพธ์