Semplici modi per copiare / incollare file e directory tra buffer diretti


10

Esiste un M-w C-yapproccio semplice per copiare file e directory incolla tra due buffer diretti?

Intendo contrassegnare alcuni elementi (file e buffer) mcopiandoli con M-w(o un altro collegamento), quindi andare in un altro buffer diretto (che non è necessariamente in una finestra affiancata dalla finestra dei buffer diretti precedenti) ) quindi yankingtutti i file copiati da C-y(o un altro collegamento) lì? Questa è una semplice attività che possono eseguire molti esploratori di file in diversi sistemi operativi.

Il problema con l'opzione classica Copia C in dired è che non appena viene premuto, chiede la destinazione. Se il percorso del buffer di destinazione è molto lungo o ci sono troppi buffer con orientamento aperto, questo approccio è complicato.

Sto cercando una soluzione per copiare prima gli elementi e poi incollarli in un buffer indirizzato appropriato.

C'è una domanda correlata Come copiare / spostare rapidamente i file in Emacs Dired? che utilizza l'approccio classico di premere C quando due finestre dirette sono separate verticalmente usando l'opzione (setq dired-dwim-target t).

Quali sono i modi per raggiungere questo obiettivo?

Risposte:


5

Ho aggiunto questa funzione ora a Dired + .

È possibile utilizzare C-y(comando diredp-yank-files) per incollare i file, i cui nomi assoluti sono stati copiati nel kill ring, nella directory corrente. La "directory corrente" qui è cosadired-current-directory restituisce: la sottodirectory inserita in cui si trova il cursore o la directory principale Dired se il cursore non si trova in un elenco di sottodirectory.

Con un prefisso arg, C-y invece richiesta la directory di destinazione per l'incolla. Quindi non è necessario trovarsi in un buffer Dired per incollare i file in una directory.

Dovresti aver copiato i nomi dei file sul kill ring usando M-0 wo M-x diredp-copy-abs-filenames-as-kill.

In Dired + questi comandi impostano anche la variabile diredp-last-copied-filenamessulla stessa stringa di nomi di file. C-yusa il valore di quella variabile, non quello che è attualmente alla testa del kill ring. Ciò significa che non è necessario incollarlo immediatamente dopo aver copiato i nomi dei file. E significa che potresti, invece di copiare i nomi dei file sul kill ring, semplicemente inserire i nomi in quella variabile (ad es. A livello di programmazione).

Quando si utilizza C-y, viene richiesto di confermare ( yo n). Puoi anche premere l(per "elenco") quando richiesto, per visualizzare l'elenco dei file che verranno incollati.


È inoltre possibile copiare i file contrassegnati dal buffer Dired corrente e tutti i file contrassegnati nelle sue sottodirectory contrassegnate, definite in modo ricorsivo . Per quello usi M-0 M-+ M-w(prefisso zero arg con comando diredp-copy-filename-as-kill-recursive) o usi M-x diredp-copy-abs-filenames-as-kill-recursive.


Nota che con Dired + puoi anche avere facilmente un buffer Dired che elenca qualsiasi numero di file e directory, ovunque. Cioè, le voci elencate non devono necessariamente trovarsi nella stessa directory o anche in directory correlate. Vedi C-x D F(comando diredp-dired-for-files), che si trova nel menu della barra dei menu di Dir come voce File diretti situati ovunque . È possibile contrassegnare e quindi incollare (copiare) tali file arbitrari da un buffer Dired in qualsiasi directory.


Aggiornamento 22-04-2019:

Ho anche aggiunto la possibilità di spostare (non solo incollare) i file i cui nomi (assoluti) sono stati copiati nel kill ring nella directory corrente (o in un'altra). Questo è legato a C-win Dired.

diredp-move-files-named-in-kill-ringè una funzione interattiva Lisp in dired+.el.

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

Sposta i file, i cui nomi assoluti sono stati copiati, nella directory corrente.

Con un arg di prefisso non negativo viene invece richiesta la directory di destinazione.

Con un arg prefisso non positivo puoi vedere i dettagli sui file se premi lquando ti viene richiesto di confermare l'incollamento. Altrimenti vedi solo i nomi dei file. I dettagli visualizzati sono definiti dall'opzione diredp-list-file-attributes.

Dovresti aver copiato l'elenco dei nomi dei file come stringa nel kill ring usando M-0 wo M-x diredp-copy-abs-filenames-as-kill. Questi comandi impostano anche la variabile diredp-last-copied-filenamessulla stessa stringa. diredp-move-files-named-in-kill-ringusa il valore di quella variabile, non quello che è attualmente alla testa del kill ring.

Quando viene chiamato da Lisp:

  • Arg opzionale NO-CONFIRM-P significa non chiedere conferma per spostare.
  • Arg opzionale DETAILSè passato a diredp-y-or-n-files-p.

Funzionava bene. Diredp ha dovuto C-wspostare / rinominare il file anziché copiarlo? Grazie
azzamsa,

@azzamsa: No, non credo. (Immagino che intendi usare i nomi dei file che sono sul kill-ringper dire a Dired di spostare quei file da qualche parte, ad esempio, chiedendo dove spostarli.)
Disegnato l'

Sicuro. Voglio dire, perché non aggiungi questa funzionalità? sarebbe fantastico :). Perché l'attuale, supporta solo Cy. Solo copia, non spostare / rinominare.
azzamsa,

Adesso. Uso questo hacker diretto per questo Grazie.
azzamsa,

Cordiali saluti - Ora puoi usare C-wper spostare i file di cui hai copiato i nomi.
Estratto il

4

In Vanilla Dired è possibile effettuare le seguenti operazioni (non è necessaria alcuna libreria di terze parti):

  1. Passare innanzitutto a un buffer Dired che elenca la directory di destinazione .

  2. Con il cursore sulla riga di intestazione della directory per un elenco della directory di destinazione, utilizzare w(comando dired-copy-filename-as-kill). Questo copia il nome assoluto di quella directory di destinazione. (È possibile copiare un nome di directory da qualsiasi riga di intestazione del sottodir-elenco Dired allo stesso modo.)

  3. Vai al buffer Dired che elenca i file che desideri copiare . Contrassegna quei file.

  4. Utilizzare C(comando dired-do-copy) per copiare i file contrassegnati . Al prompt, utilizzare C-yper incollare il nome (assoluto) della directory di destinazione . Puoi semplicemente incollarlo, senza preoccuparti di rimuovere la directory predefinita che viene inserita nel minibuffer. (Incollandolo dopo il nome della directory predefinita, il nome predefinito viene oscurato - viene ignorato.)

Questo è, credo, semplice come quello che descrivi ( C-wper copiare i nomi di file contrassegnati seguiti C-ydall'elenco Dired di destinazione), ma l' ordine è opposto : copi prima il nome della directory di destinazione, quindi incollalo nel C(dired-do-copy comando ) .

( dired-do-copyverifica la presenza di file esistenti con lo stesso nome nella directory di destinazione, ecc.)


Suggerimento: (Questo non è necessario se si utilizza Dired + - vedere qui l'altra mia risposta.) Se si intende copiare (o spostare) file da più directory nella stessa directory di destinazione, e si potrebbero fare altre cose con il kill-ring nel mezzo, in modo che il nome della directory di destinazione copiata non possa più essere il primo nel kill-ring, quindi utilizzare la selezione secondaria per selezionare il nome della directory di destinazione. La selezione secondaria non dipende dalla regione o dalla posizione del cursore: puoi incollarla tutte le volte che vuoi, indipendentemente dalle modifiche al kill-ring. Puoi incollarlo usando il mouse, ma è più comodo da usare C-M-ydalla libreria second-sel.el.


2

La tua idea sembra semplice, forse puoi provare a implementarla da solo, puoi anche utilizzare quanto segue per iniziare, se lo desideri.

(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)))

Grazie mille. Ho un suggerimento: dopo aver incollato, aggiorna (aggiorna) il buffer diretto per vedere i nuovi elementi copiati.
Nome

Un altro suggerimento: deselezionare gli elementi contrassegnati dopo averli incollati.
Nome

@ Nome Buoni suggerimenti. Ti consiglio di implementarli da solo poiché sei tu quello che lo userà. In bocca al lupo.
Xuchunyang,

2

Il file manager di Ranger funziona come descritto, ma è ispirato a vim (quindi i tasti yydi scelta rapida per yank / copia pper incollare ecc.). Emacs ha anche l'implementazione di ranger. Provalo, forse si adatta alle tue necessità.

Io stesso uso emacs sunrise-commander che è simile a Midnight Commander (mc), ogni volta che sento di aver bisogno di una gestione dei file a doppio pannello.

Aggiornamento: dired-ranger ha quel copia / incolla che hai descritto. Almeno nei documenti.

;; 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.
;; ...

Ci sono dired-rangere rangerdisponibili su MELPA. Vuoi dire quale?
Nome

beh, non sapevo di Dired-Ranger ma dalla descrizione sembra che tu voglia.
Maxim Kim,

1

Vorrei anche suggerire di usare dired-ranger. Questo è quello che ho nel mio 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)))
)

0

Dired Ranger è stata la vera soluzione per me:

È possibile ottenere il comportamento comune di Esplora file come descritto, proprio con questa semplice configurazione (supponendo che si usi use-package):

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.