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

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


person polyglot    schedule 09.02.2010    source источник


Ответы (5)


Я только что протестировал это, и оно работает с использованием списка и 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)
person kjfletch    schedule 09.02.2010
comment
Оно работает. Несомненно, в новом году нужно выучить lisp для самых основ! - person polyglot; 09.02.2010
comment
Это очень удобно. Я также добавил его в свой .emacs. Спасибо. - person seth; 10.02.2010
comment
Очень хорошо! Один комментарий — вы используете and и or вместе, но when — это все, что вам нужно. Если вы переключите and на when, вы можете удалить or. то есть (when buffer-file-name (message ...) (delete buffer-file-name ...) ...) - person Tyler; 04.11.2011
comment
(message buffer-file-name) вызывает ошибку, когда buffer-file-name содержит %. Например, попробуйте открыть файл tmp%.txt, а затем убить его. Сообщение на самом деле не нужно, поэтому его удаление должно быть в порядке. - person Tyler; 29.08.2013

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

Сначала я увидел это в советах 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))))

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

person Michael Paulukonis    schedule 09.02.2010

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

https://github.com/ajvargo/Lazarus

person Andrew    schedule 03.11.2011

Вы думали о перепривязке "C-x k" к bury-buffer вместо kill-buffer? (Затем вы можете периодически очищать список буферов, добавляя что-то вроде «midnight.el», если это необходимо.)

person sanityinc    schedule 09.02.2010
comment
О Господи. Как бы то ни было, у меня обычно открыто около 50 буферов... Но всегда есть другой способ. - person Michael Paulukonis; 09.02.2010
comment
Ну я перебиндил bury-buffer на shift-F4 и kill-buffer на ctrl-F4, и я иногда путаюсь :) Но я такой чистоплотный урод в отношении своих открытых буферов, что съеживаюсь от ужаса, чтобы не убить всех файл журналов gazillion, который я временно открыл для проверки. - person polyglot; 09.02.2010
comment
Лично я просто позволяю буферам закрываться и использую именно ту интеграцию ido/recentf, о которой упоминал OtherMichael, чтобы при необходимости снова открыть их. Если вы открываете, а затем быстро закрываете файлы, как вы предлагаете в случае с этими файлами журналов, то нет большой разницы между недавно открытыми файлами и недавно закрытыми. - person sanityinc; 09.02.2010

Эта красивая функция также доступна как часть пакета «все». Настоятельно рекомендуем попробовать.

Но у «всего» есть более новая версия под названием «helm», в которой, похоже, нет этой функции.

person user994572    schedule 03.10.2012