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.