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
, inc
y lib
, y ahora quiero visitar todos los archivos con extensiones .c
, .cc
y .h
dentro 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 helm
o dired+
o cualquier otra extensión que me deja navegar mi sistema de archivos más fácilmente.
Respuestas:
Prueba esto:
Esto le permite ingresar argumentos sobre cómo Dired debería enumerar los archivos. Por defecto dice
-al
en el indicador. AgregueR
a 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
% m
para 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
.emacs
archivo):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!
fuente
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
, ylib
. 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 contienehst/
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\|
significaor
. Haga esto si desea seleccionar todo de una vez.Con cualquiera de estos, habrá marcado todos los archivos que desea abrir. Luego solo presione
RET
para 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 ennil
si no desea este límite.Lo bueno de Helm es que puedes seleccionar archivos de forma interactiva.
fuente
M-a
usandohelm-projectile-find-file
y presionar RET una vez para abrirlos todos usando el método que enumeré.Aquí hay dos posibilidades (alternativas):
En Dired, puede incluir todos los subdirectorios que contienen archivos sobre los que desea actuar, ya sea utilizando
ls
interruptores que incluyen-R
o utilizandoi
para incluir subdirectores específicos. Si usa la biblioteca Dired + , puede usar* .
(enlazado adiredp-mark/unmark-extension
, para marcar todos los archivos listados que tienen una extensión dada (como.h
). Luego puede usarF
(enlazado adired-do-find-marked-files
) para abrir todos los archivos marcados.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 aicicle-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
,.cc
y.h
en los subdirectorios marcados (con subdirectorios marcados que se manejan de la misma manera, de forma recursiva).fuente
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-file
admite comodines cuando se llama desde elisp. Aquí hay un fragmento útil de la documentación para esofind-file
: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-cd
a una clave para que pueda abrir fácilmente un mensaje de solicitud de eshell en el directorio del búfer que está editando.fuente
find-file
funcione 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?