Làm cách nào để bật / tắt một nhóm theo nhóm?


13

Tôi đã tạo một augroupcái .vimrcchứa trong đó autocmdvà tôi cần bật / tắt những thứ này autocommandmột cách nhanh chóng.

Ý tưởng là tạo ra một ánh xạ ( F4ví dụ, giả sử) sẽ cho phép các autocommands này khi được nhấn một lần và vô hiệu hóa chúng khi nhấn lại mà không phải lấy nguồn hoặc tải lại tệp .vimrc.

Làm thế nào tôi có thể làm điều đó?

Câu trả lời:


17

Dựa trên câu trả lời của bạn: bạn không cần một biến để giữ trạng thái augroup, bạn có thể sử dụng exists()cho điều đó, với điều kiện bạn biết ít nhất một trong số autocmdđó là một phần của nhóm:

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>

Hey cách mát mẻ để cải thiện nó! Tôi không biết bạn có thể làm điều đó.
statox

1
Bạn thậm chí có thể chia nhóm thành 2 phần và loại bỏ elsenhánh, bằng cách chạy autocmd!vô điều kiện lúc đầu.
VanLaser

@VanLaser Bạn có thể? Bạn đã thử làm theo cách đó? Gợi ý: điều gì sẽ exists('#TestAutoGroup#BufEnter')trở lại sau một autocmd!?
Sato Katsura

1
Một cái gì đó như thế này, có thể: pastebin.com/HEEYjseR
VanLaser

1
@VanLaser Và sau đó bạn có thể thực hiện thao tác đó không trạng thái, bằng cách loại bỏ biến toàn cục đó. Có lẽ có một chức năng có thể chăm sóc điều đó. Chức năng đó có thể cần ... Ow. Đúng. :)
Sato Katsura

9

(Tôi thực sự đã tự mình tìm ra nhưng vì tôi không tìm thấy câu trả lời trên trang này, tôi nghĩ rằng nó có thể hữu ích để tạo ra một câu hỏi tự trả lời )

Để làm như vậy, có thể tạo hàm sau và đặt nó vào .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

Hàm tạo một biến được sử dụng để xác định xem nhóm đã được kích hoạt trước đó hay chưa.

Khi nó không được kích hoạt, nhóm sẽ được tạo ra với các autocommands mong muốn. Nếu nhóm đã được bật trước đó, chúng tôi sẽ sử dụng autocmd!để "đặt lại", tức là xóa lệnh đã nhập trước đó.

Một tài liệu liên quan ở đây

Cuối cùng, có thể tạo ánh xạ folowing:

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

để sử dụng F4để gọi hàm.

EDIT : Karl Yngve Lervåg đã đề xuất một phiên bản cải tiến của chức năng này giúp giảm số lượng dòng mã, tôi cảm thấy thật tốt khi giữ cả hai phiên bản đầu tiên vẫn hoạt động có thể dễ hiểu hơn bởi một người đầu tiên vimscript như tôi.

Đây là chức năng được cải thiện của Karl, cảm ơn ông rất nhiều:

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

Trong phiên bản này, nhóm luôn được đặt lại và nếu không được bật, nó sẽ được tạo ra với các autocommands mong muốn


7

Tôi thấy cách dễ dàng là sử dụng một biến toàn cục. Thí dụ:

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>

Để được trợ giúp thêm xem:

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

Tôi không chắc chắn để hiểu lý do tại sao bạn nghĩ rằng đó là một cách dễ dàng: Tôi không phải là một bậc thầy về vimscript nên cú pháp của bạn có vẻ hơi quá so với tôi. Ưu điểm của phương pháp của bạn là gì?
statox

Ưu điểm: 1) Không có chức năng. 2) Có thể dễ dàng thích nghi để sử dụng biến cục bộ đệm / cửa sổ thay vì biến toàn cục. 3) Lập bản đồ đơn giản
Peter Rincker

Đồng ý. Cảm ơn bạn đã chia sẻ giải pháp của bạn, tôi sẽ không nghĩ làm theo cách này!
statox
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.