Как получить список последних закрытых файлов в emacs?

Иногда я получал зудящий палец и убивал некоторый буфер, который я хотел похоронить вместо этого. Проблема в том, что я использую tramp для редактирования файлов с нескольких компьютеров, и эти имена файлов становятся длинными и неприятными, и, как правило, я не так хорошо разбираюсь в том, где мои файлы в любом случае. Поэтому я хотел бы, чтобы emacs отслеживал файлы, которые я только что закрыл, чтобы я мог их легко открыть (через, в идеале, приглашение ido).

Вот что я до сих пор не работаю:

(defvar closed-files '())

(defun track-closed-file ()
  (message buffer-file-name)
  (and buffer-file-name
       (cons  buffer-file-name closed-files)))

(defun last-closed-files ()
  (interactive)
  (find-file (ido-completing-read "Last closed: " closed-files)))

(add-hook 'kill-buffer-hook 'track-closed-file)

Я действительно не очень хорош в elisp и, вероятно, беспорядок где-то в определении переменной и добавлении к ней ячейки...

[Я знаю о recentf, но это отслеживает открытые файлы, а не закрытые файлы.]

Ответы

Ответ 1

Я только что протестировал это, и он работает с использованием списка и add-to-list Это также устраняет повторяющиеся записи. Соответствует ли это вашим потребностям?

(defvar closed-files (list))

(defun track-closed-file ()
  (message buffer-file-name)
  (and buffer-file-name
       (add-to-list 'closed-files buffer-file-name)))

(defun last-closed-files ()
  (interactive)
  (find-file (ido-completing-read "Last closed: " closed-files)))

(add-hook 'kill-buffer-hook 'track-closed-file)

Update

Мне очень нравится эта функциональность и поместила ее в мою конфигурацию emacs. Вы можете также воспользоваться изменениями, которые я сделал.

Это добавление приведет к тому, что последние закрытые файлы будут отправлены в список списка, даже если они были ранее закрыты (и уже находятся в списке closed-files).

(defun track-closed-file ()
  (and buffer-file-name
       (message buffer-file-name)
       (or (delete buffer-file-name closed-files) t)
       (add-to-list 'closed-files buffer-file-name)))

Ваша первоначальная проблема заключалась в том, что cons вернет вам новый список, а не манипулирует списком ввода:

(setq mylist '(2 3))
 => (2 3)
(cons 1 mylist)
 => (1 2 3)
mylist
 => (2 3)

в этом случае вам нужно будет:

(setq mylist (cons 1 mylist))
  => (1 2 3)
mylist
  => (1 2 3)

Ответ 2

Вы пытались использовать recentf? Он должен быть снабжен Emacs.

Я изначально увидел его через подсказки Power-user от XSteve Emacs, где он предлагает привязать его к F12 и предоставляет интерактивный интерфейс:

;;recentf
(require 'recentf)
(recentf-mode 1)
(setq recentf-max-saved-items 500)
(setq recentf-max-menu-items 60)
(global-set-key [(meta f12)] 'recentf-open-files)

(defun xsteve-ido-choose-from-recentf ()
  "Use ido to select a recently opened file from the `recentf-list'"
  (interactive)
  (let ((home (expand-file-name (getenv "HOME"))))
    (find-file
     (ido-completing-read "Recentf open: "
                          (mapcar (lambda (path)
                                    (replace-regexp-in-string home "~" path))
                                  recentf-list)
                          nil t))))

[обновление]: whups, просто увидел вашу заметку о недавнем осознании. Правда, это для всех открытых файлов, поэтому он также включал те, которые в настоящее время находятся в открытых буферах. Поскольку я только когда-либо обращался к нему, когда пытаюсь найти недавно закрытый файл, я никогда не думал об этом. Тем не менее, возможно, фильтрация открытых файлов с этого вывода может быть проще, чем переосмысление всего колеса?

Ответ 4

Думали ли вы о переупорядочивании "C-x k" для бурения-буфера вместо kill-buffer? (После этого вы можете периодически очищать список буфера с помощью "midnight.el", если это необходимо.)

Ответ 5

Эта красивая функция также доступна как часть пакета "ничего". Сильно предложите сделать это.

Но "что-нибудь" имеет более новую версию под названием "helm", которая, похоже, не имеет этого особенность.