Làm cách nào để tải lại tập tin hiện tại?


145

Tôi thường xuyên làm việc với các tệp được kiểm soát phiên bản, vì vậy có thể thay đổi được thực hiện cho chúng bên ngoài Vim.

Cách nhanh chóng để tải lại tệp mà không cần phải đóng và mở lại Vim là gì? Và có cách nào để làm điều này tự động?


" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale

Nếu bạn đã cài đặt vim-faq , bạn có thể nhận được câu trả lời ngoại tuyến ở đó: :h vim-faqvà tìm kiếm /reload. Các thẻ khó để ghi nhớ là :h faq-5.8.
Hotschke

Câu trả lời:


172

Lệnh bạn muốn là :e(viết tắt của :edit). Nếu bạn sử dụng :edit!nó sẽ loại bỏ các thay đổi cục bộ và tải lại.

Bạn cũng có thể có vim làm điều này tự động với set autoreadtrong vimrc của bạn.


5
Xem câu trả lời này cho các cảnh báo và giải pháp liên quan autoread.
Tom Hale

4
Để làm điều này cho tất cả các bộ đệm, hãy sử dụng :bufdo :ehoặc:bufdo :e!
Aaron H.

1
@AaronH. cảm ơn vì điều đó! Tôi thường có hàng trăm bộ đệm mở cùng một lúc và khi chuyển nhánh, tôi thường chỉ cần đóng vim và khởi động lại để làm mới tất cả các bộ đệm với nội dung mới. Đây sẽ là một máy tiết kiệm thời gian chính!
g19fanatic

1
@AaronH. Thứ hai :là tùy chọn: :bufdo esẽ hoạt động như nhau.
JoL

19

Trong nhiều trường hợp, set autoreadsẽ không hoạt động như câu trả lời này giải thích:

Autoread không tải lại tập tin trừ khi bạn làm gì đó như chạy lệnh bên ngoài (như !lshoặc !shv.v.)

Các sự kiện tập trung sẽ kích hoạt autoread, nhưng chúng không được ghi lại trừ khi sử dụng gvim. Vì vậy, nếu chạy đơn giản vimbên trong cửa sổ terminal hoặc tmux, hãy cài đặt plugin vim-tmux-Focus-event .

Trên các phiên bản tmux> 1.9, bạn sẽ cần thêm .tmux.conf:

set -g focus-events on

Để có thêm sự tốt lành, việc thêm các mục sau vào vimrcsẽ kích hoạt autoreadkhi thay đổi bộ đệm bên trong trong khi bên trong vim:

au FocusGained,BufEnter * :checktime

Điều này đã gây phiền nhiễu cho tôi trong nhiều năm. Cảm ơn cho một giải pháp kỹ lưỡng! 💯😄
Nathan dài

9

Nếu bạn đã từng chạy một lệnh bên ngoài từ Vim để sửa đổi bộ đệm hiện tại, bạn có thể nhận thấy rằng nó nhắc bạn tải lại tệp vì các thay đổi đã được thực hiện trên đĩa. Bạn thực sự có thể gọi lời nhắc này bằng cách sử dụng :checktimelệnh.


3

Plugin tốt để cải thiện autoread https://github.com/djoshea/vim-autoread

Tự động khiến vim tải lại các tệp đã được ghi trên đĩa nhưng không được sửa đổi trong bộ đệm kể từ lần ghi cuối cùng từ vim. Điều này cho phép một tệp mở trong vim được chỉnh sửa bằng ứng dụng khác và được lưu. Khi quay lại vim, miễn là bạn chưa sửa đổi tệp kể từ lần thay đổi cuối cùng, tệp sẽ được cập nhật tự động để phản ánh các thay đổi được thực hiện trên đĩa, như thể bạn đã nhấn: e thủ công.


Chào mừng bạn đến với Sàn giao dịch Vi Stack. Đây gần như là một câu trả lời chỉ liên kết. Bạn có thể cải thiện nó bằng cách mô tả plugin (ví dụ: nó làm gì? Làm thế nào một người sẽ sử dụng nó để thực hiện các mục tiêu của OP?)
John O'M.

0

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/ whilehoặ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>"
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.