Bagaimana cara memuat ulang file dalam buffer?

110

Saya biasanya bekerja pada file yang diperbarui dalam sistem file melalui kontrol versi. Apa cara cepat untuk memuat ulang file tanpa harus ke C-x C-ffile lagi dan ditanya apakah saya ingin memuat ulang?

Fernando Briano
sumber

Jawaban:

117

M-x revert-bufferakan melakukan apa yang Anda inginkan. Masih akan meminta konfirmasi.

Pilihan lain (favorit saya) adalah fungsi di bawah ini:

;; Source: http://www.emacswiki.org/emacs-en/download/misc-cmds.el
(defun revert-buffer-no-confirm ()
    "Revert buffer without confirmation."
    (interactive)
    (revert-buffer :ignore-auto :noconfirm))
Kaushal Modi
sumber
8
Anda mungkin telah dikutip perpustakaan bahwa kode yaitu dari: misc-cmds.el. Bukannya rumit, tetapi ketika Anda menyalin sesuatu dengan tepat, itu adalah hak umum untuk menunjuk ke sumbernya.
Drew
3
Permintaan maaf! Saya sendiri, tidak yakin dari mana saya mendapat potongan itu. Saya seharusnya sudah setidaknya googled nama fungsi dan mencoba mencari sumbernya sehingga saya bisa kredit di sini. Pembaruan Saya telah mencatat sumber untuk semua yang saya salin; hanya tidak yakin tentang yang ini: github.com/kaushalmodi/.emacs.d/blob/master/setup-files/…
Kaushal Modi
4
Saya tidak akan merekomendasikan fungsi ini. Terlalu berbahaya untuk digunakan secara tidak sengaja pada file yang dimodifikasi.
Gilles
2
@Gilles Saya setuju, dengan kekuatan besar datang tanggung jawab besar. Saya tidak akan mengikat itu ke akses yang mudah mengikat.
Kaushal Modi
6
Varian saya tentang ini akan meminta konfirmasi hanya jika buffer diubah, menggunakan (revert-buffer t (not (buffer-modified-p)) t).
glukas
55

Ada juga auto-revert-modeyang melakukannya secara otomatis dan memberi Anda umpan balik.

Dari string doc:

auto-revert-mode is an interactive autoloaded compiled Lisp function
in `autorevert.el'.

(auto-revert-mode &optional ARG)

Toggle reverting buffer when the file changes (Auto Revert mode).
With a prefix argument ARG, enable Auto Revert mode if ARG is
positive, and disable it otherwise.  If called from Lisp, enable
the mode if ARG is omitted or nil.

Auto Revert mode is a minor mode that affects only the current
buffer.  When enabled, it reverts the buffer when the file on
disk changes.

Use `global-auto-revert-mode' to automatically revert all buffers.
Use `auto-revert-tail-mode' if you know that the file will only grow
without being changed in the part that is already in the buffer.
thermans
sumber
50

Opsi lain, yang saya gunakan, find-alternate-fileterikat C-x C-v. Ini membuka file menggunakan kembali buffer Anda saat ini.

Secara default, ini menunjuk ke file Anda saat ini, sehingga Anda bisa mengetik C-x C-v RETuntuk memuat ulang file Anda. Ini tidak akan diminta kecuali buffer Anda memiliki data yang belum disimpan.

Beberapa mode non-teks seperti image-mode(yang digunakan untuk rendering gambar, PDF, svgs ... dll) dan diredtelah revert-bufferterikat guntuk akses lebih cepat.

Tikhon Jelvis
sumber
3
Ini adalah tujuan baru saya. Terima kasih telah menyebutkannya.
ramsey_tm
Saya memiliki (ffap-binding) di .emacs saya yang tampaknya mengubah pengikatan C-x C-v.
ychaouche
Ini bagus, terima kasih! Sederhana dan efektif. Btw, bagaimana cara membuat Emacs melihat file saat ini berubah? Misalnya VIM dalam mode GUI mendeteksi perubahan file secara otomatis ketika aplikasi mendapatkan fokus (dialihkan dari latar belakang).
mato
Ini harus menjadi jawaban yang diterima.
Toon Claes
10

Emacs menyebut ini reverting.

Anda dapat mengembalikan file saat ini dengan M-x revert-buffer. Ini meminta konfirmasi apakah file telah dimodifikasi atau belum, kecuali untuk file yang cocok dengan pola yang tercantum dalam variabel revert-without-query(lihat manual untuk detail). Gangguan sesekali lainnya revert-bufferadalah bahwa ia mengatur ulang mode file ke default.

Saya menggunakan fungsi berikut untuk mengembalikan banyak file, yang diberikan namanya. Jika file tidak dibuka di beberapa buffer, file itu diabaikan.

(defun revert-files (&rest files)
  "Reload all specified files from disk.
Only files that are currently visited in some buffer are reverted.
Do not ask confirmation unless the buffer is modified."
  (save-excursion
    (let ((revert-without-query '("")))
      (dolist (file-name files)
        (message "Considering whether to revert file %s" file-name)
        (let ((buf (find-buffer-visiting file-name)))
          (when buf
            (message "Reverting file in buffer %s" (buffer-name buf))
            (set-buffer buf)
        (revert-buffer t nil t)))))))

Kasus penggunaan umum untuk fungsi ini adalah setelah memperbarui file dari kontrol versi. Gunakan emacsclientuntuk memanggil revert-filessemua file yang telah diperbarui, atau (ini lebih mudah, dan hanya sedikit lebih lambat) pada semua file yang terkait dengan pembaruan. Saya memanggil skrip shell berikut, meneruskannya file sebagai argumen:

#! /bin/sh
# Similar to gnuclient, but call `revert-files' on the files.
files=

## Find a way to convert a path to absolute. Bizarre OSes such as Windows
## require special cases. We also try to detect non-filenames such as URIs.
case `uname -s` in
  CYGWIN*)
    absolute_path () {
      cygpath -a -w -- "$1"
    };;
  *)
    wd="`pwd -P 2>/dev/null || pwd`"
    absolute_path () {
      case "$1" in
        /*) printf '%s' "$1";; # ordinary absolute path
        *:/*)
          if expr "z$1" : 'z[0-9A-Z_a-z][-.0-9@A-Z_a-z]*:/.*'; then
            printf '%s' "$1" # URI or machine:/some/path
          else
            printf '%s' "$wd/$1" # default to a relative path
          fi;;
        *) printf '%s' "$wd/$1";; # default to a relative path
      esac
    };;
esac

for x; do
  files="$files \"`absolute_path "$x" | sed 's/[\\\\\\\"]/\\\\&/g'`\""
done
exec emacsclient -e "(revert-files$files)"

Contoh penggunaan:

svn update
find -name .svn -prune -o -type f -exec emacsclient-revert {} +
Gilles
sumber
Saat ini, seperti yang dikatakan @webappzero dalam jawabannya, magit memecahkan bagian dari masalah pengembalian file ini tanpa rasa sakit
Croad Langshan
8

Anda juga dapat mengaktifkan global-auto-revert-mode seperti yang ditunjukkan di bawah ini

(global-auto-revert-mode 1)

ini berguna ketika Anda melakukan banyak pemeriksaan file js Anda dengan mode perbaikan otomatis diaktifkan, seperti di jssc.

DmitrySemenov
sumber
7

revert-bufferdisana. Tapi saya ingin mendapat tanggapan.

Saya memiliki yang berikut di blog saya .emacs.

(global-set-key (kbd "C-c r") (lambda ()
                                (interactive)
                                (revert-buffer t t t)
                                (message "buffer is reverted")))
baik hati
sumber
3

Anda dapat menggunakan find-alternate-file, yang terikat C-x C-vsecara default, dan cukup ketik RETpada prompt untuk memuat ulang file.

DoMiNeLa10
sumber
3

Untuk pengguna spacemacs: SPC b R( spacemacs/safe-revert-buffer).

Untuk melewatkan konfirmasi, jawaban lain sudah mencakup itu, meskipun saya setuju dengan yang lain bahwa itu mungkin bukan ide yang baik untuk mengikat itu ke kunci.

Langshan Croad
sumber
2

Magit mengelola pengembalian file untuk Anda secara otomatis, sehingga menyelesaikan masalah inti Anda. Anda juga mendapat manfaat dari fitur lainnya.

Berikut adalah dokumen untuk mengubah pengaturan yang Anda minati:

Jika Anda tetap menggunakan Magit, pastikan juga untuk mengaktifkan ketiga mode WIP global (Work In Progress) untuk menghindari kehilangan pekerjaan.

Dengan demikian Anda dapat melakukan tindakan kontrol versi di dalam Emacs dengan Magit dan menghindari masalah asli Anda sekaligus.

webappzero
sumber
1
Tolong beri tahu saya jika ini bermanfaat.
webappzero
Jawaban ini seharusnya memiliki lebih banyak suara positif! Seandainya tidak jelas: mode WIP mungkin baik (saya tidak menggunakannya saat ini), tetapi mereka tidak sepenuhnya diperlukan agar dapat memecahkan masalah pengembalian untuk Anda.
Croad Langshan