Bagaimana saya bisa secara otomatis menutup buffer ketika file yang mendasarinya dihapus?

9

Saya membiarkan Emacs berjalan sepanjang hari, dan sering akan melakukan banyak manipulasi sistem file pada file yang terbuka di buffer Emacs. Sebagai contoh, saya mungkin beralih ke cabang lain di Git yang memiliki struktur direktori yang sangat berbeda.

Sayangnya ini membuat saya dengan sekelompok buffer terbuka yang sekarang terdaftar Emacs sebagai buffer "dimodifikasi" mengacu pada file "baru". Kecuali saya berhati-hati untuk menutupnya secara manual setiap kali saya melakukan ini, mudah untuk secara refleks menyimpan buffer yang kemudian menghasilkan file palsu, mungkin duplikat dalam proyek saya. Saya bahkan tidak dapat menutup emacs tanpa menjawab pertanyaan "simpan buffer ini" untuk masing-masing.

Apakah ada cara untuk secara otomatis menutup buffer yang tidak dimodifikasi ketika file yang mendasarinya menghilang? Mirip dengan semangat global-auto-revert-modeyang juga menangani ketika file dihapus seluruhnya?

levand
sumber
Lihatlah bagian manual Emacs 38.20 Pemberitahuan tentang Perubahan File
izkon

Jawaban:

6

Saya pikir sesuatu di sepanjang garis ini bisa bekerja:

(defun buffer-backed-by-file-p (buffer)
  (let ((backing-file (buffer-file-name buffer)))
    (if (buffer-modified-p buffer)
        t
      (if backing-file
          (file-exists-p (buffer-file-name buffer))
        t))))

(mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))

The buffer-backed-by-file-pcek fungsi jika file tersebut didukung oleh file - jika tidak, kembali benar, jika tidak kembali jika file backing ada. Kami kemudian mengambil daftar buffer, memfilter apa pun kecuali yang memiliki file dukungan, tetapi file itu tidak ada, dan kemudian membunuh mereka.

Membutuhkan dash.el untuk -hapus, karena saya terlalu malas untuk menemukan built-in untuk mencapai hal yang sama.

Semoga ini membantu!

algernon
sumber
Anda masih harus menjalankan mapcperintah itu setiap kali Anda ingin agar buffer-bukan-didukung-oleh-file dihapus, bukan? Jadi itu tidak sepenuhnya otomatis. Untuk otomatisasi penuh, Anda harus memastikan bahwa mapcberjalan berulang kali sendiri atau menggunakan sesuatu seperti inotifymenjalankannya untuk Anda ketika file benar-benar dihapus.
izkon
Ya, seseorang perlu menjalankan ini secara berkala, atau sebagai tanggapan untuk memberitahukan kejadian atau sejenisnya. Saya sendiri, saya baru saja menjalankannya secara berkala, setiap menit atau lebih. Tidak sempurna, tetapi cukup baik untuk sebagian besar kasus. (run-with-timer 60 60 (lambda () (mapc 'kill-buffer (-remove 'buffer-backed-by-file-p (buffer-list)))))adalah apa yang saya gunakan sebagai perkiraan pertama.
algernon
1
Diimplementasikan ini, dan itu berhasil hebat. Saya menggunakan fungsi pembungkus kecil ini untuk memanggilnya, kalau-kalau ada yang membutuhkan sesuatu yang serupa: `(defun kill-dihapus-buffer () (interaktif) (biarkan ((untuk-membunuh (-hapus 'buffer-didukung-oleh-file-p) (buffer-list)))) (mapc 'kill-buffer to-kill) (pesan "Buffer% s buffer" (panjang to-kill)))) `Maaf saya tidak bisa memformatnya dengan benar di kotak komentar .
Levand