Formas simples de copiar / pegar archivos y directorios entre buffers directos

10

¿Existe un M-w C-yenfoque simple para copiar y pegar archivos y directorios entre dos buffers directos?

Me refiero a marcar algunos elementos (archivos y búfer) mcopiándolos luego M-w(u otro acceso directo), luego yendo a otro búfer directo (que no está necesariamente en una ventana de lado a lado junto a la ventana de búfer (es) anterior (es) ) entonces yankingtodo el archivo copiado por C-y(u otro acceso directo) allí? Esta es una tarea simple que muchos exploradores de archivos en diferentes sistemas operativos pueden hacer.

El problema con la opción de copia clásica C en dired es que tan pronto como se presiona, pregunta por el destino. Si la ruta del búfer de destino es muy larga o hay demasiados búfer dired abiertos, este enfoque es complicado.

Estoy buscando una solución para copiar primero los elementos y luego pegarlos en un búfer dired apropiado.

Hay una pregunta relacionada ¿ Cómo copiar / mover rápidamente un archivo en Emacs Dired? que usa el enfoque clásico de presionar C cuando dos ventanas dired se separan verticalmente usando la opción (setq dired-dwim-target t).

¿Cuáles son las formas de lograr esto?

Nombre
fuente

Respuestas:

5

He agregado esta función ahora a Dired + .

Puede usar C-y(comando diredp-yank-files) para pegar archivos, cuyos nombres absolutos ha copiado en el anillo de eliminación, en el directorio actual. El "directorio actual" aquí es lo que dired-current-directorydevuelve: el subdirectorio insertado donde se encuentra el cursor, o el directorio principal Dired si el cursor no está en una lista de subdirectorios.

Con un prefijo arg, en su C-ylugar le solicita el directorio de destino para pegar. Por lo tanto, no necesita estar en un búfer Dired para pegar archivos en un directorio.

Deberías haber copiado los nombres de archivo en el ring de asesinatos usando M-0 wo M-x diredp-copy-abs-filenames-as-kill.

En Dired + esos comandos también establecen variables diredp-last-copied-filenamesen la misma cadena de nombres de archivo. C-yusa el valor de esa variable, no lo que sea actualmente en la cabeza del anillo de matar. Esto significa que no necesita pegar inmediatamente después de copiar los nombres de archivo. Y significa que podría, en lugar de copiar nombres de archivo en el anillo de eliminación, simplemente poner los nombres en esa variable (por ejemplo, mediante programación).

Cuando lo usa C-y, se le solicita confirmación ( yo n). También puede presionar l(para "lista") cuando se le solicite, para mostrar la lista de archivos que se pegarán.


También puede copiar los archivos marcados desde el búfer Dired actual y cualquier archivo marcado en sus subdirectorios marcados, definidos de forma recursiva . Para eso usa M-0 M-+ M-w(prefijo cero arg con comando diredp-copy-filename-as-kill-recursive) o usa M-x diredp-copy-abs-filenames-as-kill-recursive.


Tenga en cuenta que con Dired + también puede tener fácilmente un búfer Dired que enumera cualquier número de archivos y directorios, desde cualquier lugar. Es decir, las entradas enumeradas no necesitan estar en el mismo directorio o incluso en directorios relacionados. Ver C-x D F(comando diredp-dired-for-files), que está en el menú de la barra de menú Dir como elemento Dired Files ubicado en cualquier lugar . Puede marcar y luego pegar (copiar) dichos archivos arbitrarios desde un búfer Dired a cualquier directorio.


Actualización 2019-04-22:

También agregué la capacidad de mover (no solo pegar) los archivos cuyos nombres (absolutos) copió al anillo de matar al directorio actual (u otro). Esto está obligado C-wen Dired.

diredp-move-files-named-in-kill-ringes una función interactiva de Lisp en dired+.el.

(diredp-move-files-named-in-kill-ring &optional DIR NO-CONFIRM-P DETAILS)

Mueva los archivos, cuyos nombres absolutos copió, al directorio actual.

Con un argumento de prefijo no negativo, se le solicitará el directorio de destino.

Con un argumento de prefijo no positivo, puede ver detalles sobre los archivos si presiona lcuando se le solicite que confirme el pegado. De lo contrario, solo verá los nombres de los archivos. Los detalles que ve están definidos por la opción diredp-list-file-attributes.

Deberías haber copiado la lista de nombres de archivo como una cadena al anillo de matar usando M-0 wo M-x diredp-copy-abs-filenames-as-kill. Esos comandos también establecen variables diredp-last-copied-filenamesen la misma cadena. diredp-move-files-named-in-kill-ringusa el valor de esa variable, no lo que sea actualmente en la cabeza del anillo de matar.

Cuando se llama desde Lisp:

  • Argumento opcional NO-CONFIRM-Psignifica no pedir confirmación para moverse.
  • Argu opcional DETAILSse pasa a diredp-y-or-n-files-p.
Dibujó
fuente
Funcionó bien. ¿Diredp tuvo C-wque mover / renombrar el archivo en lugar de copiar? Gracias
azzamsa
@azzamsa: No, no lo creo. (Te supongo nombres de archivo utilización de medias que están en el kill-ringdecirle a Dired para mover esos archivos en algún lugar, por ejemplo, lo que llevó a dónde moverlos.)
dibujó
Por supuesto. Quiero decir, ¿por qué no agregas esta funcionalidad? sería genial :). Porque la actual, solo admite Cy. Solo copiar, no mover / renombrar.
azzamsa
Ahora. Yo uso hack-Ranger dired para esta Gracias.
azzamsa
FYI: ahora puede usar C-wpara mover los archivos cuyos nombres copió.
Dibujó el
4

Puede hacer lo siguiente en Vanilla Dired (no se necesita una biblioteca de terceros):

  1. Vaya primero a un búfer Dired que enumera el directorio de destino .

  2. Con el cursor en la línea del encabezado del directorio para obtener una lista del directorio de destino, use w(comando dired-copy-filename-as-kill). Esto copia el nombre absoluto de ese directorio de destino. (Puede copiar un nombre de directorio desde cualquier línea de encabezado de subdirectorio Dired-list de la misma manera).

  3. Vaya al búfer Dired que enumera los archivos que desea copiar . Marcar esos archivos.

  4. Use C(comando dired-do-copy) para copiar los archivos marcados . En el indicador, use C-ypara pegar el nombre (absoluto) del directorio de destino . Simplemente puede pegarlo, sin molestarse en eliminar el directorio predeterminado que se inserta en el minibúfer. (Pegarlo después de ese nombre de directorio predeterminado atenúa ese nombre predeterminado; se ignora).

Creo que esto es tan simple como lo que usted describe ( C-wpara copiar nombres de archivos marcados seguidos de C-yla lista Dired de destino), pero el orden es opuesto : primero copie el nombre del directorio de destino y luego péguelo en el comando C( dired-do-copy) .

( dired-do-copybusca archivos existentes con el mismo nombre en el directorio de destino, etc.)


Consejo: (Esto no es necesario si usa Dired + ; consulte mi otra respuesta aquí). Si tiene la intención de copiar (o mover) archivos de varios directorios al mismo directorio de destino, y podría estar haciendo otras cosas con el anillo de cierre en el medio, de modo que el nombre del directorio de destino copiado ya no sea el primero en el anillo de eliminación, luego use la selección secundaria para seleccionar el nombre del directorio de destino. La selección secundaria no depende de la región o la posición del cursor; puede pegarla tantas veces como desee, independientemente de los cambios en el anillo de cierre. Puede pegarlo con el mouse, pero es más fácil de usar C-M-ydesde la biblioteca second-sel.el.

Dibujó
fuente
2

Su idea parece sencilla, tal vez pueda intentar implementarla usted mismo, también puede usar lo siguiente para comenzar si lo desea.

(defvar your-dired-copy-list nil)

(defun your-dired-copy ()
  (interactive)
  (setq your-dired-copy-list (dired-get-marked-files)))

(defun your-dired-paste ()
  (interactive)
  (when your-dired-copy-list
    (shell-command
     (mapconcat
      #'shell-quote-argument
      `("cp" "-r" ,@your-dired-copy-list ,default-directory)
      " "))
    (setq your-dired-copy-list nil)))
xuchunyang
fuente
Muchas gracias. Tengo una sugerencia: después de pegar, actualice (actualice) el búfer dired para ver los nuevos elementos copiados.
Nombre
Otra sugerencia: desmarcar los elementos marcados después de pegar.
Nombre
@Nombre Buenas sugerencias. Le recomiendo que los implemente usted mismo, ya que usted es quien lo va a usar. Buena suerte.
xuchunyang
2

El administrador de archivos Ranger funciona de la manera que usted describe, pero está inspirado en vim (por lo tanto, las combinaciones yyde teclas de vim para tirar / copiar ppara pegar, etc.). Emacs también tiene implementación de guardabosques. Pruébelo, tal vez se ajuste a su necesidad.

Yo mismo uso emacs sunrise-commander, que es similar a Midnight Commander (mc), cada vez que siento que necesito la administración de archivos de doble panel.

Upd: dired-ranger tiene esa copia / pegado que ha descrito. Al menos en los documentos.

;; Multi-stage copy/pasting of files
;; ---------------------------------

;; A feature present in most orthodox file managers is a "two-stage"
;; copy/paste process.  Roughly, the user first selects some files,
;; "copies" them into a clipboard and then pastes them to the target
;; location.  This workflow is missing in dired.

;; In dired, user first marks the files, then issues the
;; `dired-do-copy' command which prompts for the destination.  The
;; files are then copied there.  The `dired-dwim-target' option makes
;; this a bit friendlier---if two dired windows are opened, the other
;; one is automatically the default target.

;; With the multi-stage operations, you can gather files from
;; *multiple* dired buffers into a single "clipboard", then copy or
;; move all of them to the target location.  Another huge advantage is
;; that if the target dired buffer is already opened, switching to it
;; via ido or ibuffer is often faster than selecting the path.

;; Call `dired-ranger-copy' to add marked files (or the file under
;; point if no files are marked) to the "clipboard".  With non-nil
;; prefix argument, add the marked files to the current clipboard.

;; Past clipboards are stored in `dired-ranger-copy-ring' so you can
;; repeat the past pastes.
;; ...
Maxim Kim
fuente
Hay dired-rangery están rangerdisponibles en MELPA. ¿Te refieres a cuál?
Nombre
bueno, no sabía nada de dired-ranger, pero por la descripción parece que quieres algo.
Maxim Kim
1

También sugeriría usar dired-ranger. Esto es lo que tengo en mi init.el:

(use-package dired-ranger
  :ensure t
  :config
  (setq dired-ranger-copy-ring-size 1)
    (define-key dired-mode-map (kbd "C-w")
        (lambda ()
            (interactive)
            (dired-ranger-copy nil) ; t adds item to dired-ranger-copy-ring
            (define-key dired-mode-map (kbd "C-y") 'dired-ranger-move)))
    (define-key dired-mode-map (kbd "M-w")
        (lambda ()
            (interactive)
            (dired-ranger-copy nil)
            (define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)))
)
Timm
fuente
0

Dired Ranger fue la verdadera solución para mí:

Puede lograr un comportamiento común del explorador de archivos como lo describe, solo con esta configuración simple (suponiendo que use use-package):

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
azzamsa
fuente