Как получить список последних закрытых файлов в 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, просто увидел вашу заметку о недавнем осознании. Правда, это для всех открытых файлов, поэтому он также включал те, которые в настоящее время находятся в открытых буферах. Поскольку я только когда-либо обращался к нему, когда пытаюсь найти недавно закрытый файл, я никогда не думал об этом. Тем не менее, возможно, фильтрация открытых файлов с этого вывода может быть проще, чем переосмысление всего колеса?
Ответ 3
Способ сделать это:
https://github.com/ajvargo/Lazarus
Ответ 4
Думали ли вы о переупорядочивании "C-x k" для бурения-буфера вместо kill-buffer? (После этого вы можете периодически очищать список буфера с помощью "midnight.el", если это необходимо.)
Ответ 5
Эта красивая функция также доступна как часть пакета "ничего". Сильно
предложите сделать это.
Но "что-нибудь" имеет более новую версию под названием "helm", которая, похоже, не имеет этого
особенность.