2009-03-03 11 views
8

Quando chiamo find-file per aprire un nuovo file, in genere accade che il file che sto cercando si trovi in ​​una delle directory da cui ho già caricato.Posso cambiare la cronologia del file di ricerca di Emacs?

Idealmente, mi piacerebbe scorrere la cronologia usando le frecce su/giù.

Il problema con questo è che se ho già caricato 10 file da una directory, devo prima passare attraverso questi dieci file, tutti nella stessa directory, prima di vedere una nuova directory in cui il mio file potrebbe essere.

Alla fine, digito di nuovo la directory di nuovo o taglia/incolla da un xterm.

nel comando find-file, è possibile modificare il comportamento delle frecce su/giù per scorrere le directory anziché i file.

In alternativa, posso modificare l'ordine dei file in modo che corrisponda all'ordine dei buffer più recentemente visitati anziché quando ho caricato il file?

+0

cronologia di navigazione funziona con i tasti freccia, no?(Mi rendo conto che il problema che si ha è nell'ordine) –

risposta

4

La mia prima risposta ha sofferto dal comportamento che il completamento TAB non funzionava più come previsto in 'find-file. Ma la tecnica sembra ancora utile (e se ti piace, preferibile).

Tuttavia, questa soluzione ha lo stesso comportamento cronologico, ma mantiene il completamento del TAB come previsto all'interno del file di ricerca.

Sarei interessato a sapere se esistesse un modo per evitare di consigliare il file di ricerca, ma non sono riuscito a trovare alcuna introspezione che mi abbia dato la consapevolezza che è stato chiamato il file di ricerca.

(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

Questa soluzione ha il brutto effetto collaterale che il down e il uparrows non sono complementari, ad es. se si supera il file che si desidera utilizzare con il uparrow, premendo downarrow non si torna indietro 1 nell'elenco appena completato! – EoghanM

+0

Non trovo questo il caso. Quando imposto un punto di interruzione nel 'consiglio della cronologia successiva', vedo che viene chiamato quando premo i tasti freccia su o giù. Forse le tue chiavi sono legate in modo diverso? –

+0

Non penso di avere strane combinazioni di tasti - quando ho creato un'altra funzione "storia precedente-elemento" le frecce su e giù sembrano essere l'inverso di ognuna – EoghanM

1

non quello che volete, ma

Hai provato (elettrico-buffer-list) Ctrl-X CTRL-b?

o (dired)?

1

Questo utilizzerà l'ordine della lista buffer per la cronologia, che è ciò che si desidera.

(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 ... Questo cambia il comportamento di completamento TAB di find-file perché il TAB completa nel corso della storia (già aperto i file), e non sopra i file disponibili nella directory che stai specificando.

ottenere entrambi a lavorare allo stesso tempo è un po 'più complicato ...

4

Suggerisco IDO. Puoi cercare nell'elenco dei buffer o nel file di ricerca. Durante la ricerca nel file di ricerca e non ha corrispondenze nella cartella corrente, cerca nella cronologia.

Problemi correlati