2012-04-24 21 views
8

Tôi đang cố gắng sử dụng inotifywait để theo dõi các thư mục cụ thể và biên dịch lại nếu cần. Vấn đề là tôi đang sử dụng vim nặng nề, và khi tôi đang chỉnh sửa trong vim bất kỳ tập tin sửa đổi thực sự gây ra một số sự kiện 'thừa', một cái gì đó như:Quá nhiều sự kiện inotify trong khi chỉnh sửa trong vim

:w 
sass/somefolder/ CREATE 4913 
sass/somefolder/ CREATE some 
sass/somefolder/ MODIFY some 

Tôi đã mất một thời gian để nhận ra rằng thực sự tất cả mọi thứ OK với inotifywait - Tôi đã cố gắng sử dụng nano và mọi thứ hoạt động như mong đợi, chỉ "MODIFY" được kích hoạt và chỉ một lần.

Tôi đã cố chỉnh sửa (chỉ dành cho mục đích thử nghiệm, không đánh giá tôi cứng) Emacs và cũng có vấn đề với Emacs - mỗi lần tôi nhấn Ctrl-X + Ctrl + S MODIFY trigger 3 lần .

Câu hỏi đặt ra là làm thế nào tôi có thể giải quyết vấn đề với các sự kiện thừa trong vim?

Nhân tiện, directorybackupdir trong số .vimrc của tôi không nằm trong thư mục được giám sát.

UPD: This link explains lý do tại sao mọi thứ thực sự xảy ra như thế nào, nhưng tôi vẫn không biết cách khắc phục điều này. Vâng, dĩ nhiên là tôi có thể bỏ qua 4913 chứa chuỗi, nhưng điều này là quá kludgy ngay cả đối với một trong những người cố gắng sử dụng inotify để biên dịch Sass)))

UPD: phiên bản VIM là 7.3.429

Trả lời

7

Nếu bạn tìm cách kích hoạt hành động (chẳng hạn như biên dịch lại mã) sau khi bạn đã chỉnh sửa tệp, bạn thường muốn xem sự kiện IN_CLOSE_WRITE và bỏ qua mọi thứ khác.

Bạn hoàn toàn không muốn theo dõi IN_MODIFY sự kiện vì, như bạn đã phát hiện, chúng có thể được kích hoạt nhiều lần trong khi chỉnh sửa tệp.

Vì vậy:

inotifywait -e close_write ... 
+0

cảm ơn bạn đã trả lời câu hỏi này. Tùy chọn '-e close_write' chắc chắn tốt hơn, nhưng chỉ giải quyết vấn đề với nhiều thay đổi, nhưng không phải với bí ẩn' sass/somefolder/CLOSE_WRITE, CLOSE 4913' event – shabunc

+0

Bạn chỉ có thể bỏ qua các sự kiện trên các thư mục ...nếu bạn có 'inotifywait' chờ đầu ra đường dẫn, bạn có thể có kịch bản của bạn kiểm tra nếu nó là một thư mục (' [-d ...] ') và chỉ kích hoạt hành động của bạn nếu tập tin được sửa đổi. – larsks

+1

Theo mặc định, khi vim lưu một tệp, nó sẽ tạo một tệp mới và ghi vào nó, và khi nó chắc chắn nó đã ghi thành công, nó sẽ xóa tệp cũ và đặt lại tên tệp mới. Điều này có thể là nguyên nhân của một số sự kiện giả mạo. Bạn có thể tắt chức năng này bằng 'set nowritebackup'. Xem ': trợ giúp bảng sao lưu' và bạn bè. –

2

Các biên tập viên tốt hơn làm điều đó theo cách đó để thực thi nguyên tố. Nói cách khác, bạn sẽ không kết thúc với một tập tin được viết một nửa nếu sức mạnh chết tại thời điểm sai.

Một tùy chọn có thể hữu ích là chỉ sử dụng autocmd BufWritePost để làm biên dịch lại của bạn.

Tuy nhiên, nếu bạn thực hiện các thay đổi khác ngoài vim, có thể bạn muốn đợi nhiều thông báo và thực hiện việc biên dịch sau khi không có thông báo nào xảy ra trong một khoảng thời gian, nói nửa giây. Điều đó sẽ bao gồm các dự phòng khác như thực hiện kiểm soát nguồn kéo, ví dụ.

+0

+1 để đề xuất hành vi tập lệnh thông minh –

1

Hầu hết người chỉnh sửa sẽ sử dụng tệp tạm thời để viết thông tin hoàn tác hoặc chỉnh sửa tệp trước khi bạn cam kết và lưu. Ngoài ra, hầu hết các biên tập viên cần phải viết vào một tập tin tạm thời để nói chuyện với sub-shell và script. Tôi nghi ngờ các tập tin 4913 có thể là một yếu tố của thiết lập vim của bạn, hoặc một chức năng của id người dùng số của bạn, để duy nhất các tập tin.

Bạn có thể strim vim để xem thời điểm các tệp được cập nhật và những gì xảy ra ở hai bên, ví dụ: một ngã ba + exec, hoặc một tập tin được xúc động mà có thể gợi ý mà vĩ mô hoặc cơ sở đang gây ra điều này.

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