วิธีเปิดใช้งาน / ปิดใช้งาน augroup ได้ทันที


13

ฉันสร้างขึ้นaugroupใน.vimrcหลายที่มีของฉันautocmdและฉันต้องเปิด / ปิดการใช้งานได้autocommandทันที

ความคิดที่จะสร้างการแมป (สมมติว่าF4ตัวอย่าง) ซึ่งจะช่วยให้ autocommands .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!เริ่มต้นโดยไม่มีเงื่อนไขในตอนต้น
VanLaser

@VanLaser คุณช่วยได้ไหม คุณลองทำอย่างนั้นหรือไม่? คำแนะนำ: สิ่งที่จะexists('#TestAutoGroup#BufEnter')กลับมาหลังจากที่autocmd!?
Sato Katsura

1
บางสิ่งเช่นนี้อาจจะเป็น: pastebin.com/HEEYjseR
VanLaser

1
@VanLaser และจากนั้นคุณสามารถทำให้การดำเนินการไร้สัญชาติโดยกำจัดตัวแปรส่วนกลางนั้น อาจมีฟังก์ชั่นที่สามารถดูแลได้ ฟังก์ชั่นนั้นอาจต้อง ... ขวา. :)
Sato Katsura

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

ฟังก์ชั่นสร้างตัวแปรที่ใช้ในการพิจารณาว่าเคยเปิดใช้งานกลุ่มหรือไม่

เมื่อไม่ได้เปิดใช้งานกลุ่มจะเติมข้อมูลด้วย AutoCommands ที่ต้องการ หากกลุ่มถูกเปิดใช้งานก่อนหน้านี้เราใช้autocmd!เพื่อ "รีเซ็ต" มันคือการลบคำสั่งที่ป้อนไว้ก่อนหน้านี้

เอกสารที่เกี่ยวข้องอยู่ที่นี่

ในที่สุดมันก็เป็นไปได้ที่จะสร้างแผนที่ folowing:

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

เพื่อใช้F4ในการเรียกใช้ฟังก์ชัน

แก้ไข : Karl Yngve Lervågแนะนำรุ่นที่ปรับปรุงใหม่ของฟังก์ชั่นนี้ซึ่งลดจำนวนบรรทัดของรหัสฉันรู้สึกว่ามันจะเป็นการดีที่จะรักษาทั้งสองเวอร์ชันให้เป็นเวอร์ชั่นแรกที่ยังคงทำงานได้ง่ายกว่าที่ฉันจะเข้าใจได้ง่าย

นี่คือฟังก์ชั่นที่ได้รับการปรับปรุงของ Karl ซึ่งขอบคุณมากสำหรับเขา:

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

ฉันไม่แน่ใจที่จะเข้าใจว่าทำไมคุณถึงคิดว่ามันเป็นวิธีที่ง่าย: ฉันไม่ใช่อาจารย์ vimscript ดังนั้นไวยากรณ์ของคุณดูเหมือนจะซับซ้อนเกินไปสำหรับฉัน ข้อดีของวิธีการของคุณคืออะไร?
statox

ข้อดี: 1) ไม่มีฟังก์ชั่น 2) สามารถปรับเปลี่ยนได้อย่างง่ายดายเพื่อใช้ตัวแปรโลคัลบัฟเฟอร์ / หน้าต่างแทนตัวแปรโกลบอล 3) การทำแผนที่อย่างง่าย
Peter Rincker

ตกลง. ขอบคุณสำหรับการแบ่งปันโซลูชันของคุณฉันไม่คิดว่าจะทำแบบนี้!
statox
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.