Как получить список последних закрытых файлов в emacs? - PullRequest
13 голосов
/ 09 февраля 2010

Иногда у меня зудит палец и я убиваю какой-то буфер, который вместо этого мне хотелось похоронить. Проблема в том, что я использую 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, но он отслеживает открытые файлы, а не закрытые файлы.]

Ответы [ 5 ]

16 голосов
/ 09 февраля 2010

Я только что проверил это, и он работает с использованием списка, и 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)

Обновление

Мне очень нравится эта функциональность, и я поместил ее в мою конфигурацию 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)
5 голосов
/ 09 февраля 2010

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

Первоначально я видел это с помощью Советов опытных пользователей Emacs XSteve , где он предлагает связать его с 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, только что увидел вашу заметку о недавней осведомленности. Правда, это для всех открытых файлов, поэтому он включает и те, которые в настоящее время находятся в открытых буферах. Поскольку я когда-либо обращался к нему только когда пытался отследить недавно закрытый файл, я никогда не думал об этом. Тем не менее, может быть, фильтровать открытые файлы из этого вывода может быть проще, чем заново изобретать все колесо?

1 голос
/ 04 ноября 2011

Способ сделать это:

https://github.com/ajvargo/Lazarus

0 голосов
/ 03 октября 2012

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

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

0 голосов
/ 09 февраля 2010

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

...