2009-03-03 10 views
8

Cuando llamo a find-file para abrir un nuevo archivo, generalmente sucede que el archivo que estoy buscando está en uno de los directorios que ya he cargado.¿Puedo cambiar el historial de archivos de búsqueda de Emacs?

Idealmente, me gustaría desplazarme por el historial usando las flechas arriba/abajo.

El problema con esto es que si ya he cargado 10 archivos de un directorio, primero tengo que pasar esos diez archivos, todos en el mismo directorio, antes de ver un nuevo directorio donde podría estar mi archivo.

Al final, a menudo simplemente vuelvo a escribir en el directorio o lo corto/pego desde un xterm.

en el comando find-file, ¿puedo cambiar el comportamiento de las flechas arriba/abajo para iterar sobre directorios en lugar de archivos?

Como alternativa, ¿puedo cambiar el orden de los archivos para que coincida con el orden de los buffers visitados más recientemente en lugar de cuando cargué el archivo?

+0

historial de navegación trabaja con las teclas de flecha, ¿no?(Me doy cuenta de que el problema que tienes es w/la orden) –

Respuesta

4

Mi primera respuesta sufrió de la conducta que la implementación del tabulador ya no funcionaba como se esperaba en 'find-file. Pero la técnica todavía parece útil (y si te gusta, es preferible).

Sin embargo, esta solución tiene el mismo comportamiento de historial, pero mantiene la finalización del TAB como se esperaba dentro de 'find-file'.

Me interesaría saber si había alguna manera de evitar el asesoramiento de find-file, pero no pude encontrar ninguna introspección que me diera el conocimiento de que se llamaba '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

Esta solución tiene el desagradable efecto secundario de que los plumones y los plumones no son complementarios, p. si pasas el archivo que deseas usando el uparrow, al presionar el downarrow no vuelves atrás 1 en la lista que acabas de completar. – EoghanM

+0

No creo que sea el caso. Cuando establezco un punto de interrupción en el consejo 'next-history-element', veo que se llama cuando presiono las teclas de flecha hacia arriba o hacia abajo. Tal vez sus llaves están vinculadas de manera diferente? –

+0

No creo que tenga ninguna combinación extraña de teclas. Cuando creé otra función de 'elemento de historia previa', las flechas hacia arriba y hacia abajo parecen ser inversas entre sí. – EoghanM

1

no lo que quieres, pero

has necesitado (-buffer-list eléctrica) Ctrl-X Ctrl-b?

o (dired)?

1

Esto usará el orden de la lista de la memoria intermedia para el historial, que es lo que desea.

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

Hmmm ... Esto cambia el comportamiento de la implementación del tabulador de encontrar-archivo porque el TAB completa sobre la historia (ya los archivos abiertos), y no a través de los archivos disponibles en el directorio que está especificando.

Conseguir tanto trabajar al mismo tiempo es un poco más complicado ...

4

Sugiero IDO. Puede buscar en la lista de buffer o en find-file. Cuando busca en find-file y no tiene coincidencias en la carpeta actual, busca a través del historial.

Cuestiones relacionadas