Tôi gặp vấn đề khi xem nội dung của tệp, cập nhật tệp bên ngoài, hiển thị tệp đã thay đổi và có tùy chọn chỉnh sửa tệp khi cần. Tôi đã giải quyết nó với các tùy chọn dòng máy chủ / từ xa Vim, lấy cảm hứng từ câu trả lời này .
Với các lệnh sau, một tệp có thể được tải lại thông qua lệnh bên ngoài. Đầu tiên, mở tệp được đề cập với Vim, trong khi bắt đầu một phiên bản máy chủ.
vim --servername JABBERWOCKY /tmp/alice.log
Giả sử các tập tin đã được thay đổi từ bên ngoài, ví dụ bằng một echo "Curiouser and curiouser" >> /tmp/alice.log
. Khi cần thiết, gửi lệnh đến phiên bản máy chủ để tải lại tệp. Lệnh này sẽ kết thúc nhanh chóng và không sinh ra một trình soạn thảo mới.
vim --servername JABBERWOCKY --remote-send ":e<CR>"
Nếu tệp đã mở được thay đổi trong Vim và bên ngoài, sẽ có xung đột trong khi tải lại (một thông báo cảnh báo sẽ xuất hiện). Trong trường hợp đó, một quyết định phải được đưa ra: Giữ nguyên quyết định đó và giữ các thay đổi trong Vim hoặc loại bỏ các thay đổi cục bộ và buộc tải lại .
Lệnh với --remote-send
ở trên yêu cầu tải lại thủ công. Tuy nhiên, lệnh đó có thể được gắn với một vòng lặp đơn giản, sử dụng Bash's for
/ while
hoặc sử dụng một lớp lót bị hack trong Linux / Unix:
watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'
Mặc dù chưa được thử nghiệm nhưng tôi chắc chắn rằng một cái gì đó như thế này cũng có thể được nhận ra trong PowerShell.
Trên Linux / Unix, một cách tiếp cận theo hướng sự kiện có thể được nhận ra bằng cách lắng nghe các sự kiện hệ thống tệp bằng cách sử dụng thư viện inotify , nếu bạn không sử dụng các hệ thống tệp quá điên rồ. Cá nhân tôi thích sử dụng các công cụ Entr rất nhiều, mà dường như được bao gồm trong bản phân phối Linux lớn. Sau đó tôi nhận được:
echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
" Compare buffer with saved version
nnoremap gd :DiffSaved<CR>