Abrir archivos recursivamente que coincidan con expresiones regulares en directorios marcados

9

En términos generales, me gustaría poder abrir todos los archivos dentro de un conjunto determinado de directorios (y sus subdirectorios) donde el nombre de archivo coincide con una expresión regular dada.

Por ejemplo

  /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

He marcado los directorios hst, incy lib, y ahora quiero visitar todos los archivos con extensiones .c, .ccy .hdentro de esos tres directorios y sus subdirectorios.

Sería aún mejor si pudiera ver todo lo que estoy abriendo antes de abrirlo. Si el búfer directo se actualizó para mostrarme todos los archivos que coincidían con mi búsqueda, y todos se resaltaron, podría hacer una comprobación de la cordura para asegurarme de que mi búsqueda devolvió lo que esperaba.

Estoy abierto a sugerencias para hacer esto mismo usando helmo dired+o cualquier otra extensión que me deja navegar mi sistema de archivos más fácilmente.

nispio
fuente
¿Mathias o Drew respondieron tu pregunta? ¿O estabas buscando algo diferente?
Malabarba

Respuestas:

14

Prueba esto:

C-u C-x d

Esto le permite ingresar argumentos sobre cómo Dired debería enumerar los archivos. Por defecto dice -alen el indicador. Agregue Ra eso, terminando con -alR. Tipo RET.

Seleccione / escriba un directorio y luego presione RET.

Esto abrirá recursivamente todos los directorios desde el que seleccione, y a continuación.

Desde aquí, escriba % mpara marcar todos los archivos que coincidan con un cierto patrón de nombre de archivo. También a menudo escribo ty luego kmato (oculto) todos los archivos que no me interesan. Escriba tnuevamente para marcar todos los archivos.

En cuanto a la apertura real de los archivos, no creo que haya una forma estándar de hacerlo, pero puede definir fácilmente un nuevo comando para hacerlo (colocarlo en su .emacsarchivo):

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

Lo más probable es que alguien ya haya incluido esto en un buen paquete de mejora de Dired, pero también es divertido hacerlo usted mismo;)

¡Disfrutar!

Mathias Dahl
fuente
7

Puede hacerlo fácilmente con helm-projectile-find-file . Dado que Projectile realiza un seguimiento de cada archivo con su ruta relativa, puede reducirlo fácilmente a cualquier cosa. Usemos su ejemplo. En su caso, desea abrir archivos en hst, inc, y lib. Puede recuperar todos los archivos que pertenecen a este directorio de dos maneras:

  • En la solicitud de Helm de helm-projectile-find-file, ingrese cada directorio y los archivos marcados restringidos a ese directorio. Por ejemplo, primero ingreso ^hst/(que se reduce a todos los archivos que contiene hst/al principio de cada candidato). Marque todos los archivos conM-a , haga algo similar para los archivos en los otros dos directorios.

  • O bien, puede recuperar los archivos en todos los directorios que utilizan este patrón : ^hst/\|^inc\|^lib. Helm acepta expresiones regulares después de todo. La expresión regular \|significa or. Haga esto si desea seleccionar todo de una vez.

Con cualquiera de estos, habrá marcado todos los archivos que desea abrir. Luego solo presione RETpara abrirlos todos.

Tenga en cuenta que si tiene muchos archivos en esos directorios, debe aumentar helm-candidate-number-limit. De lo contrario, una vez que el número de candidatos alcance el límite, no se mostrarán más candidatos y no podrá seleccionar candidatos invisibles. Póngalo en un número mayor o póngalo en nilsi no desea este límite.

Lo bueno de Helm es que puedes seleccionar archivos de forma interactiva.

Tu Do
fuente
Creo que quiere abrirlos todos simultáneamente, no seleccionar uno de ellos.
Malabarba
1
@Malabarba Puede seleccionar múltiples archivos M-ausando helm-projectile-find-filey presionar RET una vez para abrirlos todos usando el método que enumeré.
Tu Do
¡Por supuesto! Lo siento, perdí esa frase. Lo edité para hacerlo un poco más obvio para idiotas como yo. Siéntete libre de retroceder si no te gusta o si hice algo mal.
Malabarba
@Malabarba Gracias. Ahora está más claro.
Tu Do
4

Aquí hay dos posibilidades (alternativas):

  1. En Dired, puede incluir todos los subdirectorios que contienen archivos sobre los que desea actuar, ya sea utilizando lsinterruptores que incluyen -Ro utilizando ipara incluir subdirectores específicos. Si usa la biblioteca Dired + , puede usar * .(enlazado a diredp-mark/unmark-extension, para marcar todos los archivos listados que tienen una extensión dada (como .h). Luego puede usar F(enlazado a dired-do-find-marked-files) para abrir todos los archivos marcados.

  2. Con la biblioteca Dired + puede actuar sobre todos los archivos marcados y todos los archivos marcados en subdirectorios marcados, definidos recursivamente, IOW, subdirectorios de subdirectorios, sus subdirectores, etc.

    Para cualquier directorio marcado, si no hay archivos marcados en ese directorio (es decir, marcados en una lista Dired para ese subdirectorio), la acción está en todos sus archivos.

    Hay una buena cantidad de comandos para actuar sobre dichos archivos de diferentes maneras (abrir, buscar, etc.). Pero los archivos para actuar se determinan solo de esa manera; tampoco existe la posibilidad de, digamos, ingresar un patrón global o una expresión regular para filtrar el conjunto.

    Sin embargo, si usa Icicles de biblioteca junto con Dired + , puede usar M-+ C-F, es decir, M-+ C-S-f(que está vinculado a icicle-visit-marked-file-of-content-recursive), para abrir cualquiera o todos los archivos que acabamos de describir (es decir, aquellos marcados o en subdirectorios marcados, definidos recursivamente).

    Puede usar expresiones regulares, sobre la marcha, para filtrar los nombres de archivo (y / o el contenido del archivo). Por ejemplo, se puede, como usted pide, abrir todos los archivos que tienen extensiones .c, .ccy .hen los subdirectorios marcados (con subdirectorios marcados que se manejan de la misma manera, de forma recursiva).

Dibujó
fuente
3

eshell maneja la **/*expansión global de estilo zsh , por lo que un enfoque es iniciar eshell en el directorio correcto y ejecutarfor f in **/*cc **/*h { find-file $f}

Alternativamente, la función find-fileadmite comodines cuando se llama desde elisp. Aquí hay un fragmento útil de la documentación para eso 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.

No pude encontrar la manera de hacer que eso funcione con el bloqueo de estilo zsh, pero podría ser una buena opción.

Si todos estos archivos están en un proyecto controlado de fuente única, el proyectil podría ser un enfoque diferente y mejor.

PD. Si opta por eshell, le sugiero que enlace eshell-toggle-cda una clave para que pueda abrir fácilmente un mensaje de solicitud de eshell en el directorio del búfer que está editando.

shapr
fuente
No creo que find-filefuncione recursivamente, que es la característica principal que busco. Abrir un shell y escribir un comando parece demasiado trabajo, porque (supongo) que mi comando tendría que ser algo así ¿ for d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }O es más simple que eso?
nispio