फ्लाई पर एक एग्रुप को सक्षम / अक्षम कैसे करें?


13

मैंने augroupअपनी .vimrcयुक्तियों में एक बनाया autocmdऔर मुझे autocommandइसे उड़ाने में सक्षम / अक्षम करने की आवश्यकता है ।

विचार एक मानचित्रण बनाने के लिए है ( F4उदाहरण के लिए कहते हैं ) जो इन ऑटोकॉमैंड्स को एक बार दबाए जाने और उन्हें निष्क्रिय करने पर सक्षम करेगा जब किसी फ़ाइल को स्रोत के बिना फिर से दबाया जाए या फिर से लोड किया जाए .vimrc

मैं उसे कैसे कर सकता हूँ?

जवाबों:


17

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

function! ToggleTestAutoGroup()
    if !exists('#TestAutoGroup#BufEnter')
        augroup TestAutoGroup
            autocmd!
            autocmd BufEnter   * echom "BufEnter " . bufnr("%")
            autocmd BufLeave   * echom "BufLeave " . bufnr("%")
            autocmd TabEnter   * echom "TabEnter " . tabpagenr()
            autocmd TabLeave   * echom "TabLeave " . tabpagenr()
        augroup END
    else
        augroup TestAutoGroup
            autocmd!
        augroup END
    endif
endfunction

nnoremap <F4> :call ToggleTestAutoGroup()<CR>

अरे इसे सुधारने का अच्छा तरीका! मुझे नहीं पता था कि आप ऐसा कर सकते हैं।
statox

1
आप समूह को 2 भागों में विभाजित कर सकते हैं और शुरुआत elseमें autocmd!बिना शर्त चलाकर, शाखा को हटा सकते हैं ।
18

@VanLaser क्या आप कर सकते हैं? क्या आपने इसे इस तरह से करने की कोशिश की है? संकेत: exists('#TestAutoGroup#BufEnter')एक के बाद क्या लौटेगा autocmd!?
19o में सातो कट्सुरा जूल

1
कुछ इस तरह, शायद: pastebin.com/HEEYjseR
VanLaser

1
@VanLaser और फिर आप उस वैश्विक वैरिएबल से छुटकारा पाकर उस ऑपरेशन को स्टेटलेस बना सकते हैं। शायद वहाँ एक समारोह है कि ध्यान रख सकता है। उस कार्य को करने की आवश्यकता हो सकती है ... आउ। सही। :)
सातो कैटसुरा

9

(मुझे वास्तव में यह अपने आप पता चल गया लेकिन जैसा कि मुझे इस साइट पर एक उत्तर नहीं मिला, मुझे लगा कि यह स्व-उत्तर वाला प्रश्न बनाने के लिए उपयोगी हो सकता है )

ऐसा करने के लिए निम्नलिखित फ़ंक्शन बनाना और इसे इसमें डालना संभव है .vimrc:

function! ToggleTestAutoGroup()
    if !exists('g:TestAutoGroupMarker')
        let g:TestAutoGroupMarker = 1
    endif

    " Enable if the group was previously disabled
    if (g:TestAutoGroupMarker == 1)
        let g:TestAutoGroupMarker = 0

        " actual augroup
        augroup TestAutoGroup
            autocmd! BufEnter   * echom "BufEnter " . bufnr("%")
            autocmd! BufLeave   * echom "BufLeave " . bufnr("%")
            autocmd! TabEnter   * echom "TabEnter " . tabpagenr()
            autocmd! TabLeave   * echom "TabLeave " . tabpagenr()
        augroup END
    else    " Clear the group if it was previously enabled
        let g:TestAutoGroupMarker = 1

        " resetting the augroup
        augroup TestAutoGroup
            autocmd!
        augroup END
    endif
endfunction

फ़ंक्शन यह निर्धारित करने के लिए उपयोग किया जाने वाला चर बनाता है कि क्या समूह पहले सक्षम था या नहीं।

जब यह सक्षम नहीं था, तो समूह वांछित ऑटोकॉमैंड्स के साथ आबाद है। यदि समूह पहले सक्षम था, तो हम autocmd!इसे "रीसेट" करने के लिए उपयोग करते हैं अर्थात पहले दर्ज की गई कमांड को हटाते हुए।

एक प्रासंगिक प्रलेखन यहाँ है

अंत में फॉलिंग मैपिंग बनाना संभव है:

nnoremap <F4> :call ToggleTestAutoGroup()<CR>

F4फ़ंक्शन को कॉल करने के लिए उपयोग करने के लिए।

EDIT : कार्ल यंगेव लार्वाग ने इस फ़ंक्शन के एक बेहतर संस्करण का सुझाव दिया, जिसने कोड की लाइनों की संख्या को कम कर दिया, मुझे लगा कि दोनों संस्करणों को पहले रखना अच्छा होगा क्योंकि अभी भी मेरे जैसे एक vimscript पदार्पण से समझना आसान है।

यहाँ कार्ल का बेहतर कार्य है, उसके लिए बहुत धन्यवाद:

function! ToggleTestAutoGroup()
    " Switch the toggle variable
    let g:TestAutoGroupToggle = !get(g:, 'TestAutoGroupToggle', 1)

    " Reset group
    augroup TestAutoGroup
        autocmd!
    augroup END

    " Enable if toggled on
    if g:TestAutoGroupToggle
        augroup TestAutoGroup
            autocmd! BufEnter   * echom "BufEnter " . bufnr("%")
            autocmd! BufLeave   * echom "BufLeave " . bufnr("%")
            autocmd! TabEnter   * echom "TabEnter " . tabpagenr()
            autocmd! TabLeave   * echom "TabLeave " . tabpagenr()
        augroup END
    endif
endfunction

इस संस्करण में समूह हमेशा रीसेट होता है, और अगर यह सक्षम नहीं था, तो यह वांछित ऑटोकॉमैंड्स के साथ आबाद है


7

मुझे लगता है कि वैश्विक चर का उपयोग करने का आसान तरीका है। उदाहरण:

augroup TestAutoGroup
  autocmd!
  autocmd BufEnter * |
        \ if get(g:, 'toggle_autocmd', 1) |
        \   echom "BufEnter " . bufnr("%") |
        \ endif
augroup END

nnoremap <f4> :<c-u>let g:toggle_autocmd = !get(g:, 'toggle_autocmd', 1)<cr>

अधिक मदद के लिए देखें:

:h g:
:h get()
:h :if
:h :bar
:h line-continuation

मुझे समझ में नहीं आ रहा है कि आपको क्यों लगता है कि यह एक आसान तरीका है: मैं एक विम्सस्क्रिप्ट मास्टर नहीं हूं, इसलिए आपका वाक्यविन्यास मुझे थोड़ा उलझा हुआ लगता है। आप के तरीके क्या हैं?
statox

पेशेवरों: 1) कोई कार्य नहीं। 2) आसानी से एक वैश्विक चर के बजाय एक बफर / खिड़की स्थानीय चर का उपयोग करने के लिए अनुकूलित किया जा सकता है। 3) सिंपल मैपिंग
पीटर रिंकेर जूल

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