làm mới nội dung thay đổi của tập tin được mở trong vi (m)


362

Tôi có một tệp cấu hình mà tôi vẫn mở trong vim, nhưng đôi khi nó được thay đổi trên đĩa, mà không có những thay đổi này được phản ánh trên thiết bị đầu cuối. Tôi có thể làm mới nội dung trên màn hình mà không cần đóng và mở lại tệp không? Nếu vậy thì thế nào?



Kết thúc: tất cả các câu trả lời cho đến nay là kiểu "Thăm dò" thay vì kiểu "Đẩy". Đó là, thay vì nhận được một sự kiện thay đổi tệp bên ngoài như được thực hiện bởi các tính năng tương tự của phần mềm khác, các câu trả lời này dựa trên vim chủ động bỏ phiếu thay đổi tệp, theo cách thủ công hoặc được kích hoạt bởi hành động của người dùng hoặc bộ đếm thời gian. Kết quả cuối cùng là bạn sẽ không thấy thay đổi được làm mới ngay lập tức trên màn hình.
Penghe Geng

Câu trả lời:


464

Bạn có thể sử dụng :editlệnh mà không chỉ định tên tệp để tải lại tệp hiện tại. Nếu bạn đã thực hiện sửa đổi tệp, bạn có thể sử dụng :edit!để buộc tải lại tệp hiện tại (bạn sẽ mất các sửa đổi của mình).

Lệnh :editcó thể được viết tắt bởi :e. Do đó, chỉnh sửa lực lượng có thể được thực hiện bởi:e!


2
Các "!" đã làm tôi vấp ngã, nhưng giờ thì rõ rồi.
twan163

107
Lưu ý: thường được viết tắt là :e!.
Stéphane Chazelas

31
@StephaneChazelas: Vâng, đúng vậy :) @ twan163: Thay vì :edit:edit!bạn có thể sử dụng :e:e!tương ứng.
Vì vậy,

11
Mất sửa đổi, có và không. Điều quan trọng, bạn vẫn có thể undo :e!.
gerrit

5
Ngoài ra, nếu bạn muốn tải lại tất cả các bộ đệm của mình, hãy chạy::bufdo e
pkout

193

Ngoài việc làm mới thủ công tệp :edit, bạn có thể đặt vào~/.vimrc

:set autoread

để làm cho Vim tự động làm mới bất kỳ tệp nào chưa được chỉnh sửa bởi Vim. Cũng thấy :checktime.


2
Người mua hãy cẩn thận - Nếu bạn đang làm việc với mã mới và git pulllưu ý rằng bạn có thể mất các thay đổi chưa được lưu trên màn hình thay vì vô ý.
azatar

5
@toszter Không, Vim sẽ chỉ làm mới bộ đệm không thay đổi . Trong trường hợp thay đổi, vẫn sẽ có một truy vấn: Giữ hoặc tải?
Ingo Karkat

10
NB autoread không hoạt động chính xác tự động. Bạn có thể phải sử dụng gvimhoặc chạy các lệnh bên ngoài.
Sparhawk

3
Những người sử dụng vim bên trong tmux có thể nhận được các sự kiện tập trung bằng cách sử dụng github.com/tmux-plugins/vim-tmux-f Focus-event . Nếu không, autoread sẽ không giúp đỡ trong thiết bị đầu cuối trừ khi bạn gọi bằng cách nào đó:checktime
Karl Bartel

3
autoreadcó thể được kích hoạt tự động X giây sau khi con trỏ ngừng di chuyển, xem câu trả lời này .
Tom Hale

57

TL; DR

Bỏ qua Wrap-uptiêu đề cho các vimrcdòng để thêm để làm cho cuộc sống của bạn tốt hơn.

Thủ công

Chạy :checktime

Kiểm tra xem có bộ đệm nào được thay đổi ngoài Vim không. Điều này kiểm tra và cảnh báo bạn nếu bạn kết thúc với hai phiên bản của một tệp.

Tự động

Để tự động tải các thay đổi, hãy thêm vào vimrc:

set autoread

Khi một tệp được phát hiện đã bị thay đổi bên ngoài Vim và nó không bị thay đổi bên trong Vim, hãy tự động đọc lại. Khi tập tin đã bị xóa, điều này không được thực hiện.

Câu trả lời này thêm một cảnh báo:

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 về giải pháp.

Kích hoạt khi con trỏ dừng di chuyển

Thêm vào của bạn vimrc:

au CursorHold,CursorHoldI * checktime

Theo mặc định, CthonHold được kích hoạt sau khi con trỏ vẫn duy trì trong 4 giây và có thể định cấu hình qua thời gian cập nhật .

Kích hoạt thay đổi bộ đệm hoặc tập trung đầu cuối

Thêm phần sau vào của bạn vimrcđể kích hoạt autoreadkhi thay đổi bộ đệm trong khi bên trong vim:

au FocusGained,BufEnter * :checktime

Bắt cửa sổ thiết bị đầu cuối tập trung bên trong vim đồng bằng

Để FocusGained(xem ở trên) hoạt động trong vim đơn giản, bên trong trình giả lập thiết bị đầu cuối (Xterm, tmux, v.v.) 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

Gói (lại

Thông báo khi autoreadkích hoạt cũng có thể .

Dưới đây là vimrcdòng của tôi để thực hiện tất cả các điều trên:

" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
autocmd FocusGained,BufEnter,CursorHold,CursorHoldI * if mode() != 'c' | checktime | endif
" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
  \ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None

Cảm ơn ErichBSchulz đã chỉ cho tôi đi đúng hướngau CursorHold .


2
bài tuyệt vời! Cảm thấy giống như một trong những điều mà đây phải là hành vi mặc định
JonnyRaa
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.