Cara sederhana untuk menyalin / menempelkan file dan direktori di antara buffer yang dired

10

Apakah ada M-w C-ypendekatan sederhana untuk menyalin file dan direktori tempel antara dua buffer dired?

Maksud saya menandai beberapa item (file dan buffer) dengan mkemudian menyalinnya dengan M-w(atau cara pintas lain), kemudian pergi ke buffer dired lain (yang tidak harus dalam jendela berdampingan dengan jendela buffer dired sebelumnya (s) ) lalu yankingsemua file yang disalin oleh C-y(atau pintasan lain) di sana? Ini adalah tugas sederhana yang dapat dilakukan oleh banyak penjelajah file di OS yang berbeda.

Masalah dengan opsi Salin klasik C dalam dired adalah bahwa segera setelah ditekan, ia meminta tujuan. Jika jalur buffer tujuan sangat panjang atau ada terlalu banyak buffer terbuka, pendekatan ini rumit.

Saya mencari solusi untuk pertama-tama menyalin item kemudian menempelkannya di buffer dired yang sesuai.

Ada pertanyaan terkait Bagaimana cara menyalin / memindahkan file dengan cepat di Emacs Dired? yang menggunakan pendekatan klasik menekan C ketika dua jendela dired dipisahkan secara vertikal menggunakan opsi (setq dired-dwim-target t).

Apa cara untuk mencapai ini?

Nama
sumber

Jawaban:

5

Saya telah menambahkan fitur ini sekarang ke Dired + .

Anda dapat menggunakan C-y(perintah diredp-yank-files) untuk menempelkan file, yang nama absolutnya Anda salin ke kill ring, ke direktori saat ini. "Direktori saat ini" di sini adalah apa yang dired-current-directorydikembalikan: subdirektori yang dimasukkan tempat kursor berada, atau direktori utama Dired jika kursor tidak ada dalam daftar subdir.

Dengan arg awalan, C-yalih-alih meminta Anda untuk direktori target untuk menempel. Jadi Anda tidak perlu berada dalam buffer Dired untuk menempelkan file ke direktori.

Anda harus menyalin nama file ke ring bunuh menggunakan M-0 watau M-x diredp-copy-abs-filenames-as-kill.

Di Dired + perintah-perintah itu juga mengatur variabel diredp-last-copied-filenameske string nama file yang sama. C-ymenggunakan nilai variabel itu, bukan apa pun yang saat ini ada di kepala cincin bunuh. Ini berarti bahwa Anda tidak perlu menempel segera setelah Anda menyalin nama file. Dan itu berarti bahwa Anda dapat, alih-alih menyalin nama file ke ring bunuh, cukup masukkan nama-nama itu dalam variabel tersebut (mis. Secara terprogram).

Ketika Anda menggunakan C-y, Anda akan diminta untuk konfirmasi ( yatau n). Anda juga dapat menekan l(untuk "daftar") ketika diminta, untuk menampilkan daftar file yang akan ditempelkan.


Anda juga dapat menyalin file yang ditandai dari buffer Dired saat ini dan semua file yang ditandai dalam subdirektori yang ditandai, ditentukan secara rekursif . Untuk itu Anda gunakan M-0 M-+ M-w(nol awalan arg dengan perintah diredp-copy-filename-as-kill-recursive) atau gunakan M-x diredp-copy-abs-filenames-as-kill-recursive.


Perhatikan bahwa dengan Dired + Anda juga dapat dengan mudah memiliki buffer Dired yang mencantumkan sejumlah file dan direktori, dari mana saja. Artinya, entri yang terdaftar tidak perlu berada di direktori yang sama atau bahkan di direktori terkait. Lihat C-x D F(perintah diredp-dired-for-files), yang ada di menu menu-bar Dir sebagai item Dired Files Located Anywhere . Anda dapat menandai dan kemudian menempel (menyalin) file sewenang-wenang tersebut dari buffer Dired ke direktori mana pun.


Pembaruan 2019-04-22:

Saya juga menambahkan kemampuan untuk memindahkan (bukan hanya menempel) file yang (absolut) namanya Anda salin ke ring bunuh ke direktori saat ini (atau yang lain). Ini terikat C-wdalam Dired.

diredp-move-files-named-in-kill-ringadalah fungsi Lisp interaktif di dired+.el.

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

Pindahkan file, yang nama absolutnya Anda salin, ke direktori saat ini.

Dengan arg awalan non-negatif Anda malah diminta untuk direktori target.

Dengan arg awalan non-positif Anda dapat melihat detail tentang file jika Anda menekan lketika diminta untuk mengkonfirmasi menempel. Kalau tidak, Anda hanya melihat nama file. Rincian yang Anda lihat ditentukan oleh opsi diredp-list-file-attributes.

Anda harus menyalin daftar nama file sebagai string ke ring bunuh menggunakan M-0 watau M-x diredp-copy-abs-filenames-as-kill. Perintah-perintah itu juga mengatur variabel diredp-last-copied-filenameske string yang sama. diredp-move-files-named-in-kill-ringmenggunakan nilai variabel itu, bukan apa pun yang saat ini ada di kepala cincin bunuh.

Saat dipanggil dari Lisp:

  • Arg opsional NO-CONFIRM-Pberarti jangan meminta konfirmasi untuk pindah.
  • Arg opsional DETAILSdilewatkan ke diredp-y-or-n-files-p.
Drew
sumber
Bekerja dengan baik. Apakah diredp harus C-wmemindahkan / mengganti nama file alih-alih menyalin? Terima kasih
azzamsa
@azzamsa: Tidak, kurasa tidak. (Saya kira maksud Anda menggunakan nama file yang ada di kill-ringuntuk memberi tahu Dired untuk memindahkan file-file itu ke suatu tempat, misalnya, mendorong ke mana harus memindahkannya.)
Drew
Tentu. Maksud saya mengapa Anda tidak menambahkan fungsi ini? itu akan luar biasa :). Karena saat ini, hanya mendukung Cy. Salin saja, Tidak pindah / ganti nama.
azzamsa
Sekarang. Saya menggunakan hack dired-ranger untuk ini Terima kasih.
azzamsa
FYI - Sekarang Anda dapat menggunakan C-wuntuk memindahkan file yang namanya Anda salin.
Drew
4

Anda dapat melakukan hal berikut dalam vanilla Dired (tidak perlu perpustakaan pihak ketiga):

  1. Pergi dulu ke buffer Dired yang mencantumkan direktori target .

  2. Dengan kursor pada baris header direktori untuk daftar direktori target, gunakan w(perintah dired-copy-filename-as-kill). Ini menyalin nama absolut dari direktori target itu. (Anda dapat menyalin nama dir dari setiap baris tajuk subdirektori daftar iklan dengan cara yang sama.)

  3. Buka buffer Dired yang berisi daftar file yang ingin Anda salin . Tandai file-file itu.

  4. Gunakan C(perintah dired-do-copy) untuk menyalin file yang ditandai . Saat diminta, gunakan C-yuntuk menempelkan (mutlak) nama direktori target . Anda cukup menempelkannya, tanpa repot-repot menghapus direktori default yang dimasukkan dalam minibuffer. (Menempelnya setelah nama dir default itu meredupkan nama standar itu - itu diabaikan.)

Ini, saya pikir, sesederhana apa yang Anda gambarkan ( C-wuntuk menyalin nama file yang ditandai diikuti oleh C-ydalam daftar Dired target), tetapi urutannya berlawanan : Anda salin nama direktori target terlebih dahulu, dan kemudian tempel ke perintah C( dired-do-copy) .

( dired-do-copymemeriksa file yang ada dengan nama yang sama di direktori target, dll.)


Kiat: (Ini tidak diperlukan jika Anda menggunakan Dired + - lihat jawaban saya yang lain di sini.) Jika Anda bermaksud menyalin (atau memindahkan) file dari banyak direktori ke direktori target yang sama, dan Anda mungkin melakukan hal-hal lain dengan cincin bunuh di antara, sehingga nama target yang disalin mungkin tidak lagi menjadi yang pertama di kill-ring, kemudian gunakan pilihan sekunder untuk memilih nama target target. Pilihan sekunder tidak tergantung pada wilayah atau posisi kursor - Anda dapat menempelkannya sebanyak yang Anda inginkan, terlepas dari perubahan pada cincin bunuh. Anda dapat menempelkannya menggunakan mouse, tetapi lebih mudah untuk digunakan C-M-ydari perpustakaan second-sel.el.

Drew
sumber
2

Gagasan Anda terdengar langsung, mungkin Anda dapat mencoba menerapkannya sendiri, Anda juga dapat menggunakan yang berikut untuk memulai jika Anda mau.

(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
sumber
Terima kasih banyak. Saya punya saran: setelah menempel, perbarui (segarkan) buffer dired untuk melihat item yang baru disalin.
Nama
Saran lain: untuk menghapus tanda item yang ditandai setelah menempel.
Nama
@Nama Saran yang bagus. Saya sarankan Anda menerapkannya sendiri karena Anda adalah orang yang akan menggunakannya. Semoga berhasil.
xuchunyang
2

Manajer file Ranger berfungsi seperti yang Anda gambarkan, tetapi ia terinspirasi oleh vim (dengan demikian vim keybindings yy untuk mencabut / menyalin puntuk menempelkan dll). Emacs juga memiliki implementasi ranger. Cobalah, mungkin itu akan sesuai dengan kebutuhan Anda.

Saya sendiri menggunakan emacs sunrise-commander yang mirip dengan Midnight Commander (mc), setiap kali saya merasa saya perlu mengelola file-panel ganda.

Upd: dired-ranger memiliki copy / paste yang telah Anda jelaskan. Setidaknya dalam dokumen.

;; 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
sumber
Ada dired-rangerdan rangertersedia di MELPA. Maksudmu yang mana?
Nama
baik, saya tidak tahu tentang dired-ranger tetapi dari uraian sepertinya sesuatu yang Anda inginkan.
Maxim Kim
1

Saya juga menyarankan untuk menggunakan dired-ranger. Inilah yang saya miliki di 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
sumber
0

Dired ranger adalah solusi sejati bagi saya:

Anda dapat mencapai perilaku penjelajah file yang sama seperti yang Anda gambarkan, hanya dengan konfigurasi sederhana ini (dengan asumsi Anda menggunakan use-package):

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