Bagaimana cara memuat ulang file saat ini?

145

Cukup sering saya bekerja dengan file yang dikontrol versi, sehingga dimungkinkan untuk membuat perubahan di luar Vim.

Apa cara cepat untuk memuat ulang file tanpa harus menutup dan membuka kembali Vim? Dan adakah cara untuk melakukan ini secara otomatis?

Kevin Brown
sumber
" Compare buffer with saved version nnoremap gd :DiffSaved<CR>
Tom Hale
Jika Anda telah menginstal vim-faq , Anda bisa mendapatkan jawaban offline di sana: :h vim-faqdan cari /reload. Tag yang sulit diingat adalah :h faq-5.8.
Hotschke

Jawaban:

172

Perintah yang Anda inginkan adalah :e(kependekan dari :edit). Jika Anda menggunakannya :edit!akan membuang perubahan lokal dan memuat ulang.

Anda juga dapat melakukan vim secara otomatis dengan set autoreadvimrc Anda.

xthrd
sumber
5
Lihat jawaban ini untuk peringatan dan solusi tentang autoread.
Tom Hale
4
Untuk melakukan ini untuk semua buffer, gunakan :bufdo :eatau:bufdo :e!
Aaron H.
1
@ Harun. Terima kasih untuk itu! saya biasanya memiliki ratusan buffer terbuka pada suatu waktu dan ketika berganti cabang, saya biasanya hanya menutup vim dan restart untuk menyegarkan semua buffer dengan konten baru. Ini akan menjadi penghemat waktu utama!
g19fanatic
1
@ Harun. Yang kedua :adalah opsional: :bufdo eakan bekerja sama.
JoL
19

Dalam banyak kasus, set autoreadtidak akan berfungsi karena jawaban ini menjelaskan:

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

Acara fokus akan memicu autoread, tetapi ini tidak ditangkap kecuali menggunakan gvim. Jadi, jika menjalankan polos vimdi dalam jendela terminal atau tmux, instal plugin vim-tmux-focus-events .

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

set -g focus-events on

Untuk kebaikan tambahan, menambahkan hal berikut ke vimrcpemicu keinginan Anda autoreadsaat mengganti buffer di dalam saat berada di dalam vim:

au FocusGained,BufEnter * :checktime
Tom Hale
sumber
Ini telah mengganggu saya selama bertahun-tahun. Terima kasih atas solusi menyeluruhnya! 💯😄
Nathan Long
9

Jika Anda pernah menjalankan perintah eksternal dari Vim yang memodifikasi buffer saat ini, Anda mungkin telah memperhatikan bahwa itu meminta Anda untuk memuat ulang file karena perubahan telah dibuat ke disk. Anda sebenarnya dapat menjalankan prompt ini menggunakan :checktimeperintah.

tommcdo
sumber
3

Plugin yang bagus untuk meningkatkan autoread https://github.com/djoshea/vim-autoread

Secara otomatis menyebabkan vim memuat ulang file yang telah ditulis pada disk tetapi tidak dimodifikasi dalam buffer sejak penulisan terakhir dari vim. Ini memungkinkan file yang terbuka di vim diedit menggunakan aplikasi lain dan disimpan. Setelah kembali ke vim, selama Anda belum mengubah file sejak perubahan terakhir, file akan diperbarui secara otomatis untuk mencerminkan perubahan yang dibuat pada disk, seolah-olah Anda telah menekan: e secara manual.

und3rdg
sumber
Selamat datang di Pertukaran Vi Stack. Ini hampir merupakan jawaban tautan saja. Anda dapat memperbaikinya dengan menjelaskan plugin (mis. Apa fungsinya? Bagaimana orang menggunakannya untuk mencapai tujuan OP?)
John O'M.
0

Saya memiliki masalah dalam melihat isi file, memperbarui file secara eksternal, menampilkan file yang diubah dan memiliki opsi untuk mengeditnya saat diperlukan. Saya menyelesaikannya dengan opsi server Vim / baris perintah jarak jauh, terinspirasi oleh jawaban ini .


Dengan perintah berikut, file dapat dimuat ulang melalui perintah eksternal. Pertama, buka file yang dimaksud dengan Vim, sambil memulai contoh server.

vim --servername JABBERWOCKY /tmp/alice.log

Mari kita asumsikan file telah diubah secara eksternal, misalnya oleh a echo "Curiouser and curiouser" >> /tmp/alice.log. Bila perlu, kirim perintah ke instance server untuk memuat ulang file. Perintah ini akan selesai dengan cepat dan tidak menelurkan editor baru.

vim --servername JABBERWOCKY --remote-send ":e<CR>"

Jika file yang dibuka diubah dalam Vim dan secara eksternal, akan ada konflik saat memuat ulang (pesan peringatan akan muncul). Untuk itu keputusan harus dibuat: Biarkan saja dan simpan perubahan di Vim, atau buang perubahan lokal dan paksa muat ulang .


Perintah di --remote-sendatas membutuhkan pemuatan manual. Namun, perintah itu dapat diikat ke loop sederhana, menggunakan Bash's for/ while, atau menggunakan one-liner yang rusak di Linux / Unix:

watch -n 1 'vim --servername JABBERWOCKY --remote-send ":e<CR>"'

Meskipun tidak diuji, saya yakin sesuatu seperti ini dapat direalisasikan di PowerShell juga.

Di Linux / Unix pendekatan yang digerakkan oleh peristiwa dapat diwujudkan dengan mendengarkan acara sistem file menggunakan misalnya perpustakaan inotify , jika Anda tidak menggunakan sistem file yang terlalu gila. Secara pribadi saya suka menggunakan alat entr banyak, yang tampaknya termasuk dalam distribusi Linux utama. Lalu saya mendapatkan:

echo /tmp/alice.log | entr vim --servername JABBERWOCKY --remote-send ":e<CR>"
Piscoris
sumber