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