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


11

मैं एक मैक्रो को परिभाषित करने की कोशिश कर रहा हूं जो जल्दी से यादृच्छिक-ईश शब्दों की एक सूची तैयार करता है।
मैं चाहता हूं कि मैक्रो इसे एक सूची में बदल दे

a
b
c
d
e

इस मामले में

arezzo
bywords
czars
détente
eyrie

मेरे पास अब तक क्या है:

  • पत्र पर कर्सर रखें a
  • मैक्रो रिकॉर्ड करना शुरू करें qq
  • a इन्सर्ट मोड डालें
  • <C-x><C-k> - perform dictionary completion on the character before cursor - in this case the letterA`
  • <C-p>पूर्ण सूची में अंतिम आइटम का चयन करें, जो मेरे सिस्टम पर इसका शब्द है arezzo। (एनबी मैंने longestअपनी 'completeopt'सेटिंग में शामिल किया है , जिसे <C-p>पूरा करने के दौरान इस तरह से काम करना आवश्यक है:) 'set completeopt=longest,menuone,preview'
  • <C-y> पूर्णता को स्वीकार करें
  • ^[^[ निकास मोड डालें
  • j अगली पंक्ति के लिए एक ही ऑपरेशन करने के लिए तैयार अगली पंक्ति के लिए नीचे जाएँ
  • q रिकॉर्डिंग बंद करें

जब मैं मैक्रो बनाता हूं और मैन्युअल रूप से चरणों के माध्यम से जाता हूं, तो सब कुछ ठीक काम करता है, हालांकि जब मैं मैक्रो को निष्पादित करता हूं, तो मुझे कमांड लाइन में चमकता हुआ एक संदेश दिखाई देता है जैसे:

शब्दकोश फ़ाइल स्कैनिंग

और कुछ भी नहीं होता है, केवल मैक्रो में कमांड्स jको रन किया जाता है, यानी कर्सर लाइन से नीचे चला जाता है, लेकिन पूरा होने वाले कमांड में से कोई भी नहीं चलता है।
क्या मैक्रो में सम्मिलित मोड पूर्णता का उपयोग करना संभव है, और यदि हां, तो मैं यह कैसे कर सकता हूं?


मुझे आपका <C-p>चरण समझ में नहीं आ रहा है ... जब मैं ऐसा करता हूं, तो मेरे विचार में, यह केवल संदेश देता है back at original- अंतिम आइटम का चयन नहीं करता है .. मैंने अंतिम शब्द (मेरा मामला azures) का चयन करने के लिए दो बार तीर कुंजी का उपयोग किया , दर्ज करें दबाया और तब Esc+j+q.. यह मैक्रो निष्पादित करने पर काफी ठीक काम करता है
सुंदरदीप

1
@spasic आह अच्छा बिंदु, मुझे उल्लेख करना चाहिए था, लेकिन मैं set completeopt=longest,menuone,previewइसके longestविकल्प का उपयोग कर रहा हूं जो <C-p>तुरंत डालने का कारण बनता है। यदि मैं स्ट्रिंग longestसे हटाता हूं completeopt, तो मुझे आपके समान व्यवहार मिलता है। इसके अलावा, हाँ तीर कुंजी ने काम किया! धन्यवाद (मैं भूल गया कि आप उन्हें पूरा सूची नेविगेट करने के लिए उपयोग कर सकते हैं)
the_velour_fog

शायद पॉपअप-मेनू हस्तक्षेप कर रहा है। शायद कोशिश करो :set completeopt=और a<c-x><c-k><esc>jअपने मैक्रो के रूप में।
एंटनी

@ मुझे यकीन नहीं है कि क्यों <cp> काम नहीं कर रहा था, लेकिन दिशात्मक तीर कुंजियों ने काम किया।
the_velour_fog

जवाबों:


2

संपादित करें : वास्तव में आप शब्दकोश पूरा होने के बाद हैं; ऐसा करने के लिए आपको आवश्यक रूप से इन्सर्ट मोड (Ctrl + X मोड) की आवश्यकता नहीं है। जैसा कि आपने खोजा, यह मैक्रोज़ के साथ एक वास्तविक दर्द का काम करता है। नीचे दी गई स्क्रिप्ट को डिस्क्रिप्शन मोड के बिना डिक्शनरी पूरा करने के लिए इस्तेमाल किया जा सकता है, ताकि आप इसे आसानी से मैक्रो के अंदर दोहरा सकें।

.vimrcनए फ़ंक्शन को स्रोत करने के लिए किसी भी विम विंडो को बंद करें और फिर से खोलें, अपनी कोड के नीचे कोड जोड़ें और फिर <C-k>पूरा jकरने के लिए और अगली पंक्ति में नीचे जाने के लिए वैकल्पिक रूप से अपने आप को रिकॉर्ड करें । मैंने longestविकल्प के लिए एक चेक जोड़ा और अगर यह अक्षम है, तो यह सिस्टम यादृच्छिक समय का उपयोग करके एक यादृच्छिक प्रविष्टि चुनता है। यदि यह longestविकल्प पाता है , तो यह मैन्युअल रूप से शब्दकोश से सबसे लंबे समय तक मिलान प्रविष्टि के लिए खोज करता है, और यह सम्मिलित करता है।

यदि आप <C-k>मानचित्रण पसंद नहीं करते हैं , तो जैसा कि आप फिट देखते हैं, इसे बदलने के लिए स्वतंत्र महसूस करें। यह आप की तरह किसी भी मानचित्रण के साथ काम करना चाहिए।

इसके अलावा, मूल्यांकन करने के लिए मैपिंग के लिए अभिव्यक्ति को वापस करने के लिए कमांड एक \<esc>चरित्र को अंत तक जोड़ता है ताकि हम प्रत्येक प्रविष्टि के बाद स्वचालित रूप से सम्मिलित करें मोड को छोड़ दें, और 0cwसामने के मोड में प्रवेश करने के लिए डालने के लिए मोड डालें और सुनिश्चित करें कि हम पूरे शब्द को ओवरराइट कर दें सही ढंग से। आप चाहते हैं कि सटीक व्यवहार पर निर्भर करता है (यदि आपके शब्द प्रत्येक पंक्ति के सामने अच्छी तरह से नहीं हैं) तो आप bcwइसके बजाय वास्तविक शब्द को खोजने के लिए उपयोग कर सकते हैं । हालाँकि, फिर आपको कुछ विषमताएँ दिखाई देंगी जब आप शब्दों को फिर से शुरू करेंगे जो लाइन शुरू करते हैं। वहाँ शायद एक और अधिक उन्नत कमांड लाइन को अनदेखा करने और दोनों को एक ही बार में करने के लिए है, लेकिन मुझे एक नहीं मिला।

map <expr> <C-k> CompleteDictionary()
fun! CompleteDictionary()
    let cword = expand(“<cword>”)
    let res = []
    for m in readfile(&dictionary)
        if m =~ '^' . cword
            call add(res, m)
        endif
    endfor
    if &completeopt =~ 'longest'
        let max = 0
        let maxindex = 0
        let index = 0
        for item in res
            if strlen(item) > max
                let max = strlen(item)
                let maxindex = index
            endif
            let index = index + 1
        endfor
        return "0cw" . res[maxindex] . "\<esc>"
    else
        return "0cw" . res[system('@echo %RANDOM%') % len(res)] . "\<esc>"
    endif
endfun

इसके अलावा, वैकल्पिक मैपिंग (उदाहरण के लिए, फ़ंक्शन पैरामीटर) बनाने के लिए यहां तर्क को विस्तारित करना मुश्किल नहीं होगा जो किसी भी फ़ंक्शन को सम्मिलित मोड प्रदान करता है। मुझे ऐसी किसी भी आवश्यकता के साथ सहायता करने और इस स्क्रिप्ट को अपडेट करने में खुशी होगी क्योंकि मेरे पास समय है।


यह मुद्दे की एक प्रशंसनीय व्याख्या की तरह लगता है, लेकिन मैंने आपके सुझाए गए दोनों समाधानों की कोशिश की, और न ही मदद करने के लिए प्रतीत हुआ।
रिच

क्या आपने sleepकमांड की कोशिश की ?
टिम

हां, हालांकि केवल 5 सेकंड के आपके सुझाए गए मूल्य के साथ। क्या आप काम करने के लिए या तो समाधान प्राप्त करने में कामयाब रहे हैं? क्या आप चरणों की पूरी सूची पोस्ट कर सकते हैं?
रिच

मैं वह व्यक्ति नहीं हूं जिसने प्रश्न लिखा है। हालांकि, मैं कर सकते हैं इस मुद्दे को दोबारा: यदि आप जोड़ने के लिए सबसे लंबे समय तक के लिए completeoptटिप्पणी में वर्णित के रूप में (फिर से, मेरे द्वारा नहीं)। संपादित करें : उफ़, कदम के 'longest'लिए आवश्यक है ctrl-p: नहीं ctrl-y। फिर भी चरणों में मेरे लिए सवाल-प्रश्नकर्ता काम द्वारा वर्णित vim -Nu NONEके साथ completeoptसंपादित।
रिच

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