Apri ricorsivamente i file corrispondenti a regexp nelle directory contrassegnate


9

In generale, vorrei essere in grado di aprire tutti i file all'interno di un determinato set di directory (e delle relative sottodirectory) in cui il nome file corrisponde a un determinato regexp.

Per esempio

  /home/nispio/project:
  total used in directory 1612 available 1000000000
  drwxrwxr-x 13 nispio group    4096 Sep 19 14:06 .
  drwxrwxr-x  7 nispio group    4096 Sep 22 16:41 ..
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 cfg
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 hlp
* drwxrwxr-x  2 nispio group    4096 Sep 23 16:52 hst
* drwxrwxr-x  2 nispio group    4096 Sep 29 14:52 inc
* drwxrwxr-x  2 nispio group    4096 Oct  1 12:53 lib
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 mcr
  drwxrwxr-x  2 nispio group    4096 Sep 24 10:50 pyl
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 snr
  drwxrwxr-x  2 nispio group    4096 Sep 19 12:46 unix

Ho segnato le directory hst, ince lib, e ora voglio visitare tutti i file con le estensioni .c, .cce .hall'interno di queste tre directory e le loro sottodirectory.

Sarebbe ancora meglio se potessi vedere tutto ciò che sto aprendo prima di aprirlo. Se il buffer diretto è stato aggiornato per mostrarmi tutti i file corrispondenti alla mia ricerca e tutti quelli evidenziati, potrei fare un controllo di integrità per assicurarmi che la mia ricerca abbia restituito quello che mi aspettavo.

Sono aperto a suggerimenti per fare la stessa cosa usando helmo dired+o qualsiasi altra estensione che mi permetta di navigare più facilmente nel mio filesystem.


Mathias o Drew hanno risposto a questo tuo? O stavi cercando qualcosa di diverso?
Malabarba,

Risposte:


14

Prova questo:

C-u C-x d

Questo ti consente di inserire argomenti su come Dired dovrebbe elencare i file. Di default dice -alal prompt. Aggiungi Ra quello, finendo con -alR. Tipo RET.

Selezionare / digitare una directory e quindi premere RET.

Ciò aprirà ricorsivamente tutte le directory da quella selezionata e in basso.

Da qui, digitare % mper contrassegnare tutti i file corrispondenti a un determinato modello di nome file. Inoltre spesso scrivo te quindi kuccido (nascondo) tutti i file che non mi interessano. Digita di tnuovo per contrassegnare tutti i file.

Per quanto riguarda effettivamente l'apertura dei file, non penso che ci sia un modo standard per farlo, ma puoi facilmente definire un nuovo comando per farlo (inseriscilo nel tuo .emacsfile):

(defun dired-find-marked-files ()
 (interactive)
 (dolist (f (dired-get-marked-files)) 
  (find-file f)))

Molto probabilmente qualcuno lo ha già incluso in un bel pacchetto di miglioramento di Dired, ma è divertente farlo anche tu;)

Godere!


7

Puoi farlo facilmente con helm-projectile-find-file . Poiché Projectile tiene traccia di ogni file con il relativo percorso, puoi facilmente restringere qualsiasi cosa. Usiamo il tuo esempio. Nel tuo caso, si vuole aprire i file in hst, ince lib. È possibile recuperare tutti i file appartenenti a questa directory in due modi:

  • Nel prompt Helm di helm-projectile-find-file, immettere ciascuna directory e contrassegnare i file ristretti a quella directory. Ad esempio, per prima cosa inserisco ^hst/(che si restringe a tutti i file che contiene hst/all'inizio di ciascun candidato). Contrassegna tutti i file conM-a , fai qualcosa di simile per i file nelle altre due directory.

  • In alternativa, è possibile recuperare i file in tutte le directory che utilizzano questo schema : ^hst/\|^inc\|^lib. Dopo tutto Helm accetta regex. La regex \|significa or. Fallo se vuoi selezionare tutto in una volta sola.

Con uno di questi, avrai contrassegnato tutti i file che vuoi aprire. Quindi basta premere RETper aprirli tutti.

Nota che se hai molti file in quelle directory, devi aumentare helm-candidate-number-limit. Altrimenti una volta che il numero di candidati raggiunge il limite, non vengono più visualizzati candidati e non è possibile selezionare candidati invisibili. Impostalo su un numero più alto o su nilse non vuoi questo limite.

La cosa buona con Helm è che puoi selezionare i file in modo interattivo.


Penso che voglia aprirli tutti contemporaneamente, non selezionarne uno.
Malabarba,

1
@Malabarba Puoi selezionare più file M-ausando helm-projectile-find-filee premere una volta RET per aprirli tutti usando il metodo che ho elencato.
Ma Do,

Ovviamente! Scusa, ho perso quella frase. Ho modificato per renderlo un po 'più ovvio agli idioti come me. Sentiti libero di tornare indietro se non ti piace o se ho fatto qualcosa di sbagliato.
Malabarba,

@Malabarba Grazie. Adesso è più chiaro.
Ma Do,

4

Ecco due possibilità (alternative):

  1. In Dired è possibile includere tutti i sottodir contenenti file su cui si desidera agire, utilizzando le lsopzioni che includono -Ro usando iper includere sottodir specifici. Se si utilizza la libreria Dired +, è possibile utilizzare * .(associato a diredp-mark/unmark-extension, per contrassegnare tutti i file elencati che hanno una determinata estensione (come .h). Quindi è possibile utilizzare F(associato a dired-do-find-marked-files) per aprire tutti i file contrassegnati.

  2. Con la libreria Dired + è possibile agire su tutti i file contrassegnati e tutti i file contrassegnati in sottodirectory contrassegnate, definite in modo ricorsivo, IOW, sottodirectory di sottodir, i loro sottodir, ecc.

    Per qualsiasi directory contrassegnata, se nessun file è contrassegnato in quella directory (ovvero, contrassegnato in un elenco Dired per quel sottodir), l'azione è su tutti i suoi file.

    Esistono numerosi comandi per agire su tali file in diversi modi (apertura, ricerca, ecc.). Ma i file su cui agire sono determinati solo in quel modo; non c'è anche la possibilità, per esempio, di inserire un modello glob o una regexp per filtrare il set.

    Tuttavia, se si utilizza la libreria Icicles insieme a Dired +, è possibile utilizzare M-+ C-F, ad esempio, M-+ C-S-f(che è associato a icicle-visit-marked-file-of-content-recursive), per aprire uno o tutti i file appena descritti (ovvero, quelli contrassegnati o in sottodiretti contrassegnati, definiti in modo ricorsivo).

    Puoi usare regexps, al volo, per filtrare i nomi dei file (e / o il contenuto del file). Ad esempio, è possibile, come da lei richiesto, aprire tutti i file che hanno le estensioni .c, .cce .hnelle sottocartelle segnati (con sottodirectory marcati essere gestita allo stesso modo, in modo ricorsivo).


3

eshell gestisce l' **/*espansione glob in stile zsh , quindi un approccio è quello di avviare eshell nella directory corretta ed eseguirlofor f in **/*cc **/*h { find-file $f}

In alternativa, la funzione find-filesupporta i caratteri jolly quando viene chiamata da elisp. Ecco un utile frammento della documentazione per questo find-file:

(find-file FILENAME &optional WILDCARDS)
Interactively, or if WILDCARDS is non-nil in a call from Lisp, expand wildcards (if any) and visit multiple files.

Non riuscivo a capire come farlo funzionare con i globbing in stile zsh, ma potrebbe essere una buona opzione.

Se tutti questi file si trovano in un progetto controllato da un'unica fonte, il proiettile potrebbe essere un approccio diverso e migliore.

PS. Se utilizzi eshell, ti suggerirei di associare eshell-toggle-cduna chiave in modo da poter far apparire facilmente un prompt eshell nella directory del buffer che stai modificando.


Non credo che find-filefunzionerà in modo ricorsivo, che è la caratteristica principale che sto cercando. Aprire una shell e digitare un comando sembra troppo lavoro, perché (immagino) il mio comando dovrebbe essere qualcosa del genere for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }O è più semplice di così?
nispio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.