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.
sumber
B2
buffer pada contoh Anda. Saya menggunakan fungsi yang sangat mirip (kemungkinan besar berasal dari cuplikan ini) dan telah berfungsi dengan baik.C-x s
"file no longer exists"
.. aha! versi saya memperbaiki itu :) Akan mempostingnya segera.Jawaban:
Asli
Ini cuplikan versi saya yang sedikit ditingkatkan dalam pertanyaan. Meninjau riwayat VC saya, saya mengonfirmasi bahwa cuplikan di bawah ini dimulai sebagai cuplikan yang diposting oleh OP. Jadi saya membayar atribut untuk itu.
Inilah kode yang stabil untuk saya:
Memperbarui
Berikut adalah versi yang lebih baik dan terdokumentasi dari atas setelah melihat solusi @ Drew .
Referensi
sumber
Lain:
sumber
dolist
gaya untuk menggantikancar
danpop
. Lucu bagaimana Anda dapat terus meningkatkan konfigurasi Anda saat Anda mempelajari lebih lanjut elisp :)Saya menerima jawaban Kausal karena itu paling dekat dengan apa yang saya inginkan, tetapi saya mengambil bagian dari solusi Drew juga. Aku membungkus
revert-buffer
diwith-demoted-errors
dan menjatuhkan:preserve-modes
parameter sehingga checker sintaks saya akan kembali mengurai semua file yang terbuka saya. Saya juga membiarkannya membunuh file yang dimodifikasi dan tidak dimodifikasi, karena saya sering mendapat masalah dengan secara tidak sengaja-C-x s
setelahgit checkout
file yang dimodifikasi terbuka.Versi terakhir adalah:
sumber
Saya akan memperbaikinya dengan
condition-case
atauignore-errors
(docs di sini ) Saya tidak tahu persis apa yang ingin Anda lakukan ; jika Anda ingin melakukan sesuatu dengan kesalahan, jika Anda dapat menggunakancondition-case
untuk menentukan hasilnya, atau Anda dapat menggunakanignore-errors
untuk melanjutkan saja. Sesuatu seperti:sumber
Berdasarkan jawaban @ Drew, dengan tambahan:
sumber