Cmdline पर विकल्प मानों के लिए स्वतः पूर्णता


10

मैंने ऐसा करने के लिए जितनी बार कोशिश की है, उतने समय तक नहीं गिना जा सकता है:

:set foldmethod=syn^I

ऐसा लगता है कि पूर्णता विकल्प मूल्यों पर काम नहीं करता है!

कुछ मामलों में विकल्प जटिल तार होते हैं, जहां पूरा होने का मतलब नहीं हो सकता है। (उदा 'comments'।)

लेकिन क्या आम उपयोग के मामलों को पूरा करने के लिए कोई प्रयास किए गए हैं?

यदि नहीं, तो मैं काम के ऊपर उदाहरण कैसे बना सकता हूं? (यह मानते हुए कि मैं एक तार को पूरा करना चाहता था ['manual', 'indent', 'expr', 'marker', 'syntax']।)

जवाबों:


3

आप निम्नलिखित कोड आज़मा सकते हैं:

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जिनकी शुरुआत में पूरा होने वाले तर्क से मेल नहीं खाता है, और परिणाम लौटाता है।


2

AFAIK, हम cmdline- पूरा करने के लिए इसे निर्मित नहीं करने वाले अंतर्निहित आदेशों में जोड़ नहीं सकते। या तो हम एक दूसरे के साथ कमांड को "ओवरराइड" करते हैं जो पूरा होने का समर्थन करेगा (यहां, आप :Setएक पूंजी के साथ परिभाषित कर सकते हैं S), या जो गायब है उसे जोड़ने के लिए हम विम सोर्स कोड में हैक करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.