Могу ли я изменить историю поиска файлов Emacs?

Когда я вызываю find-file, чтобы открыть новый файл, обычно случается, что файл, который я ищу, находится в одном из каталогов, из которых я уже загружен.

В идеале я бы хотел прокрутить историю с помощью стрелок вверх / вниз.

Проблема в том, что, если я уже загрузил 10 файлов из каталога, мне сначала нужно пройти через эти десять файлов, все в одном каталоге, прежде чем я увижу новый каталог, где может находиться мой файл.

В конце я часто просто набираю каталог или вырезаю / вставляю его из xterm.

в команде find-file я могу изменить поведение стрелок вверх / вниз, чтобы перебирать каталоги вместо файлов.

В качестве альтернативы, можно ли изменить порядок файлов в соответствии с порядком буферов, которые были недавно посещены, а не когда я загружал файл?

5 ответов

Решение

Мой первый ответ страдал от поведения, которое завершение TAB больше не работало, как ожидалось в 'find-file. Но техника все еще кажется полезной (и, если вам это нравится, предпочтительнее).

Тем не менее, это решение имеет такое же поведение истории, но поддерживает завершение TAB, как и ожидалось, внутри 'find-file.

Мне было бы интересно узнать, есть ли способ избежать рекомендации find-file, но я не смог найти какой-либо самоанализ, который дал бы мне знание, что 'find-file был вызван.

(defadvice find-file (around find-file-set-trigger-variable protect activate)
  "bind a variable so that history command can do special behavior for find-file"
  (interactive (let (inside-find-file-command) (find-file-read-args "Find file: " nil)))
  ad-do-it)

(defadvice next-history-element (around next-history-element-special-behavior-for-find-file protect activate)
  "when doing history for find-file, use the buffer-list as history"
  (if (boundp 'inside-find-file-command)
      (let ((find-file-history (delq nil (mapcar 'buffer-file-name (buffer-list))))
            (minibuffer-history-variable 'find-file-history))
        ad-do-it)
    ad-do-it))

Я предлагаю ИДО. Вы можете искать в списке буферов или в файле поиска. При поиске в find-файле, который не имеет совпадений в текущей папке, он просматривает историю.

Не то, что вы хотите, но

Вы пробовали (список электрических буфера) Ctrl-x Ctrl-b?

или (заправлено)?

Это будет использовать порядок списка буферов для истории, который вы хотите.

(setq read-file-name-function 'my-read-file-name)
(defun my-read-file-name (prompt dir default-filename mustmatch initial predicate)
  (let ((default-directory dir)
        (files (directory-files dir))
        (history (delq nil (mapcar 'buffer-file-name (buffer-list)))))
    (completing-read prompt files predicate mustmatch initial 'history)))

Хммм... Это меняет поведение завершения TAB-файла поиска, потому что TAB завершается по истории (уже открытые файлы), а не по файлам, доступным в указанном вами каталоге.

Заставить обоих работать одновременно немного сложнее...

С помощью Icicles вы можете переключаться между именами файлов-кандидатов и сортировать их разными способами. Вы можете получить к ним доступ в порядке последнего использования и т. Д.

Другие вопросы по тегам