В Emacs, как сохранить список последних каталогов?

В Emacs я использую recentf широко. Вместо того, чтобы звонить find-files Вместо этого я обычно вызываю пользовательскую функцию xsteve-ido-choose-from-latestf, которая позволяет мне выбирать из recentf файлы.

Как мне создать и поддерживать отдельный список последних каталогов, отдельный от списка последних файлов? Так что вместо звонка dired Я мог бы назвать что-то вроде ido-choose-from-recent-directories?

3 ответа

Решение

Прагматичный Emacs нашел решение.

Вот функция, которая дает вам список последних каталогов, используя ivy (часть swiper), чтобы сузить его динамически, а затем открыть выбранный в dired.

;; open recent directory, requires ivy (part of swiper)
;; borrows from http://stackru.com/questions/23328037/in-emacs-how-to-maintain-a-list-of-recent-directories
(defun bjm/ivy-dired-recent-dirs ()
  "Present a list of recently used directories and open the selected one in dired"
  (interactive)
  (let ((recent-dirs
         (delete-dups
          (mapcar (lambda (file)
                    (if (file-directory-p file) file (file-name-directory file)))
                  recentf-list))))

    (let ((dir (ivy-read "Directory: "
                         recent-dirs
                         :re-builder #'ivy--regex
                         :sort nil
                         :initial-input nil)))
      (dired dir))))

(global-set-key (kbd "C-x C-d") 'bjm/ivy-dired-recent-dirs)

Источник: Открыть недавний каталог в dired: revisited | Прагматичный Emacs

Вы спрашиваете в своем комментарии, отвечая на ответ @Stefan: А как мне перейти от просмотра к списку последних каталогов? -

Ответ в том, что вы используете малоизвестный факт, что если DIRNAME аргумент dired это список (a) нового имени буфера Dired, за которым следуют (b) имена файлов (или каталогов), затем Dired открывается только для этих файлов /dirs. IOW:

M-: (dired (cons DIRED-BUFNAME YOUR-LIST-OF-RECENT-DIRECTORIES))

Например:

M-: (dired '("My Dired Buffer" "/a/recent/dir/" "/another/recent1/" "/another/"))

Если вы используете библиотеку Dired+, то вы можете предоставить такой список в интерактивном режиме, используя непозитивный префикс arg с dired,

Но в этом случае вы хотите написать команду, которая сначала собирает список последних каталогов, а затем открывает Dired для них. Это должно сделать это:

(defun dired-recent (buffer)
  "Open Dired in BUFFER, showing the recently used directories."
  (interactive "BDired buffer name: ")
  (let ((dirs  (delete-dups
                (mapcar (lambda (f/d)
                          (if (file-directory-p f/d)
                              f/d
                            (file-name-directory f/d)))
                        recentf-list))))
    (dired (cons (generate-new-buffer-name buffer) dirs))))

Это подходит для меня. Тем не менее, ванильный Emacs не позволяет вам использовать i вставить листинг для любого каталога, который не находится в том же дереве каталогов, что и default-directory Dired буфера. Это означает, что приведенный выше код будет работать нормально, но вы не сможете вставить ни один из перечисленных каталогов.

Чтобы иметь возможность сделать это, загрузите библиотеку dired+.el, Dired+ также исправляет несколько других недостатков, связанных с обработкой ванили dired,

Приведенный выше код вместе с Dired+ должен дать вам то, что вы хотите.


ОБНОВИТЬ

Я только что добавил это в Dired+. Эти команды добавлены: diredp-dired-recent-dirs а также diredp-dired-recent-dirs-other-window,


ОБНОВЛЕНИЕ 2

Я упростил выбор того, какие из недавно использованных каталогов включить или исключить. Используйте префикс arg, чтобы инициировать такой выбор. Без префикса arg вы получаете все последние каталоги. Я также позволил использовать префиксный аргумент arg для запроса ls переключатели. Вот документация diredp-dired-recent-dirs:

Open Dired in BUFFER, showing recently used directories.
You are prompted for BUFFER.

No prefix arg or a plain prefix arg (`C-u', `C-u C-u', etc.) means
list all of the recently used directories.

With a prefix arg:
* If 0, `-', or plain (`C-u') then you are prompted for the `ls'
  switches to use.
* If not plain (`C-u') then:
  * If >= 0 then the directories to include are read, one by one.
  * If  < 0 then the directories to exclude are read, one by one.

When entering directories to include or exclude, use `C-g' to end.

Наконец, я добавил привязки для команд: C-x R (то же окно) и C-x 4 R (другое окно), где R это Shift + r,

Вам не нужно вести отдельный список (это было бы много работы). Вместо этого вы можете извлечь этот список из списка недавних. Например

(delete-dups
 (mapcar (lambda (file)
           (if (file-directory-p file) file (file-name-directory file)))
         recentf-list))
Другие вопросы по тегам