Einfache Möglichkeiten zum Kopieren / Einfügen von Dateien und Verzeichnissen zwischen Puffern

9

Gibt es einen einfachen M-w C-yAnsatz zum Kopieren von Einfügedateien und Verzeichnissen zwischen zwei dired Puffern?

Ich meine, einige Elemente (Dateien und Puffer) zu markieren, indem sie mdann kopiert werden M-w(oder eine andere Verknüpfung) und dann zu einem anderen dired-Puffer wechseln (der sich nicht unbedingt in einem Fenster neben dem Fenster der vorherigen dired-Puffer befindet). ) dann yankingalle kopierten Dateien von C-y(oder einer anderen Verknüpfung) dort? Dies ist eine einfache Aufgabe, die viele Datei-Explorer in verschiedenen Betriebssystemen ausführen können.

Das Problem mit der klassischen Kopieroption C in dired ist, dass sie nach dem Drücken nach dem Ziel fragt. Wenn der Pfad des Zielpuffers sehr lang ist oder zu viele geöffnete Dired-Puffer vorhanden sind, ist dieser Ansatz kompliziert.

Ich suche nach einer Lösung, um zuerst die Elemente zu kopieren und sie dann in einen geeigneten Puffer einzufügen.

Es gibt eine verwandte Frage: Wie kann eine Datei in Emacs Dired schnell kopiert / verschoben werden? Dies verwendet den klassischen Ansatz, C zu drücken, wenn zwei Fenster mit der Option vertikal voneinander getrennt sind (setq dired-dwim-target t).

Wie kann dies erreicht werden?

Name
quelle

Antworten:

5

Ich habe diese Funktion jetzt zu Dired + hinzugefügt .

Mit C-y(Befehl diredp-yank-files) können Sie Dateien, deren absolute Namen Sie in den Kill Ring kopiert haben, in das aktuelle Verzeichnis einfügen. Das "aktuelle Verzeichnis" gibt hier Folgendes dired-current-directoryzurück: das eingefügte Unterverzeichnis, in dem sich der Cursor befindet, oder das Dired-Hauptverzeichnis, wenn sich der Cursor nicht in einer Unterverzeichnisliste befindet.

C-yFordert Sie stattdessen mit einem Präfix arg zur Eingabe des Zielverzeichnisses für das Einfügen auf. Sie müssen sich also nicht in einem Dired-Puffer befinden, um Dateien in ein Verzeichnis einzufügen.

Sie sollten Dateinamen mit M-0 woder in den Kill Ring kopiert haben M-x diredp-copy-abs-filenames-as-kill.

In Dired + setzen diese Befehle die Variable auch diredp-last-copied-filenamesauf dieselbe Zeichenfolge von Dateinamen. C-yVerwendet den Wert dieser Variablen, nicht das, was sich derzeit am Kopf des Kill-Rings befindet. Dies bedeutet, dass Sie nicht sofort nach dem Kopieren der Dateinamen einfügen müssen. Und es bedeutet, dass Sie, anstatt Dateinamen in den Kill-Ring zu kopieren, einfach die Namen in diese Variable einfügen können (z. B. programmgesteuert).

Wenn Sie verwenden C-y, werden Sie zur Bestätigung ( yoder n) aufgefordert . Sie können auch auf l(für "Liste") klicken, wenn Sie dazu aufgefordert werden, um die Liste der Dateien anzuzeigen, die eingefügt werden sollen.


Sie können die markierten Dateien auch aus dem aktuellen Dired-Puffer und allen markierten Dateien in den markierten Unterverzeichnissen kopieren , die rekursiv definiert wurden . Dafür verwenden Sie M-0 M-+ M-w(Null Präfix arg mit Befehl diredp-copy-filename-as-kill-recursive) oder verwenden M-x diredp-copy-abs-filenames-as-kill-recursive.


Beachten Sie, dass Sie mit Dired + auch problemlos einen Dired-Puffer haben können, der von überall aus eine beliebige Anzahl von Dateien und Verzeichnissen auflistet. Das heißt, die aufgelisteten Einträge müssen sich nicht im selben Verzeichnis oder sogar in verwandten Verzeichnissen befinden. Siehe C-x D F(Befehl diredp-dired-for-files), der sich im Menü der Dir -Menüleiste als Element Dired Files befindet, das sich überall befindet . Sie können solche beliebigen Dateien markieren und dann aus einem Dired-Puffer in ein beliebiges Verzeichnis einfügen (kopieren).


Update 2019-04-22:

Ich habe auch die Möglichkeit hinzugefügt, die Dateien, deren (absolute) Namen Sie in den Kill Ring kopiert haben, in das aktuelle (oder ein anderes) Verzeichnis zu verschieben (nicht nur einzufügen). Dies ist C-win Dired gebunden .

diredp-move-files-named-in-kill-ringist eine interaktive Lisp-Funktion in dired+.el.

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

Verschieben Sie Dateien, deren absolute Namen Sie kopiert haben, in das aktuelle Verzeichnis.

Mit einem nicht negativen Präfix arg werden Sie stattdessen zur Eingabe des Zielverzeichnisses aufgefordert.

Mit einem nicht positiven Präfix arg können Sie Details zu den Dateien anzeigen, wenn Sie auf ldrücken, wenn Sie aufgefordert werden, das Einfügen zu bestätigen. Ansonsten sehen Sie nur die Dateinamen. Die angezeigten Details werden nach Option definiert diredp-list-file-attributes.

Sie sollten die Liste der Dateinamen als Zeichenfolge mit M-0 woder in den Kill-Ring kopiert haben M-x diredp-copy-abs-filenames-as-kill. Diese Befehle setzen auch die Variable diredp-last-copied-filenamesauf dieselbe Zeichenfolge. diredp-move-files-named-in-kill-ringVerwendet den Wert dieser Variablen, nicht das, was sich derzeit am Kopf des Kill-Rings befindet.

Wenn von Lisp angerufen:

  • Optionales Argument NO-CONFIRM-Pbedeutet, dass Sie nicht um Bestätigung für den Umzug bitten müssen.
  • Optionales Argument DETAILSwird an übergeben diredp-y-or-n-files-p.
Drew
quelle
Hat gut funktioniert. Musste diredp die C-wDatei verschieben / umbenennen anstatt zu kopieren? Danke
Azzamsa
@azzamsa: Nein, das glaube ich nicht. (Ich denke, Sie meinen, verwenden Sie Dateinamen, die auf kill-ringDired stehen, um diese Dateien irgendwohin zu verschieben, z. B. um zu fragen, wohin sie verschoben werden sollen.)
Drew
Sicher. Ich meine, warum fügst du diese Funktionalität nicht hinzu? es wäre großartig :). Da die aktuellen nur Cy unterstützen. Nur kopieren, nicht verschieben / umbenennen.
Azzamsa
Jetzt. Ich benutze Dired-Ranger-Hack für diesen Dank.
Azzamsa
Zu Ihrer Information - Sie können jetzt C-wdie Dateien verschieben, deren Namen Sie kopiert haben.
Drew
4

In vanilla Dired können Sie Folgendes tun (keine Bibliothek eines Drittanbieters erforderlich):

  1. Wechseln Sie zuerst zu einem Dired-Puffer, in dem das Zielverzeichnis aufgeführt ist .

  2. Verwenden Sie w(Befehl dired-copy-filename-as-kill), wenn sich der Cursor in der Kopfzeile des Verzeichnisses befindet, um eine Liste des Zielverzeichnisses anzuzeigen . Dies kopiert den absoluten Namen dieses Zielverzeichnisses. (Sie können auf die gleiche Weise einen Verzeichnisnamen aus jeder Unterverzeichnis-Kopfzeile mit Dired-Listing kopieren.)

  3. Wechseln Sie zum Dired-Puffer, in dem die Dateien aufgelistet sind, die Sie kopieren möchten . Markieren Sie diese Dateien.

  4. Verwenden Sie C(Befehl dired-do-copy), um die markierten Dateien zu kopieren . Verwenden Sie C-yan der Eingabeaufforderung den (absoluten) Namen des Zielverzeichnisses . Sie können es einfach einfügen, ohne das Standardverzeichnis entfernen zu müssen, das in den Minibuffer eingefügt wird. (Wenn Sie es nach diesem Standardverzeichnisnamen einfügen, wird dieser Standardname verkleinert - es wird ignoriert.)

Ich denke, dies ist so einfach wie das, was Sie beschreiben ( C-wum markierte Dateinamen zu kopieren, gefolgt von C-yder Liste "Ziel", aber die Reihenfolge ist umgekehrt : Sie kopieren zuerst den Namen des Zielverzeichnisses und fügen ihn dann in den Befehl C( dired-do-copy) ein .

( dired-do-copysucht im Zielverzeichnis nach vorhandenen gleichnamigen Dateien usw.)


Tipp: (Dies ist nicht erforderlich, wenn Sie Dired + verwenden - siehe meine andere Antwort hier.) Wenn Sie Dateien aus mehreren Verzeichnissen in dasselbe Zielverzeichnis kopieren (oder verschieben) möchten und möglicherweise andere Aktionen mit dem Kill-Ring ausführen Dazwischen, damit der kopierte Zielverzeichnisname möglicherweise nicht mehr zuerst im Kill-Ring steht, verwenden Sie dann die sekundäre Auswahl , um den Zielverzeichnisnamen auszuwählen. Die sekundäre Auswahl hängt nicht von der Region oder der Position des Cursors ab. Sie können sie beliebig oft einfügen, unabhängig von Änderungen am Kill-Ring. Sie können es mit der Maus einfügen, aber es ist einfacher, es C-M-yaus der Bibliothek zu verwenden second-sel.el.

Drew
quelle
2

Ihre Idee klingt unkompliziert. Vielleicht können Sie versuchen, sie selbst umzusetzen. Sie können auch Folgendes verwenden, um loszulegen, wenn Sie möchten.

(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
quelle
Vielen Dank. Ich habe einen Vorschlag: Aktualisieren (aktualisieren) Sie nach dem Einfügen den dired-Puffer, um die neu kopierten Elemente anzuzeigen.
Name
Ein weiterer Vorschlag: Die Markierung der markierten Elemente nach dem Einfügen aufheben.
Name
@Name Gute Vorschläge. Ich empfehle Ihnen, sie selbst zu implementieren, da Sie derjenige sind, der sie verwenden wird. Viel Glück.
Xuchunyang
2

Der Ranger-Dateimanager funktioniert wie beschrieben, ist jedoch von vim inspiriert (daher vim-Tastenkombinationen yyzum Ziehen / Kopieren pzum Einfügen usw.). Emacs hat auch die Implementierung von Ranger. Probieren Sie es aus, vielleicht passt es Ihren Bedürfnissen.

Ich selbst benutze Emacs Sunrise-Commander, ähnlich wie Midnight Commander (mc), wenn ich das Gefühl habe, dass ich doppelte Fenster verwalten muss.

Upd: dired-ranger hat das von Ihnen beschriebene Kopieren / Einfügen. Zumindest in den Dokumenten.

;; 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
quelle
Es gibt dired-rangerund gibt rangeres auf MELPA. Du meinst welches?
Name
Nun, ich wusste nichts über Dired-Ranger, aber aus der Beschreibung geht hervor, dass Sie etwas wollen.
Maxim Kim
1

Ich würde auch vorschlagen, zu verwenden dired-ranger. Das habe ich in meinem 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
quelle
0

Dired Ranger war die wahre Lösung für mich:

Sie können ein allgemeines Verhalten des Datei-Explorers erreichen, wie Sie es beschreiben, nur mit dieser einfachen Konfiguration (vorausgesetzt, Sie verwenden use-package):

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