2013-12-13 22 views
5

Se una directory contiene molti file e voglio andare a file (o sottodirectory) con nome che inizia con una lettera (o una stringa), c'è qualche buon modo per farlo? So che nel File Manager remoto le persone possono premere Alt e iniziare a digitare il nome e il cursore si sposterà mentre si digita, mi chiedo se Emacs abbia qualcosa di simile.Come accedere rapidamente a un file in Emacs Dired?

+0

Nella mia risposta di seguito ho aggiunto una nota sulle directory di ricerca ricorsiva. – Tobias

+0

se sei interessato a trovare rapidamente un file in sottodirectory (cioè in modo ricorsivo), dovresti dare un'occhiata a 'projectile' e alle sue funzioni' find-file-in-project' e 'find-file-in-directory' : https://github.com/bbatsov/projectile – Ehvince

+0

E poi c'è il coltellino svizzero: Sezione "Grepping senza dipendere da programmi esterni" in http://www.emacswiki.org/emacs/TN Se chiami 'elgrep 'con prefisso-chiave cerca ricorsivamente e se si specifica solo l'espressione regolare per il nome del file e si lascia l'altra regexp vuota, allora cerca solo i file con tale nome di file. – Tobias

risposta

6

Il modo più veloce per rispondere a questa domanda è la copia di una sezione dal emacs file di informazioni. Per arrivare a questo tipo di testo Chidmemacsret e poi isearch di una stringa appropriata ignorando il primo Failing I-search o semplicemente andare a informazioni con Chi e poi andare direttamente al nodo informazioni indicato di seguito con g e quindi digitando il nome del nodo seguito da ret.

Il primo da informazioni nodo (emacs) Dired and Find funziona se è in un buffer dired o meno:

To search for files with names matching a wildcard pattern use `M-x 
find-name-dired'. It reads arguments DIRECTORY and PATTERN, and 
chooses all the files in DIRECTORY or its subdirectories whose 
individual names match PATTERN. 

Il secondo da informazioni nodo (emacs) Dired Navigation opere nel buffer dired ma si applica solo ai file attualmente elencati . Tuttavia, si noti che è possibile elencare sottodirectory con i prima.

`M-s f C-s' (`dired-isearch-filenames') performs a forward 
incremental search in the Dired buffer, looking for matches only 
amongst the file names and ignoring the rest of the text in the buffer. 
`M-s f M-C-s' (`dired-isearch-filenames-regexp') does the same, using a 
regular expression search. If you change the variable 
`dired-isearch-filenames' to `t', then the usual search commands also 
limit themselves to the file names; for instance, `C-s' behaves like 
`M-s f C-s'. If the value is `dwim', then search commands match the 
file names only when point was on a file name initially. *Note 
Search::, for information about incremental search. 

EDIT: Per iSearch una directory ricorsivamente si può prima elencare ricorsivamente.

È possibile elencare le sottodirectory in modo ricorsivo chiamando dired con prefisso-arg e aggiungendo R all'elenco di opzioni.

il seguente frammento per il file emacs di inizializzazione sarebbe nemmeno semplificare questa operazione:

(defun dired-noselect-maybe-recursive (dir-or-list &optional switches) 
    "Like `dired-noselect' but lists sub-directories when last character is ?/." 
    (if (and (null switches) 
     (= (aref dir-or-list (1- (length dir-or-list))) ?/)) 
     (dired-noselect dir-or-list "-alR") 
    (dired-noselect dir-or-list switches) 
    )) 

(setq find-directory-functions (subst 'dired-noselect-maybe-recursive 'dired-noselect find-directory-functions)) 

Con questo frammento si ottiene un elenco normale di directory se si chiama trovare file (CxCf) per una directory senza una barra alla fine e ottieni una lista ricorsiva se la chiami con una barra alla fine. Ma attenzione. L'elenco di directory ricorsive può richiedere tempo. Se ti innervosisci, puoi sempre smettere con C-g.

2

isearch lo farà. control-s, quindi inizia a digitare.

Dal momento che è general-purpose funzione di ricerca di emacs, si potrebbe iniziare corrispondenza altre cose nel buffer fino ad arrivare abbastanza del nome in.

1

@Tobias e @ jl8e hanno entrambi risposto direttamente alla tua domanda: utilizzare C-s (ricerca incrementale). Niente da aggiungere a questo.

Ma se si utilizzerà più volte un sottoinsieme dei file elencati o si eseguirà la stessa operazione su un sottoinsieme di file e se tale sottoinsieme può essere identificato da un modello di nome file (es. stesso prefisso), quindi è possibile utilizzare %m per contrassegnare tutti i file che corrispondono a un'espressione regolare.Una volta contrassegnato, puoi fare qualsiasi cosa sul set di file marcati (o sul set di quelli non marcati).

(Una delle cose che si può fare è semplicemente omettere i nomi dei file marcati o non marcati dal profilo, e quindi da operazioni.)

Dired è veramente principalmente circa l'esame e operano su set di File. Il set singleton è un caso speciale e tutte le operazioni (chiavi) che operano sui file contrassegnati funzionano anche solo sul file della riga corrente, se nessuna è contrassegnata.

3

Voglio solo aggiungere un trucco che mi piace usare questo è in qualche modo legati alla tua domanda:

(add-hook 
'dired-mode-hook 
(lambda() 
    (define-key dired-mode-map "j" 'ido-find-file))) 

Ovviamente funziona per un solo file, e si apre, invece di offrire una moltitudine di cose che dired può fare a un file, ma almeno è veloce.

Problemi correlati