2011-06-02 9 views
15

Tôi nhập nhanh và nhận ra rằng đôi khi tôi vô tình lưu tệp có tên ; hoặc : (tôi nhập :wq và đôi khi lỗi đánh máy được giới thiệu).Tránh lưu tệp bằng một số tên nhất định trong Vim

Có cách nào để viết macro loại bỏ lưu tệp khớp với một số tên nhất định không?

+3

Tôi đoán bạn có thể sử dụng autocommand với 'BufWritePre' để cảnh báo bạn và không ghi tệp bắt đầu bằng'; * '. Nhưng tôi đang buồn ngủ ngay bây giờ và sẽ cho nó một shot bất cứ khi nào tôi thức dậy ... nếu nó chưa được trả lời bởi sau đó. – abcd

Trả lời

17

Một giải pháp đơn giản nhưng hiệu quả sẽ là xác định một lệnh tự động khớp với các tên tệp có khả năng bị nhập sai, cảnh báo và chấm dứt việc lưu.

:autocmd BufWritePre [:;]* throw 'Forbidden file name: ' . expand('<afile>') 

Lưu ý rằng lệnh :throw là cần thiết để làm cho Vim ngừng viết những nội dung của một bộ đệm.

Để tránh bị lỗi E605 vì một ngoại lệ không bị bắt, một có thể phát ra lỗi khi sử dụng lệnh :echoerr chạy trong khối try. (:echoerr tăng thông báo lỗi của nó như là một ngoại lệ khi gọi từ bên trong một cấu trúc try. Xem :help :echoerr.)

:autocmd BufWritePre [:;]* 
\ try | echoerr 'Forbidden file name: ' . expand('<afile>') | endtry 

Nếu nó bao giờ là cần thiết để lưu một tập tin với một tên phù hợp với mô hình được sử dụng trong trên tự động lệnh, người ta có thể thêm một lệnh viết với :noautocmd hoặc đặt tùy chọn eventignore cho phù hợp (xem :help :noautocmd:help eventignore để biết thêm chi tiết), ví dụ

:noa w :ok.txt 
+0

Điều này thật tuyệt vời (và tôi có chức năng lưu trước để thực hiện điều gì đó rất giống nhau), nhưng có cách nào tinh vi hơn trong việc ngăn lưu trong BufWritePre không? Ném một lỗi theo cách này dẫn đến 'E605: Ngoại lệ không bị bắt'. Sẽ tốt hơn nếu một tin nhắn có thể được lặp lại thay vì thông báo lỗi xấu xí. –

+0

@Prince: Thật không may, không có cách nào khác để chấm dứt hành động kích hoạt sự kiện 'autocmd', hơn là ném một ngoại lệ, theo như tôi biết. Tuy nhiên, có thể loại bỏ lỗi 'E605' bằng cách gói' throw' trong 'try'-'catch' — câu trả lời được cập nhật. –

+0

Tôi đoán bạn cần 'echohl ErrorMsg | echom 'Tên tệp đáng ngờ:' .v: ngoại lệ | echohl NONE' thay vì 'echoerr': echoerr không nên được sử dụng bởi vì nó 1. cung cấp thông tin không cần thiết về ngữ cảnh lỗi ở đây 2. tùy thuộc vào ngữ cảnh, nó có thể hoặc có thể không được biến thành một ngoại lệ. Latter là lý do tại sao tôi ghét 'echoerr': ngoại lệ của riêng mình là không tốt vì họ tạo thêm các điểm thoát ẩn cho tất cả các chức năng trong ngăn xếp cho đến khi' try..catch' được tìm thấy, nhưng 'echoerr' tệ hơn vì nó làm cho số các điểm thoát phụ thuộc vào ngữ cảnh. Tôi từng có một thời gian 'tốt' gỡ lỗi một vấn đề với 'echoerr'. – ZyX