2011-06-27 27 views
59

Tôi có một autocmd Vim loại bỏ khoảng trống cuối trong các 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 vài loại tệp mà tôi muốn nó bị vô hiệu hóa. khôn ngoan thông thường là để liệt kê các loại file bạn muốn một autocmd để chạy chống lại trong một danh sách bằng dấu phẩy, ví dụ:Vim chạy autocmd trên tất cả các loại tệp EXCEPT

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

Nhưng trong trường hợp này đó sẽ là lựa chọn hợp lý.

Có cách nào để khớp mẫu tự động chống lại tất cả các tệp NGOẠI LẠI các mẫu khớp với mẫu không? Tôi không thể tìm thấy tương đương với một đối sánh KHÔNG trong tài liệu.

Trả lời

44

*.rb không phải là loại tệp. Đó là một mẫu tập tin. ruby là loại tệp và thậm chí có thể được đặt trên các tệp không có tiện ích mở rộng .rb. Vì vậy, những gì bạn rất có thể muốn là một chức năng mà autocmd của bạn gọi để kiểm tra cả hai loại tập tin mà không nên được hành động trên và dải 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() 

Xây dựng về câu trả lời của evan, bạn có thể kiểm tra một biến đệm cục bộ và xác định xem có nên làm dải sử dụ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 không muốn loại bỏ bộ đệm đó là loại tệp mà bạn thường xóa.

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

Phải, tôi đã hy vọng một mẫu sẽ loại trừ một số tiện ích mở rộng tệp nhất định và chắc chắn lạm dụng các cụm từ trong mô tả của tôi. Trong khi tôi đã hy vọng cho một lớp lót, gói logic trong một chức năng và gọi nó không phải là quá tồi tàn. Cảm ơn! – jerodsanto

10

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

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

40

Một lựa chọn một dòng cách:

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ì đó mà bạn thích cho tất cả các loại file ngoại trừ những người trong danh sách đen.

Các vấn đề liên quan