menyegarkan konten yang diubah dari file yang dibuka di vi (m)

362

Saya memiliki file konfigurasi yang saya tetap buka di vim, tapi itu kadang-kadang berubah pada disk, tanpa perubahan ini tercermin pada terminal. Bisakah saya menyegarkan konten di layar tanpa menutup dan membuka kembali file? Jika ya, bagaimana caranya?

twan163
sumber
Mengakhiri: semua jawaban sejauh ini adalah dari "Poll" bukan gaya "Push". Artinya, alih-alih menerima acara perubahan file eksternal seperti yang dilakukan oleh fitur serupa perangkat lunak lain, jawaban ini bergantung pada vim yang secara aktif melakukan polling terhadap perubahan file, baik secara manual atau dipicu oleh aksi pengguna atau timer. Hasil akhirnya adalah Anda tidak akan melihat perubahan disegarkan di layar secara instan.
Penghe Geng

Jawaban:

464

Anda dapat menggunakan :editperintah, tanpa menentukan nama file, untuk memuat ulang file saat ini. Jika Anda telah membuat modifikasi pada file, Anda dapat menggunakan :edit!untuk memaksa memuat ulang file saat ini (Anda akan kehilangan modifikasi Anda).

Perintah :editdapat disingkat dengan :e. Suntingan paksa dapat dilakukan dengan:e!

Thushi
sumber
2
"!" telah membuatku tersandung, tapi sekarang sudah jelas.
twan163
107
Catatan: itu biasanya disingkat :e!.
Stéphane Chazelas
31
@StephaneChazelas: Ya, Itu benar :) @ twan163: Alih-alih :editdan :edit!Anda dapat menggunakan masing :e- :e!masing.
Thushi
11
Kalah modifikasi, ya dan tidak. Yang terpenting, Anda masih dapat umelakukannya :e!.
gerrit
5
Juga, jika Anda ingin memuat ulang semua buffer Anda, jalankan::bufdo e
pkout
193

Selain untuk menyegarkan file secara manual :edit, Anda dapat memasukkannya ke dalam~/.vimrc

:set autoread

untuk membuat Vim secara otomatis me-refresh file apa pun yang belum diedit oleh Vim. Lihat juga :checktime.

Ingo Karkat
sumber
2
Waspadai pembeli - Jika Anda mengerjakan kode baru dan git pullsadar Anda bisa kehilangan perubahan yang belum disimpan di layar secara tidak sengaja.
azatar
5
@toszter Tidak, Vim hanya akan menyegarkan buffer yang tidak berubah . Jika ada perubahan, masih akan ada kueri: Simpan, atau muat?
Ingo Karkat
10
NB autoread tidak berfungsi secara otomatis. Anda harus menggunakan gvim, atau menjalankan perintah eksternal.
Sparhawk
3
Mereka yang menggunakan vim di dalam tmux bisa mendapatkan acara fokus dengan menggunakan github.com/tmux-plugins/vim-tmux-focus-events . Kalau tidak, autoread tidak akan membantu di terminal kecuali Anda entah bagaimana memanggilnya:checktime
Karl Bartel
3
autoreaddapat dipicu secara otomatis X detik setelah kursor berhenti bergerak, lihat jawaban ini .
Tom Hale
57

TL; DR

Lewati ke Wrap-uptajuk untuk vimrcditambahkan baris agar kehidupan Anda lebih baik.

Secara manual

Lari :checktime

Periksa apakah ada buffer yang diubah di luar Vim. Ini memeriksa dan memperingatkan Anda jika Anda akan berakhir dengan dua versi file.

Secara otomatis

Untuk melakukan perubahan secara otomatis, tambahkan vimrc:

set autoread

Ketika suatu file telah terdeteksi telah diubah di luar Vim dan itu belum diubah di dalam Vim, secara otomatis membacanya lagi. Ketika file telah dihapus ini tidak dilakukan.

Jawaban ini menambahkan peringatan:

Autoread tidak memuat ulang file kecuali jika Anda melakukan sesuatu seperti menjalankan perintah eksternal (suka !lsatau !shdll)

Baca terus untuk solusinya.

Pemicu ketika kursor berhenti bergerak

Tambahkan ke Anda vimrc:

au CursorHold,CursorHoldI * checktime

Secara default, CursorHold dipicu setelah kursor masih diam selama 4 detik, dan dapat dikonfigurasi melalui waktu pembaruan .

Pemicu pada perubahan buffer atau fokus terminal

Tambahkan yang berikut ke vimrcpemicu Anda autoreadsaat mengganti buffer saat berada di dalam vim:

au FocusGained,BufEnter * :checktime

Menangkap fokus jendela terminal di dalam vim polos

Agar FocusGained(lihat di atas) berfungsi di plain vim, di dalam terminal emulator (Xterm, tmux, dll) instal plugin: vim-tmux-focus-events

Pada versi tmux> 1.9, Anda harus menambahkan .tmux.conf:

set -g focus-events on

Bungkus

Pemberitahuan ketika autoreadpemicu juga dimungkinkan .

Inilah vimrcbaris saya untuk mengimplementasikan semua hal di atas:

" 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

Terima kasih kepada ErichBSchulz karena mengarahkan saya ke arah yang benarau CursorHold .

Tom Hale
sumber
2
pos luar biasa! Terasa seperti salah satu dari hal-hal di mana ini seharusnya menjadi perilaku default
JonnyRaa