D'une manière générale, j'aimerais pouvoir ouvrir tous les fichiers dans un ensemble donné de répertoires (et leurs sous-répertoires) où le nom de fichier correspond à une expression rationnelle donnée.
Par exemple
/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
J'ai marqué les répertoires hst
, inc
et lib
, et maintenant je veux visiter tous les fichiers avec des extensions .c
, .cc
et .h
dans ces trois répertoires et leurs sous - répertoires.
Ce serait encore mieux si je pouvais voir tout ce que j'ouvre avant de l'ouvrir. Si le tampon dired a été mis à jour pour me montrer tous les fichiers qui correspondent à ma recherche, et tous ceux-ci ont été mis en évidence, je pourrais faire une vérification de santé mentale pour m'assurer que ma recherche a retourné ce que j'attendais.
Je suis ouvert aux suggestions pour faire la même chose en utilisant helm
ou dired+
ou toute autre extension qui me permettra de naviguer plus facilement dans mon système de fichiers.
Réponses:
Essaye ça:
Cela vous permet d'entrer des arguments sur la façon dont Dired doit répertorier les fichiers. Par défaut, il est dit
-al
à l'invite. AjoutezR
à cela, pour finir-alR
. Tapez RET.Sélectionnez / saisissez un répertoire, puis appuyez sur RET.
Cela ouvrira récursivement tous les répertoires de celui que vous sélectionnez et ci-dessous.
De là, tapez
% m
pour marquer tous les fichiers correspondant à un certain modèle de nom de fichier. Je souvent puis tapez tpuis ktuer (cacher) tous les fichiers que je ne suis pas intéressé. Saisissez à tnouveau pour marquer tous les fichiers.En ce qui concerne réellement l'ouverture des fichiers, je ne pense pas qu'il existe une façon standard de le faire, mais vous pouvez facilement définir une nouvelle commande pour le faire (placez-la dans votre
.emacs
fichier):Très probablement, quelqu'un a déjà inclus cela dans un joli package d'amélioration de Dired, mais c'est aussi amusant de le faire vous-même;)
Prendre plaisir!
la source
Vous pouvez le faire facilement avec helm-projectile-find-file . Puisque Projectile garde une trace de chaque fichier avec son chemin d'accès relatif, vous pouvez facilement vous limiter à n'importe quoi. Prenons votre exemple. Dans votre cas, vous voulez ouvrir des fichiers dans
hst
,inc
etlib
. Vous pouvez récupérer tous les fichiers appartenant à ce répertoire de deux manières:Dans l'invite Helm de
helm-projectile-find-file
, entrez chaque répertoire et les fichiers marqués restreints à ce répertoire. Par exemple, j'entre d'abord^hst/
(qui se limite à tous les fichiers qui contiennenthst/
au début de chaque candidat). Marquez tous les fichiers avecM-a
, faites quelque chose de similaire pour les fichiers des deux autres répertoires.Ou bien , vous pouvez récupérer des fichiers dans tous les répertoires en utilisant ce modèle :
^hst/\|^inc\|^lib
. Helm accepte les regex après tout. Le regex\|
signifieor
. Faites-le si vous souhaitez tout sélectionner en une seule fois.Avec l'un ou l'autre, vous aurez marqué tous les fichiers que vous souhaitez ouvrir. Appuyez ensuite sur
RET
pour les ouvrir tous.Veuillez noter que si vous avez beaucoup de fichiers dans ces répertoires, vous devez augmenter
helm-candidate-number-limit
. Sinon, une fois que le nombre de candidats atteint la limite, aucun autre candidat n'est affiché et vous ne pouvez pas sélectionner de candidats invisibles. Réglez-le sur un nombre supérieur ou définissez-le surnil
si vous ne voulez pas de cette limite.La bonne chose avec Helm est que vous pouvez sélectionner des fichiers de manière interactive.
la source
M-a
aide dehelm-projectile-find-file
et appuyer une fois sur RET pour les ouvrir tous en utilisant la méthode que j'ai indiquée.Voici deux possibilités (alternatives):
Dans Dired, vous pouvez inclure tous les sous-répertoires contenant les fichiers sur lesquels vous souhaitez agir, en utilisant des
ls
commutateurs qui incluent-R
ou en utilisanti
pour inclure des sous-répertoires spécifiques. Si vous utilisez la bibliothèque Dired +, vous pouvez utiliser* .
(lié àdiredp-mark/unmark-extension
, pour marquer tous les fichiers répertoriés qui ont une extension donnée (comme.h
). Ensuite, vous pouvez utiliserF
(lié àdired-do-find-marked-files
) pour ouvrir tous les fichiers marqués.Avec la bibliothèque Dired +, vous pouvez agir sur tous les fichiers marqués et tous les fichiers marqués dans des sous-répertoires marqués, définis récursivement, IOW, sous-répertoires de sous-répertoires, leurs sous-répertoires, etc.
Pour tout répertoire marqué, si aucun fichier n'est marqué dans ce répertoire (c'est-à-dire marqué dans une liste Dired pour ce sous-répertoire), alors l'action est sur tous ses fichiers.
Il existe un bon nombre de commandes pour agir sur ces fichiers de différentes manières (ouverture, recherche, etc.). Mais les fichiers sur lesquels agir ne sont déterminés que de cette façon; il n'y a pas non plus la possibilité, par exemple, de saisir un motif global ou une expression rationnelle pour filtrer l'ensemble.
Cependant, si vous utilisez la bibliothèque Icicles avec Dired +, vous pouvez utiliser
M-+ C-F
, c'est-à-direM-+ C-S-f
(qui est lié àicicle-visit-marked-file-of-content-recursive
), pour ouvrir tout ou partie des fichiers qui viennent d'être décrits (c'est-à-dire ceux marqués ou dans des sous-répertoires marqués, définis récursivement).Vous pouvez utiliser des expressions régulières, à la volée, pour filtrer les noms de fichier (et / ou le contenu du fichier). Par exemple, vous pouvez, comme vous le demandez, ouvrez tous les fichiers qui ont des extensions
.c
,.cc
et.h
dans les sous - répertoires marqués (avec subdirs marqués étant traités de la même manière, récursive).la source
eshell gère l'
**/*
expansion glob de style zsh , donc une approche consiste à lancer eshell dans le bon répertoire et à exécuterfor f in **/*cc **/*h { find-file $f}
Alternativement, la fonction
find-file
prend en charge les caractères génériques lorsqu'elle est appelée depuis elisp. Voici un extrait utile de la documentation pour celafind-file
:Je ne pouvais pas comprendre comment faire fonctionner cela avec la globalisation de style zsh, mais cela pourrait être une bonne option.
Si tous ces fichiers sont dans un projet contrôlé par une seule source, le projectile pourrait être une approche différente et meilleure.
PS. Si vous optez pour eshell, je vous suggère de vous lier
eshell-toggle-cd
à une clé afin que vous puissiez facilement faire apparaître une invite eshell dans le répertoire du tampon que vous modifiez.la source
find-file
fonctionnera récursivement, ce qui est la principale caractéristique que je recherche. Ouvrir un shell et taper une commande semble être trop de travail, car (je suppose) ma commande devrait être quelque chose commefor d in inc src hst { for f in $d/**/*cc $d/**/*c $d/**/*h { find-file $f } }
Ou est-ce plus simple que ça?