
¿Cómo puedo insertar varios directorios no relacionados (que no son subdirectorios) en un búfer dirigido? En mi caso, me gustaría preparar un búfer dirigido que contenga directorios no relacionados con múltiples cambios de archivos (por ejemplo, en modo 'wdired' con múltiples cambios de nombre y cambios, o simplemente con múltiples marcas en diferentes directorios), verificarlos visualmente y luego ejecutarlos con una sola pulsación de tecla.
Respuesta1
Proporcione una lista de cadenas, en lugar de un nombre de directorio, como (primer) argumento para funcionar dired
.
El primer elemento de la lista es el nombre del búfer Dired.
Los otros elementos de la lista son nombres de directorios o archivos.
El búfer Dired resultante tendrá una línea para cada elemento de la lista.
Por supuesto, cualquier directorio enumerado se puede insertar (es decir, expandir a su lista de archivos) usándolo i
en el búfer Dired.
Por ejemplo, evalúe esto:
(dired-other-window '("my dired buffer" DIR1 FILE1 DIR2 FILE2 FILE3))
donde DIRN
son nombres de directorios (cadenas) y FILEN
son nombres de archivos (cadenas). Puede utilizar nombres absolutos o nombres relativos al valor actual de default-directory
.
El resultado aquí es Dired buffer my dired buffer
, con líneas para directorios DIR1
y DIR2
archivos FILE1
, FILE2
y FILE3
.
No estoy seguro de seguir el resto de tu pregunta. Pero el búfer Dired resultante de lo anterior es un búfer Dired normal. Puede utilizar wdired
para permitir cambios, etc.
Actualización #1, después de tu comentario -
Buen punto. Sí, Dired i
( dired-maybe-insert-subdir
) requiere que todos los subdirectorios insertados pertenezcan al mismo árbol de directorios. No sé por qué. Quizás parte del código (y hay mucho que considerar), quizás el manejo de ls
, dependa de eso. O quizás sea una restricción que realmente no es necesaria.
Una forma de solucionar (evitar) esta restricción es comenzar en un directorio ancestro común a todos los subdirectorios que incluya en el listado. IOW comienza por hacerlo M-x cd
en ese directorio ancestral común, antes de crear su búfer Dired. En el extremo, esto significaría M-x cd
el directorio raíz. Definitivamente funcionará en todos los casos. Probablemente necesitarás usar nombres de archivos absolutos para los directorios y archivos a los que pasas dired
para el listado.
Pero como usted dice, si usa MS Windows y los directorios están en letras de unidad diferentes, entonces esta no es una solución.
A continuación se muestra otra cosa que puedes probar. No sé si podría causar problemas en algún otro lugar. (Me interesaría saber qué problemas encuentra, si es así. Consulte el encabezado del archivo de la bibliotecadired+.el
para información de contacto.)
Copie el código fuente de estas dos funciones del archivo dired-aux.el
: dired-insert-subdir
y dired-insert-subdir-newpos
, y luego modifique las copias de la siguiente manera:
Para
dired-insert-subdir
, comenta esta línea:(dired-insert-subdir-validate dirname switches)
Para
dired-insert-subdir-newpos
, cambie el código a este:(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))
Luego cargue su código modificado después de cargar el código básico de Dired, reemplazando efectivamente las funciones originales. (Como alternativa, podría recomendar esas funciones).
Esto parece hacer que las cosas funcionen como se esperaba, obviando la necesidad de comenzar desde un directorio ancestro común. Pero como digo, no sé si otras partes del código de Dired (o de Wdired) podrían verse afectadas por tal cambio. Experimenta un poco.
Tenga en cuenta, sin embargo, que dired-insert-subdir-validate
en realidad comprueba dos cosas, de las cuales sólo una debería eliminarse, tal vez (?). Además de comprobar si el subdirectorio que se va a insertar está en el mismo árbol de directorios, comprueba si ls
los modificadores del mismo son compatibles con los del listado general. No he notado ningún problema al eliminarlo dired-insert-subdir-validate
por completo, pero si esta verificación de interruptores es realmente importante, entonces puedes intentar eliminar simplemente esta parte del dired-insert-subdir-validate
código, que verifica el árbol de directorios:
(or (dired-in-this-tree dirname (expand-file-name default-directory))
(error "%s: not in this directory tree" dirname))
Si parece que dichos cambios en el código no tienen efectos secundarios no deseados que no puedan solucionarse fácilmente, consideraré agregarlos aDirigido+.
Gracias por informarme sobre esto. Supongo que normalmente creo este tipo de listados a partir de un antepasado común, por lo que no me había dado cuenta de esta limitación antes.
Por cierto, presenté el "error" n.º 18421 de Emacs para esta solicitud de mejora: permita que Dired acomode listados de directorios que no sean del mismo árbol.
*ACTUALIZACIÓN #2*
He añadido esta característica aDirigido+.
Modifiqué las definiciones deC-x d
( dired
),C-x 4 d
( dired-other-window
), yC-x 5 d
( dired-other-frame
) de modo que si utiliza un argumento de prefijo no positivo (por ejemplo, C-- C-x d
), se le solicitará (1) el nombre del búfer Dired (cualquiera que desee, no necesariamente un nombre de directorio) y (2) los archivos o directorios individuales que quieres en la lista.
Un argumento de prefijo no negativo todavía le solicita los ls
modificadores que desea utilizar. (Lo mismo C-0
ocurre con ambos: solicita interruptores y el nombre del búfer y los archivos a enumerar).
yo arregléi
( dired-maybe-insert-subdir
) para que funcione con directorios arbitrarios. Y, por supuesto, aún puede usar un prefijo arg con i
para especificar diferentes ls
modificadores a usar para el listado del subdirectorio insertado.