Vim chạy autocmd trên tất cả các loại tệp NGOẠI TRỪ


81

Tôi có autocmd Vim loại bỏ khoảng trắng ở cuối tệp trước khi ghi. Tôi muốn điều này gần như 100% thời gian, nhưng có một số loại tệp mà tôi muốn nó bị vô hiệu hóa. Sự khôn ngoan thông thường là liệt kê các kiểu tệp bạn muốn autocmd chạy trong danh sách được phân tách bằng dấu phẩy, ví dụ:

autocmd BufWritePre *.rb, *.js, *.pl

Nhưng trong trường hợp này, đó sẽ là một rắc rối.

Có cách nào để so khớp mẫu autocmd với tất cả các tệp NGOẠI TRỪ những tệp khớp với mẫu không? Tôi không thể tìm thấy kết quả tương đương với KHÔNG đối sánh trong tài liệu.

Câu trả lời:


66

*.rbkhông phải là một loại tệp. Đó là một mẫu tệp. rubylà loại tệp và thậm chí có thể được đặt trên các tệp không có .rbphần mở rộng. Vì vậy, những gì bạn có thể muốn là một chức năng mà autocmd của bạn gọi để kiểm tra các loại tệp không nên được thực hiện và loại bỏ khoảng trắng.

fun! StripTrailingWhitespace()
    " Don't strip on these filetypes
    if &ft =~ 'ruby\|javascript\|perl'
        return
    endif
    %s/\s\+$//e
endfun

autocmd BufWritePre * call StripTrailingWhitespace()

Dựa trên câu trả lời của evan, bạn có thể kiểm tra biến cục bộ đệm và xác định xem có thực hiện dải bằng cách sử dụng biến đó hay không. Điều này cũng sẽ cho phép bạn thực hiện vô hiệu hóa một lần nếu bạn quyết định rằng bạn không muốn loại bỏ bộ đệm là loại tệp bạn thường tách.

fun! StripTrailingWhitespace()
    " Only strip if the b:noStripeWhitespace variable isn't set
    if exists('b:noStripWhitespace')
        return
    endif
    %s/\s\+$//e
endfun

autocmd BufWritePre * call StripTrailingWhitespace()
autocmd FileType ruby,javascript,perl let b:noStripWhitespace=1

1
Đúng vậy, tôi đã hy vọng một mẫu sẽ loại trừ một số phần mở rộng tệp nhất định và chắc chắn đã sử dụng sai các thuật ngữ trong mô tả của mình. Trong khi tôi hy vọng về một lớp lót, gói logic trong một hàm và gọi nó không phải là quá tồi. Cảm ơn!
jerodsanto

Nếu bạn muốn cấu hình vim của mình theo mô-đun hơn, bạn có thể thêm cài đặt let b:noStripWhitespacevào các tệp trong phần plugin loại tệp. Fx để tắt tính năng xóa khoảng trắng ở cuối đối với git commit, hãy thêm dòng vào ~/.vim/ftplugin/gitcommit.vim.
flydutchman

58

Một sự lựa chọn khác của một đường:

let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like

Sau đó, bạn có thể làm điều gì đó bạn thích cho tất cả các loại tệp ngoại trừ những loại trong danh sách đen.


15

Cách dễ nhất là đặt một biến cục bộ cho một loại tệp thành true. Sau đó, đặt lệnh tự động nếu biến đó là sai (nếu được đặt cho mọi thứ khác) hoặc nếu biến đó tồn tại (không cần đặt trước).

autocmd BufWritePre *.foo let b:foo=true

if !exists("b:foo")
    autocmd ...
endif

đã thay đổi tiền tố biến dựa trên nhận xét


1

Điều này hoạt động cho các lệnh Syntaxtự động, trong đó mẫu ( <match>) chỉ là kiểu tệp. Nó loại trừ bất kỳ rsttệp nào :

au Syntax *\(^rst\)\@<! …

1

Tệp cấu hình .vimrc của chúng tôi chỉ chạy một lần khi khởi động. Vì vậy, nếu bạn đặt kiểm tra if vào lúc này, nó sẽ không hoạt động, vì không có tệp python nào hiện đang được chỉnh sửa.

Nhưng bạn có thể sử dụng .vimrc để thiết lập một hành vi tự động: điều gì đó mà vim sẽ thực hiện mỗi khi nó gặp phải một điều kiện đặc biệt. Điều kiện có thể là trong trường hợp của bạn: "Một tệp mới đang được chỉnh sửa và loại tệp của nó là 'python'". Xem: h: au

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.