Иногда я случайно убиваю буфер и хочу открыть его, как CSt, чтобы отменить закрытую вкладку в Firefox, но в Emacs нет встроенной команды, defun undo-kill-buffer
в 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)))))
не работает вообще. Если вы знаете, elisp, как решить эту проблему?
Если он может показать список закрытых буферов и их, я могу выбрать один из них, чтобы открыть, что было бы лучше.
buffers
undo
kill-buffer
CodyChan
источник
источник
Ответы:
Вот еще одна простая альтернатива, которая не требует
recentf
. Подключив первую функцию, выkill-buffer-hook
получите имя файла, связанного с буфером, в список. (Обратите внимание, что если вы убьете буфер, который не посещает файл, он исчезнет навсегда.) Последняя функция извлекает этот файл из списка и посещает его:Обратите внимание, что
killed-file-list
это список, поэтому вы можете, например, написать более сложную функцию для циклического перемещения по этому списку, а не простую, описанную здесь: вам решать, сколько вы хотите с ним сделать.РЕДАКТИРОВАТЬ: извините, я пропустил последнее положение в вашей Q о желании список файлов, из которых можно выбирать. Следующая функция немного сложнее, чем версия выше, поскольку она
completing-read
позволяет вам указать, какой из уничтоженных файлов вы хотите. Если вы используете что-то подобноеido
, это позволит вам циклически просматривать все файлы, которые вы убили в текущем сеансе, по умолчанию - самые последние. Обратите внимание, что это предполагает, что вы уже требовалиcl-lib
:источник
Я хотел бы спросить вас: «Вы действительно хотите убить это?». Действительно, уничтожение буфера - это обычное явление в мире Emacs, но после его уничтожения буфер исчезает, и, как показывает ваш вопрос, это не всегда желательно.
Однако мы можем выбрать другой способ, чтобы вам никогда не приходилось восстанавливать уничтоженный буфер - просто предпочитайте хоронить, а не убивать. Взгляните на пакет Kill или Bury Alive , он доступен через MELPA .
Из описания пакета:
источник
Я использую это решение из этого поста, и он отлично работает.
Решение элегантное, но не идеальное; он хранит список активных буферов и возвращает первый файл из списка latestf, который не принадлежит списку активных буферов.
источник
Вам нужно включить
recentf-mode
. Для этого бегиM-x recentf-mode
. Тогда функция может не работать, пока вы не откроете или не уничтожите несколько новых буферов; Я не думаю, что выrecentf-list
заполнили.Если вы хотите, чтобы это было включено при запуске Emacs, поместите это в ваш файл инициализации:
Затем вы можете положить
defun
найденный там и привязать его к ключу, если хотите.Недостатком этого режима является то, что недавно созданный режим предназначен для отслеживания
opened
файлов, а не уничтоженных. Таким образом, если вы запустите эту функцию дважды, она не откроет ваш второй из недавно уничтоженных файлов.источник
(recentf-mode 1)
с явным аргументом, так что кто-то, переоценивающий свой файл инициализации в Emacs 23, не заканчивал тем, что снова выключал режим.ErgoEmacs имеет функцию,
close-current-buffer
которая, в частности, хранит список недавно закрытых буферов:Таким образом, используя их, можно заново открыть этот закрытый буфер сессии с
источник
Ну, я не ветеран Emacs, и, возможно, это стало возможно только в последних версиях. Я знаю, что приду через несколько лет, но, возможно, это может быть полезно для других, так как мои поиски привели меня сюда.
Я нахожусь на Emacs v25.2.1,
recentf
уже доступен здесь и имеет готовую функцию, которая делает то, что вам нужно. Я уже активировал его в прошлом на старых версиях, поэтому у меня.emacs
есть:И это отлично сработало для меня. Конечно, измените ярлык на то, что вам больше нравится.
источник