Des moyens simples pour copier / coller des fichiers et des répertoires entre les tampons dirigés

10

Existe-t-il une M-w C-yapproche simple pour copier-coller des fichiers et des répertoires entre deux tampons dirigés?

Je veux dire marquer certains éléments (fichiers et tampon) en les mcopiant ensuite par M-w(ou un autre raccourci), puis aller dans un autre tampon dired (qui n'est pas nécessairement dans une fenêtre côte à côte par la fenêtre du ou des tampons dired précédents) ) puis yankingtous les fichiers copiés par C-y(ou un autre raccourci) là-bas? Il s'agit d'une tâche simple que de nombreux explorateurs de fichiers dans différents systèmes d'exploitation peuvent effectuer.

Le problème avec l'option de copie C classique en dired est que dès qu'elle est pressée, elle demande la destination. Si le chemin du tampon de destination est très long ou s'il y a trop de tampon dirigé ouvert, cette approche est compliquée.

Je cherche une solution pour copier d'abord les éléments puis les coller dans un tampon dired approprié.

Il y a une question connexe Comment copier / déplacer rapidement un fichier dans Emacs Dired? qui utilise l'approche classique d'appuyer sur C lorsque deux fenêtres dirigées se séparent verticalement en utilisant l'option (setq dired-dwim-target t).

Quels sont les moyens d'y parvenir?

Nom
la source

Réponses:

5

J'ai maintenant ajouté cette fonctionnalité à Dired + .

Vous pouvez utiliser C-y(commande diredp-yank-files) pour coller des fichiers, dont vous avez copié les noms absolus dans le kill ring, dans le répertoire courant. Le "répertoire courant" est ici ce qui dired-current-directoryrevient: le sous-répertoire inséré où se trouve le curseur, ou le répertoire principal Dired si le curseur n'est pas dans une liste de sous-répertoires.

Avec un préfixe arg, C-yvous invite à la place pour le répertoire cible pour la pâte. Vous n'avez donc pas besoin d'être dans un tampon Dired pour coller des fichiers dans un répertoire.

Vous devez avoir copié les noms de fichiers dans le kill ring à l'aide de M-0 wou M-x diredp-copy-abs-filenames-as-kill.

Dans Dired +, ces commandes définissent également la variable diredp-last-copied-filenamessur la même chaîne de noms de fichiers. C-yutilise la valeur de cette variable, pas celle qui se trouve actuellement en tête du kill ring. Cela signifie que vous n'avez pas besoin de coller immédiatement après avoir copié les noms de fichiers. Et cela signifie que vous pourriez, au lieu de copier les noms de fichiers dans le kill ring, simplement mettre les noms dans cette variable (par exemple par programme).

Lorsque vous utilisez C-y, vous êtes invité à confirmer ( you n). Vous pouvez également appuyer sur l(pour "liste") lorsque vous y êtes invité, pour afficher la liste des fichiers qui seront collés.


Vous pouvez également copier les fichiers marqués à partir du tampon Dired actuel et tous les fichiers marqués dans ses sous-répertoires marqués, définis récursivement . Pour cela, vous utilisez M-0 M-+ M-w(zéro préfixe arg avec la commande diredp-copy-filename-as-kill-recursive) ou utilisez M-x diredp-copy-abs-filenames-as-kill-recursive.


Notez qu'avec Dired +, vous pouvez également facilement avoir un tampon Dired qui répertorie n'importe quel nombre de fichiers et de répertoires, de n'importe où. Autrement dit, les entrées répertoriées ne doivent pas nécessairement se trouver dans le même répertoire ni même dans des répertoires associés. Voir C-x D F(commande diredp-dired-for-files), qui se trouve dans le menu de la barre de menus Dir comme élément Fichiers fatigués situés n'importe où . Vous pouvez marquer puis coller (copier) ces fichiers arbitraires d'un tampon Dired dans n'importe quel répertoire.


Mise à jour 2019-04-22:

J'ai également ajouté la possibilité de déplacer (et pas seulement de coller) les fichiers dont vous avez copié les noms (absolus) dans le kill ring vers le répertoire actuel (ou un autre). C'est lié à C-wDired.

diredp-move-files-named-in-kill-ringest une fonction Lisp interactive dans dired+.el.

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

Déplacez les fichiers dont vous avez copié les noms absolus dans le répertoire actuel.

Avec un argument de préfixe non négatif, vous êtes plutôt invité à indiquer le répertoire cible.

Avec un argument de préfixe non positif, vous pouvez voir les détails des fichiers si vous appuyez sur llorsque vous êtes invité à confirmer le collage. Sinon, vous ne voyez que les noms de fichiers. Les détails que vous voyez sont définis par option diredp-list-file-attributes.

Vous devriez avoir copié la liste des noms de fichiers sous forme de chaîne dans le kill ring à l'aide de M-0 wou M-x diredp-copy-abs-filenames-as-kill. Ces commandes définissent également la variable diredp-last-copied-filenamessur la même chaîne. diredp-move-files-named-in-kill-ringutilise la valeur de cette variable, pas celle qui se trouve actuellement en tête du kill ring.

En cas d'appel depuis Lisp:

  • Arg optionnel NO-CONFIRM-Psignifie ne pas demander de confirmation de déplacement.
  • L'argument facultatif DETAILSest transmis à diredp-y-or-n-files-p.
A dessiné
la source
A bien fonctionné. Diredp a-t-il dû C-wdéplacer / renommer le fichier au lieu de le copier?. Merci
azzamsa
@azzamsa: Non, je ne pense pas. (Je suppose que vous voulez dire utiliser des noms de fichiers qui kill-ringindiquent à Dired de déplacer ces fichiers quelque part, par exemple, en demandant où les déplacer.)
Drew
Sûr. Je veux dire pourquoi n'ajoutez-vous pas cette fonctionnalité? ça serait génial :). Parce que le courant, ne supporte que Cy. Copier uniquement, ne pas déplacer / renommer.
azzamsa
Maintenant. J'utilise le piratage de dired-ranger pour ce merci.
azzamsa
FYI - Vous pouvez maintenant utiliser C-wpour déplacer les fichiers dont vous avez copié les noms.
Drew
4

Vous pouvez effectuer les opérations suivantes dans vanilla Dired (aucune bibliothèque tierce n'est requise):

  1. Accédez d'abord à un tampon Dired qui répertorie le répertoire cible .

  2. Avec le curseur sur la ligne d'en-tête du répertoire pour une liste du répertoire cible, utilisez w(commande dired-copy-filename-as-kill). Cela copie le nom absolu de ce répertoire cible. (Vous pouvez copier un nom de répertoire à partir de n'importe quelle ligne d'en-tête de sous-répertoire répertorié de la même manière.)

  3. Accédez au tampon Dired qui répertorie les fichiers que vous souhaitez copier . Marquez ces fichiers.

  4. Utilisez C(commande dired-do-copy) pour copier les fichiers marqués . À l'invite, utilisez C-ypour coller le nom (absolu) du répertoire cible . Vous pouvez simplement le coller, sans prendre la peine de supprimer le répertoire par défaut qui est inséré dans le mini-tampon. (Le coller après ce nom de répertoire par défaut atténue ce nom par défaut - il est ignoré.)

C'est, je pense, aussi simple que ce que vous décrivez ( C-wpour copier les noms de fichiers marqués suivis C-ydans la liste Dired cible), mais l' ordre est opposé : vous copiez d'abord le nom du répertoire cible, puis le collez dans la commande C( dired-do-copy) .

( dired-do-copyrecherche les fichiers existants du même nom dans le répertoire cible, etc.)


Astuce: (Ce n'est pas nécessaire si vous utilisez Dired + - voir mon autre réponse ici.) Si vous avez l'intention de copier (ou déplacer) des fichiers de plusieurs répertoires vers le même répertoire cible, et vous pourriez faire d'autres choses avec le kill-ring entre les deux, afin que le nom du répertoire cible copié ne soit plus le premier dans le kill-ring, puis utilisez la sélection secondaire pour sélectionner le nom du répertoire cible. La sélection secondaire ne dépend pas de la région ou de la position du curseur - vous pouvez le coller autant de fois que vous le souhaitez, indépendamment des modifications apportées au kill-ring. Vous pouvez le coller à l'aide de la souris, mais il est plus pratique à utiliser à C-M-ypartir de la bibliothèque second-sel.el.

A dessiné
la source
2

Votre idée semble simple, vous pouvez peut-être essayer de la mettre en œuvre par vous-même, vous pouvez également utiliser les éléments suivants pour commencer si vous le souhaitez.

(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
la source
Merci beaucoup. J'ai une suggestion: après avoir collé, mettez à jour (rafraîchissez) le tampon dired afin de voir les nouveaux éléments copiés.
Nom du
Autre suggestion: décocher les éléments marqués après le collage.
Nom du
@Name Bonnes suggestions. Je vous recommande de les implémenter par vous-même car c'est vous qui allez l'utiliser. Bonne chance.
xuchunyang
2

Le gestionnaire de fichiers Ranger fonctionne comme vous le décrivez, mais il est inspiré par vim (donc les raccourcis clavier de vim yyà copier / copier ppour coller, etc.). Emacs a également implémenté Ranger. Essayez-le, il répondra peut-être à vos besoins.

Pour ma part, j'utilise emacs sunrise-commander qui ressemble un peu à Midnight Commander (mc), chaque fois que je pense avoir besoin d'une gestion de fichiers à double vitrage.

Upd: dired-ranger a le copier / coller que vous avez décrit. Au moins dans les documents.

;; 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
la source
Il existe dired-rangeret est rangerdisponible sur MELPA. Tu veux dire lequel?
Nom du
eh bien, je ne connaissais pas dired-ranger mais d'après la description, cela ressemble à quelque chose que vous voulez.
Maxim Kim
1

Je suggère également d'utiliser dired-ranger. Voici ce que j'ai dans mon 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
la source
0

Ranger fatigué était la vraie solution pour moi:

Vous pouvez obtenir un comportement d'explorateur de fichiers commun comme vous le décrivez, juste avec cette configuration simple (en supposant que vous utilisez use-package):

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