क्या मैं "डॉट ऑपरेटर" के साथ एक मैक्रो दोहरा सकता हूं?


15

क्या मैं .कमांड के साथ एक मैक्रो दोहरा सकता हूं ? उदाहरण के लिए, मैं टाइप करने में सक्षम होना चाहता हूं:

@q...

और यह प्रभावी रूप से @q4 बार कॉल करता है। डिफ़ॉल्ट व्यवहार के साथ, यह कार्य तभी 'क्यू' उदाहरण के लिए एक एकल आदेश रखती है, काम करता है dw, xया iHello<esc>। (यह समझ में आता है, हालांकि, ''। 'अंतिम परिवर्तन को दोहराता है , न कि अंतिम कीस्ट्रोक्स / कमांड)

मैं भी इस काम को काउंट्स के साथ करना पसंद करूंगा। उदाहरण के लिए, टाइपिंग:

3@q.

प्रभावी रूप से @q6 बार चलाने के समान होगा । मैं इस व्यवहार को कैसे कॉन्फ़िगर कर सकता हूं?


1
बिल्कुल नहीं, जो आप पूछ रहे हैं, लेकिन शायद यह मददगार होगा github.com/wincent/replay । यह रिकॉर्ड अंतिम रूप से रिकॉर्ड किया गया मैक्रो है और इसे दबाने पर फिर से Enter
खेलना है

FYI करें, @@अंतिम मैक्रो दोहराता है, इसलिए यदि आप मैपिंग और इस तरह के लिए यह पूछ रहे हैं, तो यह आपके लिए काम करना चाहिए।
शाहबाज

जवाबों:


7

इसे आजमाइए। यह फिर से समाप्त हो जाता है @ताकि g@(इसके अलावा एक डमी गति l) का उपयोग किया जाता है, इस प्रकार अंतिम ऑपरेटर बन जाता है और इसके साथ दोहराता है .

" When . repeats g@, repeat the last macro.
fun! AtRepeat(_)
    " If no count is supplied use the one saved in s:atcount.
    " Otherwise save the new count in s:atcount, so it will be
    " applied to repeats.
    let s:atcount = v:count ? v:count : s:atcount
    " feedkeys() rather than :normal allows finishing in Insert
    " mode, should the macro do that. @@ is remapped, so 'opfunc'
    " will be correct, even if the macro changes it.
    call feedkeys(s:atcount.'@@')
endfun

fun! AtSetRepeat(_)
    set opfunc=AtRepeat
endfun

" Called by g@ being invoked directly for the first time. Sets
" 'opfunc' ready for repeats with . by calling AtSetRepeat().
fun! AtInit()
    " Make sure setting 'opfunc' happens here, after initial playback
    " of the macro recording, in case 'opfunc' is set there.
    set opfunc=AtSetRepeat
    return 'g@l'
endfun

" Enable calling a function within the mapping for @
nno <expr> <plug>@init AtInit()
" A macro could, albeit unusually, end in Insert mode.
ino <expr> <plug>@init "\<c-o>".AtInit()

fun! AtReg()
    let s:atcount = v:count1
    let c = nr2char(getchar())
    return '@'.c."\<plug>@init"
endfun

nmap <expr> @ AtReg()

मैंने जितने कोने के मामलों को संभालने की कोशिश की है, मैं सोच सकता हूं। आप के @:साथ दोहरा सकते हैं .। के बाद के प्रेस के लिए मायने रखता है @या .बनाए रखा जाता है .

यह मुश्किल है, और मुझे यकीन नहीं है कि कुछ रास्ते में कहीं नहीं टूटेगा। इसलिए इस के साथ कोई गारंटी, वारंटी या वादे नहीं हैं।

व्यक्तिगत रूप से, मैं .पिछले बदलाव के लिए ठीक-ठीक दोहराए गए और मैक्रो के दोहराव के बीच अंतर कर रहा हूं @@

संपादित करें

मुझे लगा, बहुत दूर जाने के बाद, मैं कुछ अतिरिक्त कोड जोड़ सकता हूं जो .इसे वापस खेलने के लिए मैक्रो रिकॉर्ड करने के तुरंत बाद दबाने की अनुमति देगा ।

fun! QRepeat(_)
    call feedkeys('@'.s:qreg)
endfun

fun! QSetRepeat(_)
    set opfunc=QRepeat
endfun

fun! QStop()
    set opfunc=QSetRepeat
    return 'g@l'
endfun

nno <expr> <plug>qstop QStop()
ino <expr> <plug>qstop "\<c-o>".QStop()

let s:qrec = 0
fun! QStart()
    if s:qrec == 1
        let s:qrec = 0
        return "q\<plug>qstop"
    endif
    let s:qreg = nr2char(getchar())
    if s:qreg =~# '[0-9a-zA-Z"]'
        let s:qrec = 1
    endif
    return 'q'.s:qreg
endfun

nmap <expr> q QStart()

यह शानदार काम करता है! इस प्रश्न को पोस्ट करने के बाद से, मेरा वर्कफ़्लो बदल गया है, इसलिए मैं वास्तव में डॉट के साथ मैक्रोज़ को दोहराने में सक्षम नहीं होना चाहता। हालांकि, यह वास्तव में अच्छी तरह से काम करता है, इसलिए मैं इसे वैसे भी स्वीकार करूंगा (हालांकि मैं शायद इसे अपने साथ नहीं .vimrc
जेम्स

कोई चिंता नहीं, दिलचस्प समस्या की परवाह किए बिना!
एंटनी

1
संपादित करें: .रिकॉर्डिंग के तुरंत बाद एक मैक्रो को वापस खेलने की अनुमति दें ।
एंटनी

मुझे लगता है कि QStart फ़ंक्शन में \<plug>qstopपहले होना चाहिएq
स्टीव वर्म्यूलेन

6

अपने पिछले मैक्रो आप उपयोग कर सकते हैं दोहराने के लिए @@तो 3@@अनिवार्य रूप से 3 बार @q चलाना शामिल है। हालाँकि @ कीस्ट्रोक्स अस्वाभाविक हो सकते हैं, इसलिए मेरे .vimrc में मेरी लाइनें हैं:

  "- Lazy macro repeat
  nmap <leader>m @@

यह मुझे अंतिम मैक्रो को चलाने के लिए मेरे लीडर कुंजी (,) प्लस मी का उपयोग करने की अनुमति देता है। फिर आप मैक्रो को दोहराने के लिए एक संख्या के साथ इसे पूर्व कर सकते हैं।

अब 3,mके बराबर है 3@@। एक ही कुल चाबियाँ और कोई बदलाव नहीं है।

संपादित करें : इस पर पुनर्विचार करने पर मैं एक नए मैक्रो के साथ आया। nmap <leader>. @@ यह तब भी काम करता है जब एक संख्या से पहले होता है इसलिए 3,.अब 3@@इस काम को देखना पसंद करेंगे ताकि मैं एक मैक्रो लेटर में पास हो जाऊं और उस मैक्रो को पिछले मैक्रो के बजाय दोहराएं।


ओपी 6 बार 3@q.चलना चाहता है @q। यह ऐसा नहीं करता है।
user41805

आपके प्रश्न का उत्तर देना मुझे यकीन नहीं है कि यह इसका उत्तर देता है। क्या आप इसका उदाहरण दे सकते हैं कि आप कब उपयोग करेंगे 3@q.? ऐसा लगता है कि आप बस एक गिनती के साथ इसे प्रस्तुत कर सकते हैं। मैं एक मैक्रो शुरू करने से पहले एक खोज सेट करता हूं, फिर मैक्रो में उपयोग nकरके जहां इसे फिर से शुरू किया जा सकता है, वहां शुरू करें।
शौदत

5

आप किसी मैक्रो का उपयोग किसी अन्य मैक्रो में रिकॉर्ड कर सकते हैं, और इसे दोहरा सकते हैं।

qqdwq
qr2@qq

अब छह बार 3@rदौड़ने जैसा है @q


1

डिफ़ॉल्ट रूप spaceसे vim "चाल सही 1 वर्ण" है जो पहले से ही कवर किया गया है l, इसलिए मैंने q बफ़र से एक मैक्रो को फिर से चलाने के लिए स्थान को हटा दिया है:

noremap <Space> @q

उपयोग करने के लिए, बस qqपहले के साथ एक मैक्रो रिकॉर्ड करें, रिकॉर्डिंग बंद करें qऔर फिर spaceसे खेलना शुरू करें।


FYI करें, जिस कारण से आप कहते हैं (यह एक आवश्यक कुंजी नहीं है) बहुत से लोग अंतरिक्ष का उपयोग अपने नेता की कुंजी के रूप में करते हैं, इसलिए हो सकता है कि इसके साथ उतने लोग मुक्त न हों जितना आप सोचते हैं। :)
बी लेयर

0

जैसा कि मैं ,हल करने के लिए एक आसान और आसान प्रकार का उपयोग नहीं करता, यह मेरे लिए काम करता है:

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