2009-03-03 2 views
8

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

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

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

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

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

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

+0

просмотр истории работы с помощью клавиша со стрелками, нет?(Я понимаю, что у вас есть проблема с заказом) –

ответ

4

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

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

Мне было бы интересно узнать, есть ли способ избежать поиска файла find, но я не смог найти никакой интроспекции, которая дала мне знание о том, что был вызван «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)) 
+0

Это решение имеет неприятный побочный эффект, который вниз и вверх не являются дополнительными, например. если вы зацикливаетесь мимо файла, который хотите использовать, то нажатие на downarrow не возвращается назад в списке, который вы только что проехали! – EoghanM

+0

Я не считаю, что это так. Когда я устанавливаю точку останова в совете «next-history-element», я вижу, что он вызывается, когда я нажимаю клавиши со стрелками вверх или вниз. Возможно, ваши ключи связаны по-другому? –

+0

Я не думаю, что у меня есть какие-то странные привязки клавиш - когда я создал другую функцию «предыдущий элемент истории», стрелки вверх и вниз кажутся обратными друг другу – EoghanM

1

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

вы пробовали (элект-буферного список) Ctrl-X Ctrl-B?

or (dired)?

1

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

(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))) 

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

Получение и работать в то же время немного сложнее ...

4

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

0

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

Смежные вопросы