आप निम्नलिखित कोड आज़मा सकते हैं:
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>
मैपिंग में देखता है तो उसे वाइल्डमेनू को सक्रिय करना होगा। इस विकल्प को सेट किए बिना, यदि आप <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
जिनकी शुरुआत में पूरा होने वाले तर्क से मेल नहीं खाता है, और परिणाम लौटाता है।