Comment puis-je insérer plusieurs répertoires non liés (sans sous-répertoire) dans un seul tampon direct ? Dans mon cas, j'aimerais préparer un tampon déshydraté contenant des répertoires non liés avec de multiples changements de fichiers (par exemple, en mode 'wdired' avec de multiples renommages et changements, ou simplement avec de multiples marques dans différents répertoires), les vérifier visuellement, et ensuite les exécuter avec une seule touche.
Réponse
Trop de publicités?Fournir une liste de chaînes de caractères, au lieu d'un nom de répertoire, comme (premier) argument de la fonction dired
.
-
Le premier élément de la liste est le nom du tampon Dired.
-
Les autres éléments de la liste sont des noms de répertoires ou de fichiers.
Le tampon Dired qui en résulte comporte une ligne pour chaque élément de la liste.
Tout répertoire répertorié peut bien entendu être inséré (c'est-à-dire étendu à sa liste de fichiers) à l'aide de la fonction i
dans la mémoire tampon de Dired.
Par exemple, évaluez ceci :
(dired-other-window '("my dired buffer" DIR1 FILE1 DIR2 FILE2 FILE3))
où les DIRN
sont des noms de répertoires (chaînes de caractères) et l'élément FILEN
sont des noms de fichiers (chaînes). Vous pouvez utiliser des noms absolus ou des noms relatifs à la valeur actuelle de default-directory
.
Le résultat ici est Dired buffer my dired buffer
avec des lignes pour les répertoires DIR1
y DIR2
et des fichiers FILE1
, FILE2
y FILE3
.
Je ne suis pas sûr de comprendre le reste de votre question. Mais le tampon dirigé résultant de ce qui précède est un tampon dirigé normal. Vous pouvez utiliser wdired
pour permettre des modifications, etc.
Mise à jour n° 1 , après votre commentaire --
C'est un bon point. Oui, les i
( dired-maybe-insert-subdir
) exige que tous les sous-dossiers insérés appartiennent à la même arborescence. Je ne sais pas pourquoi. Peut-être qu'une partie du code (et il y en a beaucoup à prendre en compte), qui traite peut-être de la gestion de ls
Cela dépend de la situation. Ou peut-être s'agit-il d'une restriction qui n'est pas vraiment nécessaire.
Une façon de gérer (contourner) cette restriction est de partir d'un répertoire ancêtre commun à tous les sous-dossiers que vous incluez dans la liste. En d'autres termes, commencez par faire M-x cd
à ce répertoire d'ancêtres communs, avant de créer votre tampon Dired. À l'extrême, cela signifierait M-x cd
dans le répertoire racine. Cela fonctionnera certainement dans tous les cas. Vous devrez probablement utiliser des noms de fichiers absolus pour les répertoires et les fichiers que vous transmettez à dired
pour l'inscription.
Mais comme vous le dites, si vous utilisez MS Windows et que les répertoires sont sur des lettres de lecteur différentes, ce n'est pas une solution.
Voici une autre solution que vous pouvez essayer. Je ne sais pas si cela peut causer des problèmes ailleurs. (Je serais intéressé de savoir quels problèmes vous rencontrez, si c'est le cas. Voir l'en-tête du fichier de la bibliothèque dired+.el
pour les coordonnées)
Copiez le code source de ces deux fonctions dans le fichier dired-aux.el
: dired-insert-subdir
y dired-insert-subdir-newpos
et modifiez ensuite les copies comme suit :
-
Pour
dired-insert-subdir
Commentez cette ligne :(dired-insert-subdir-validate dirname switches)
-
Pour
dired-insert-subdir-newpos
Modifiez le code de la manière suivante :(defun dired-insert-subdir-newpos (new-dir) ;; Find pos for new subdir, according to tree order. (let ((alist dired-subdir-alist) elt dir new-pos) (while alist (setq elt (car alist) alist (cdr alist) dir (car elt)) (if (dired-tree-lessp dir new-dir) ;; Insert NEW-DIR after DIR (setq new-pos (dired-get-subdir-max elt) alist ()) (setq new-pos (point-max)))) (goto-char new-pos)) ;; want a separating newline between subdirs (unless (eobp) (forward-line -1)) (insert "\n") (point))
Chargez ensuite votre code modifié après avoir chargé le code vanille Dired, remplaçant ainsi les fonctions d'origine. (Vous pouvez également conseiller ces fonctions).
Cela semble faire fonctionner les choses comme prévu, évitant la nécessité de partir d'un ancêtre commun dir. Mais comme je l'ai dit, je ne sais pas si d'autres parties du code Dired (ou Wdired) pourraient être gênées par un tel changement. Il suffit d'expérimenter un peu.
Il convient toutefois de noter que dired-insert-subdir-validate
vérifie en fait deux choses, dont une seule devrait être supprimée, peut-être ( ?). En plus de vérifier si le sous-répertoire à insérer se trouve dans la même arborescence de répertoires, il vérifie si ls
sont compatibles avec ceux de l'ensemble de la liste. Je n'ai pas remarqué de problème en retirant dired-insert-subdir-validate
mais si cette vérification des commutateurs est vraiment importante, vous pouvez essayer de supprimer cette partie de l'élément dired-insert-subdir-validate
qui vérifie l'arborescence du répertoire :
(or (dired-in-this-tree dirname (expand-file-name default-directory))
(error "%s: not in this directory tree" dirname))
S'il apparaît que ces modifications de code n'ont pas d'effets secondaires indésirables qui ne peuvent être corrigés facilement, j'envisagerai de les ajouter à la rubrique Dired+ .
Merci d'avoir attiré mon attention sur ce point. Je suppose que je crée généralement ces listes à partir d'un ancêtre commun, et je n'avais donc jamais remarqué cette limitation auparavant.
BTW -- J'ai déposé le "bug" Emacs #18421 pour cette demande d'amélioration : permettre à Dired de prendre en compte les listes de répertoires qui ne proviennent pas de la même arborescence.
* MISE À JOUR #2 *
J'ai ajouté cette fonctionnalité à Dired+ .
J'ai modifié les définitions de C-x d
( dired
), C-x 4 d
( dired-other-window
), et C-x 5 d
( dired-other-frame
) de sorte que si vous utilisez un préfixe arg non positif (par exemple, C-- C-x d
), on vous demande (1) le nom de Dired buffer (ce que vous voulez, pas nécessairement un nom de répertoire) et (2) les fichiers ou répertoires individuels que vous voulez voir listés.
Un préfixe arg non négatif vous invite toujours à saisir le numéro de téléphone de la personne à contacter. ls
à utiliser. (Ainsi C-0
fait les deux : demande les commutateurs, le nom de la mémoire tampon et les fichiers à répertorier).
J'ai fixé i
( dired-maybe-insert-subdir
) afin qu'il fonctionne avec des répertoires arbitraires. Et vous pouvez bien sûr toujours utiliser un préfixe arg avec i
pour spécifier différents ls
à utiliser pour l'insertion d'une liste de sous-répertoires.