Terkadang saya secara tidak sengaja membunuh buffer dan ingin membukanya kembali, seperti halnya CSt untuk membatalkan tab yang tertutup di Firefox, tetapi tidak ada perintah bawaan di Emacs, defun undo-kill-buffer
di http://www.emacswiki.org/RecentFiles :
(defun undo-kill-buffer (arg)
"Re-open the last buffer killed. With ARG, re-open the nth buffer."
(interactive "p")
(let ((recently-killed-list (copy-sequence recentf-list))
(buffer-files-list
(delq nil (mapcar (lambda (buf)
(when (buffer-file-name buf)
(expand-file-name (buffer-file-name buf)))) (buffer-list)))))
(mapc
(lambda (buf-file)
(setq recently-killed-list
(delq buf-file recently-killed-list)))
buffer-files-list)
(find-file
(if arg (nth arg recently-killed-list)
(car recently-killed-list)))))
tidak bekerja sama sekali. Jika Anda tahu sedikit, bagaimana mengatasi masalah ini?
Jika itu dapat menunjukkan daftar buffer tertutup dan mereka saya dapat memilih satu dari mereka untuk membuka kembali, itu akan lebih baik.
buffers
undo
kill-buffer
CodyChan
sumber
sumber
Jawaban:
Inilah alternatif sederhana lain yang tidak diperlukan
recentf
. Mengaitkan fungsi pertama ke dalamkill-buffer-hook
akan mendorong nama file yang terkait dengan buffer ke daftar. (Perhatikan bahwa, jika Anda membunuh buffer yang tidak mengunjungi file, itu akan hilang selamanya.) Fungsi yang terakhir mengeluarkan file itu dari daftar dan mengunjunginya:Perhatikan itu
killed-file-list
adalah daftar, jadi Anda bisa, misalnya, menulis fungsi yang lebih rumit untuk menelusuri daftar itu, daripada yang sederhana yang dijelaskan di sini: terserah Anda seberapa banyak yang ingin Anda lakukan dengannya.EDIT: maaf, saya melewatkan ketentuan terakhir di Q Anda tentang menginginkan daftar file yang dapat dipilih. Fungsi berikut sedikit lebih bagus daripada versi di atas sejauh yang digunakan
completing-read
untuk membiarkan Anda menentukan file yang Anda inginkan. Jika Anda menggunakan sesuatu sepertiido
, itu akan memungkinkan Anda menggilir semua file yang telah Anda bunuh di sesi saat ini, default ke yang terbaru. Perhatikan bahwa ini mengandaikan bahwa Anda telah dimintacl-lib
:sumber
Saya ingin bertanya: "Apakah Anda benar-benar ingin membunuhnya?" Memang, membunuh penyangga adalah hal yang biasa di dunia Emacs, tetapi begitu terbunuh, penyangga hilang, dan seperti yang ditunjukkan pertanyaan Anda, itu tidak selalu diinginkan.
Namun kita dapat memilih cara lain, sehingga Anda tidak perlu mengembalikan buffer yang mati - hanya lebih memilih mengubur daripada membunuh. Lihatlah paket Kill atau Bury Alive , tersedia melalui MELPA .
Dari deskripsi paket:
sumber
Saya menggunakan solusi ini dari posting SO ini dan berfungsi dengan baik.
Solusinya elegan tetapi tidak sempurna; itu menyimpan daftar buffer aktif dan mengembalikan file pertama dari daftar -f terbaru yang bukan milik daftar buffer aktif.
sumber
Anda harus menghidupkan
recentf-mode
. Untuk melakukannya, jalankanM-x recentf-mode
. Kemudian, fungsi mungkin tidak berfungsi sampai Anda membuka atau membunuh beberapa buffer baru; Saya pikir Anda tidak akanrecentf-list
mengisinya.Jika Anda ingin ini diaktifkan ketika Emacs mulai, taruh ini di file init Anda:
Anda kemudian dapat meletakkan yang
defun
Anda temukan di sana, dan mengikatnya ke kunci, jika Anda mau.Satu kelemahan dari mode ini tampaknya adalah bahwa mode latestf dibangun untuk melacak
opened
file, bukan yang terbunuh. Jadi, jika Anda menjalankan fungsi dua kali, itu tidak akan membuka kembali file kedua Anda yang paling baru-baru ini terbunuh.sumber
(recentf-mode 1)
dengan argumen eksplisit, sehingga seseorang mengevaluasi kembali file init mereka di bawah Emacs 23 tidak berakhir mematikan mode lagi.ErgoEmacs memiliki fungsi
close-current-buffer
yang secara khusus menyimpan daftar buffer yang baru saja ditutup:Jadi menggunakan ini dapat membuka kembali sesi tertutup dengan buffer ini
sumber
Yah, saya bukan veteran Emacs, dan mungkin ini mungkin telah tersedia hanya pada versi terbaru. Saya tahu saya akan datang beberapa tahun kemudian, tapi mungkin itu bisa membantu orang lain, karena pencarian saya membuat saya di sini.
Saya menggunakan Emacs v25.2.1,
recentf
sudah tersedia di sini dan memiliki fungsi siap yang melakukan apa yang Anda butuhkan. Saya sudah mengaktifkannya di versi sebelumnya, jadi saya.emacs
punya:Dan ini bekerja dengan baik untuk saya. Tentu saja, ubah pintasan untuk apa pun yang Anda sukai.
sumber