Làm cách nào để xác định chế độ tự động hoạt động trên tất cả các tệp ngoại trừ một kiểu tệp nhất định?


8

Ví dụ, tôi có autocommandđịnh nghĩa sau :

augroup cursorline
    autocmd!
    autocmd WinLeave,BufLeave * set nocursorline
    autocmd WinEnter,BufEnter * set cursorline
augroup end

Tôi muốn xác định một cái gì đó loại trừ *.texcác tập tin:

autocmd WinEnter,BufEnter * "except *.tex" set cursorline

Cú pháp cho điều đó là gì? Tôi không chắc chắn những từ khóa để tìm kiếm các tài liệu trợ giúp.

Câu trả lời:


8

Theo tinh thần tương tự như câu trả lời @Sundar nhưng với cú pháp linh hoạt hơn một chút, bạn có thể thực hiện:

let ftToIgnore = ['latex', 'plaintex']
autocmd BufWritePre * if index(ftToIgnore, &ft) < 0 | set your options

Tôi có xu hướng thích cú pháp này bởi vì:

  • Bạn có thể dễ dàng thêm bộ lọc mới nếu bạn muốn.
  • Độ dài điều kiện giữ nguyên cho dù bạn có kiểm tra bao nhiêu kiểu tệp.

Khéo léo ! Nơi mà bạn thấy rằng bạn có thể chạy một điều kiện / chức năng bên trong autocommand?
nobe4

2
Vâng, nó giống như câu trả lời @sundar ngoại trừ điều kiện không nằm ở giá trị của biến mà là giá trị trả về của hàm.
statox

3

Làm thế nào về:

autocmd WinEnter,BufEnter * if &filetype != "latex" && &filetype != "plaintex" | set cursorline | endif

định dạng tốt hơn như

autocmd WinEnter,BufEnter * if &filetype != "latex" && &filetype != "plaintex" 
                            \ | set cursorline 
                            \ | endif

Điều này phụ thuộc vào việc filetypeđược phát hiện hoặc thiết lập bởi Vim và do đó không có bất kỳ vấn đề nào về phân biệt chữ hoa chữ thường. (Bạn có thể muốn kiểm tra xem tập tin tex của bạn đang được phát hiện là gì, bằng cách chạy set filetype?trong dòng lệnh của Vim).


1

Tôi đã không tìm thấy bất cứ điều gì có vẻ hỗ trợ những gì bạn muốn, nhưng bạn có thể làm tương tự với một chút kịch bản:

function! s:ToggleCursorLine(open) abort
  let l:extension = expand('%:e')
  if l:extension !=? 'tex'
    if a:open
      set cursorline
    else
      set nocursorline
    endif
  endif
endfunction

augroup cursorline
  autocmd!
  autocmd WinLeave,BufLeave * call s:ToggleCursorLine(1)
  autocmd WinEnter,BufEnter * call s:ToggleCursorLine(0)
augroup end

Tài liệu tham khảo : :h expand()


1
Bạn có thể muốn sử dụng !=#thay vì !=trên UNIX và !=?trên Windows. Nếu không, kết quả phụ thuộc vào giá trị của ignorecase.
Sato Katsura

Bạn có thể chỉ cho tôi một lời giải thích về sự khác biệt giữa !=#!=?? Bởi vì trên :h expr4đó không đề cập đến Windows / Unix.
nobe4

1
Tên tệp UNIX là (thường) phân biệt chữ hoa chữ thường, các tên Windows không phân biệt chữ hoa chữ thường.
Sato Katsura

0

Điều này hoạt động cho Syntaxautocommands, trong đó mẫu ( <match>) chỉ là kiểu tệp. Nó không bao gồm bất kỳ rsttập tin:

au Syntax *\(^rst\)\@<! …
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.