Ketika mengerjakan proyek di bawah kontrol versi dengan git, saya sering ingin melakukan beberapa hal dalam shell yang memengaruhi banyak file terbuka saya, lalu kembalikan setiap buffer yang saya buka untuk memastikan bahwa saya tidak secara tidak sengaja merusak versi baru dengan apa pun yang saya buka. Saya tahu magit
bisa membantu di sini, tapi saya terbiasa dengan alur kerja saya di shell dan saya ingin menyimpannya untuk saat ini. Jadi sebagai gantinya, saya ingin mengembalikan semua buffer yang terbuka, dan mungkin menutup semua yang sudah berhenti ada (misalnya karena git checkout
cabang yang tidak lagi memiliki file itu).
Saya memiliki cuplikan elisp berikut yang saya ambil dari pencarian Google:
(defun revert-all-buffers ()
"Refreshes all open buffers from their respective files"
(interactive)
(let* ((list (buffer-list))
(buffer (car list)))
(while buffer
(when (and (buffer-file-name buffer)
(not (buffer-modified-p buffer)))
(set-buffer buffer)
(revert-buffer t t t))
(setq list (cdr list))
(setq buffer (car list))))
(message "Refreshed open files"))
Tapi istirahat ini jika hits kesalahan dalam salah satu file yang terbuka saya, yaitu ketika mengembalikan B1
, B2
, B3
, ..., Bn
kesalahan saat mencoba untuk kembali B2
mencegah B3
- Bn
dari yang dikembalikan.
Bagaimana saya bisa memberitahu emacs untuk mengabaikan kesalahan yang muncul dalam kasus ini? Saya tidak ingin menggunakan global-auto-revert-mode
karena setiap pengembalian memicu beberapa tugas berat seperti auto-complete dan sintaks pemeriksa ulang mengurai file, menggantung emacs selama satu detik atau lebih.
C-x s
"file no longer exists"
.. aha! versi saya memperbaiki itu :) Akan mempostingnya segera.
B2
buffer pada contoh Anda. Saya menggunakan fungsi yang sangat mirip (kemungkinan besar berasal dari cuplikan ini) dan telah berfungsi dengan baik.