วิธีง่าย ๆ ในการคัดลอก / วางไฟล์และไดเรกทอรีระหว่างบัฟเฟอร์ที่ dired


10

มีM-w C-yวิธีง่าย ๆ ในการคัดลอกวางไฟล์และไดเรกทอรีระหว่างสอง dired บัฟเฟอร์หรือไม่

ฉันหมายถึงการทำเครื่องหมายบางรายการ (ไฟล์และบัฟเฟอร์) โดยmการคัดลอกแล้วโดยM-w(หรือทางลัดอื่น) จากนั้นไปที่บัฟเฟอร์ dired อื่น (ซึ่งไม่จำเป็นต้องอยู่ในหน้าต่างแบบเคียงข้างกันโดยหน้าต่างของบัฟเฟอร์ dired ก่อนหน้านี้) ) แล้วyankingไฟล์ทั้งหมดที่คัดลอกโดยC-y(หรือทางลัดอื่น) ที่นั่น? นี่เป็นงานง่ายที่นักสำรวจไฟล์หลายคนในระบบปฏิบัติการต่าง ๆ สามารถทำได้

ปัญหาเกี่ยวกับตัวเลือกการคัดลอกแบบคลาสสิกCใน direy คือเมื่อมันถูกกดมันจะถามถึงปลายทาง หากเส้นทางของบัฟเฟอร์ปลายทางยาวมากหรือมีบัฟเฟอร์ที่เปิดมากเกินไปวิธีนี้ซับซ้อน

ฉันกำลังมองหาวิธีที่จะคัดลอกรายการก่อนแล้วจึงวางลงในบัฟเฟอร์ที่เหมาะสม

มีคำถามที่เกี่ยวข้องวิธีคัดลอก / ย้ายไฟล์อย่างรวดเร็วใน Emacs Dired? ซึ่งใช้วิธีการคลาสสิกของการกดCเมื่อสองหน้าต่าง dired (setq dired-dwim-target t)แยกออกจากกันในแนวตั้งโดยใช้ตัวเลือก

อะไรคือวิธีที่จะบรรลุเป้าหมายนี้?

คำตอบ:


5

ฉันได้เพิ่มคุณสมบัตินี้ไปยังDired +แล้ว

คุณสามารถใช้C-y(คำสั่งdiredp-yank-files) เพื่อวางไฟล์ซึ่งมีชื่อแบบสัมบูรณ์ที่คุณคัดลอกไปยัง kill ring ไปยังไดเร็กทอรีปัจจุบัน "ไดเรกทอรีปัจจุบัน" นี่คือสิ่งที่dired-current-directoryส่งกลับ: ไดเรกทอรีย่อยที่แทรกที่เคอร์เซอร์ตั้งอยู่หรือไดเรกทอรีหลัก Dired หากเคอร์เซอร์ไม่ได้อยู่ในรายชื่อย่อย

ด้วยคำนำหน้าอาร์กิวเมนต์C-yแทนที่จะแจ้งให้คุณสำหรับไดเรกทอรีเป้าหมายสำหรับการวาง ดังนั้นคุณไม่จำเป็นต้องอยู่ในบัฟเฟอร์ Dired เพื่อวางไฟล์ลงในไดเรกทอรี

คุณควรจะได้คัดลอกชื่อไฟล์ไปที่แหวนฆ่าโดยใช้หรือM-0 wM-x diredp-copy-abs-filenames-as-kill

ใน Dired + คำสั่งเหล่านั้นยังตั้งค่าตัวแปรdiredp-last-copied-filenamesเป็นชื่อไฟล์เดียวกัน C-yใช้ค่าของตัวแปรนั้นไม่ใช่สิ่งที่อยู่ในหัวของวงแหวนฆ่าในปัจจุบัน ซึ่งหมายความว่าคุณไม่จำเป็นต้องวางทันทีหลังจากคัดลอกชื่อไฟล์ และหมายความว่าคุณสามารถทำได้แทนที่จะคัดลอกชื่อไฟล์ไปยัง kill ring เพียงแค่ใส่ชื่อในตัวแปรนั้น (เช่นโปรแกรม)

เมื่อคุณใช้C-yคุณจะได้รับแจ้งให้ยืนยัน ( yหรือn) นอกจากนี้คุณยังสามารถกดl(สำหรับ "รายชื่อ") เมื่อได้รับแจ้งเพื่อแสดงรายการไฟล์ที่จะถูกวาง


นอกจากนี้คุณยังสามารถคัดลอกไฟล์จากการทำเครื่องหมายบัฟเฟอร์ Dired ปัจจุบันและไฟล์การทำเครื่องหมายใด ๆ ในการทำเครื่องหมายไดเรกทอรีย่อยของตนที่กำหนดไว้ซ้ำ สำหรับสิ่งที่คุณใช้M-0 M-+ M-w(ศูนย์คำนำหน้าหาเรื่องที่มีคำสั่งdiredp-copy-filename-as-kill-recursive) M-x diredp-copy-abs-filenames-as-kill-recursiveหรือการใช้งาน


โปรดทราบว่าด้วย Dired + คุณสามารถมีบัฟเฟอร์ Dired ที่แสดงรายการไฟล์และไดเรกทอรีจำนวนเท่าใดก็ได้จากทุกที่ นั่นคือรายการที่ระบุไม่จำเป็นต้องอยู่ในไดเรกทอรีเดียวกันหรือแม้แต่ในไดเรกทอรีที่เกี่ยวข้อง ดูC-x D F(คำสั่งdiredp-dired-for-files) ซึ่งอยู่บนDirเมนูบาร์เป็นรายการทุก Dired ไฟล์ตั้งอยู่ คุณสามารถทำเครื่องหมายและวาง (คัดลอก) ไฟล์ที่กำหนดเองจากบัฟเฟอร์ Dired ไปยังไดเรกทอรีใด ๆ


อัปเดต 2019-04-22:

ฉันยังเพิ่มความสามารถในการย้าย (ไม่ใช่แค่วาง) ไฟล์ที่มีชื่อ (แน่นอน) ที่คุณคัดลอกไปยัง kill ring ไปยังไดเรกทอรีปัจจุบัน (หรืออื่น ๆ ) สิ่งนี้ผูกพันกับC-wใน Dired

diredp-move-files-named-in-kill-ringdired+.elเป็นแบบโต้ตอบฟังก์ชั่นเสียงกระเพื่อมใน

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

ย้ายไฟล์ซึ่งคุณคัดลอกชื่อแน่นอนไปยังไดเรกทอรีปัจจุบัน

ด้วยคำนำหน้าไม่ใช่เชิงลบคุณจะได้รับพร้อมท์สำหรับไดเรกทอรีเป้าหมายแทน

ด้วยคำนำหน้าที่ไม่เป็นบวกคุณสามารถดูรายละเอียดเกี่ยวกับไฟล์ได้หากคุณกดปุ่มlเพื่อยืนยันการวาง มิฉะนั้นคุณจะเห็นเฉพาะชื่อไฟล์ diredp-list-file-attributesรายละเอียดที่คุณเห็นจะถูกกำหนดโดยตัวเลือก

คุณควรจะได้รับการคัดลอกรายชื่อไฟล์เป็นสตริงแหวนฆ่าโดยใช้หรือM-0 w M-x diredp-copy-abs-filenames-as-killคำสั่งเหล่านั้นยังตั้งค่าตัวแปรdiredp-last-copied-filenamesเป็นสตริงเดียวกัน diredp-move-files-named-in-kill-ringใช้ค่าของตัวแปรนั้นไม่ใช่สิ่งที่อยู่ในหัวของวงแหวนฆ่าในปัจจุบัน

เมื่อเรียกจาก Lisp:

  • ARG ที่เป็นตัวเลือกNO-CONFIRM-Pหมายถึงไม่ต้องขอการยืนยันการย้าย
  • หาเรื่องตัวเลือกจะถูกส่งผ่านไปยังDETAILSdiredp-y-or-n-files-p

ทำงานได้ดี diredp จำเป็นC-wต้องย้าย / เปลี่ยนชื่อไฟล์แทนที่จะเป็นสำเนาหรือไม่? ขอบคุณ
azzamsa

@azzamsa: ไม่ฉันไม่คิดอย่างนั้น (ฉันเดาว่าคุณหมายถึงใช้ชื่อไฟล์ที่อยู่บนkill-ringบอกให้ Dired ย้ายไฟล์เหล่านั้นที่อื่นเช่นแจ้งให้ที่จะย้ายไฟล์เหล่านั้น)
Drew

แน่ใจ ฉันหมายความว่าทำไมคุณไม่เพิ่มฟังก์ชันนี้ มันจะยอดเยี่ยม :) เนื่องจากปัจจุบันรองรับ Cy เท่านั้น คัดลอกเท่านั้นไม่ย้าย / เปลี่ยนชื่อ
azzamsa

ตอนนี้ ผมใช้dired-เรนเจอร์สับสำหรับนี้ขอบคุณ
azzamsa

FYI - ตอนนี้คุณสามารถใช้C-wเพื่อย้ายไฟล์ที่คุณคัดลอกชื่อ
ดึง

4

คุณสามารถทำสิ่งต่อไปนี้ใน vanilla Dired (ไม่ต้องใช้ห้องสมุดของบุคคลที่สาม):

  1. ไปครั้งแรกไป Dired buffer รายการว่าไดเรกทอรีเป้าหมาย

  2. ด้วยเคอร์เซอร์บนบรรทัดส่วนหัวของไดเรกทอรีสำหรับรายชื่อของไดเรกทอรีเป้าหมายให้ใช้w(คำสั่งdired-copy-filename-as-kill) สิ่งนี้คัดลอกชื่อแบบสัมบูรณ์ของไดเรกทอรีเป้าหมายนั้น (คุณสามารถคัดลอกชื่อ dir จากบรรทัดส่วนหัวย่อยของรายชื่อ Dired ใด ๆ ในลักษณะเดียวกัน)

  3. ไปที่ Dired buffer รายการว่าไฟล์ที่คุณต้องการคัดลอก ทำเครื่องหมายไฟล์เหล่านั้น

  4. การใช้งานC(คำสั่งdired-do-copy) เพื่อคัดลอกไฟล์ที่ทำเครื่องหมายไว้ ที่พรอมต์ใช้C-yเพื่อวาง (แน่นอน) ชื่อของไดเรกทอรีเป้าหมาย คุณสามารถวางได้โดยไม่ต้องกังวลกับการลบไดเรกทอรีเริ่มต้นที่ใส่ใน minibuffer (การวางหลังจากชื่อ dir เริ่มต้นจะหรี่ชื่อที่เป็นค่าเริ่มต้น - และจะถูกละเว้น)

นี่คือฉันคิดว่าง่ายเหมือนที่คุณอธิบาย ( C-wเพื่อคัดลอกชื่อไฟล์ที่ทำเครื่องหมายไว้ในรายชื่อC-yDired เป้าหมาย) แต่คำสั่งนั้นตรงกันข้าม : คุณคัดลอกชื่อไดเรกทอรีเป้าหมายก่อนแล้วจึงวางลงในคำสั่งC( dired-do-copy) .

( dired-do-copyตรวจสอบไฟล์ที่มีอยู่ในชื่อเดียวกันใน dir เป้าหมาย ฯลฯ )


คำแนะนำ: (ไม่จำเป็นถ้าคุณใช้Dired + - ดูคำตอบอื่น ๆ ของฉันที่นี่) หากคุณต้องการคัดลอก (หรือย้าย) ไฟล์จากหลายไดเรกทอรีไปยังไดเรกทอรีเป้าหมายเดียวกันและคุณอาจทำสิ่งอื่น ๆ ด้วย kill-ring ในระหว่างนั้นชื่อ dir เป้าหมายที่คัดลอกอาจไม่เป็นอันดับแรกใน kill-ring อีกต่อไปจากนั้นใช้การเลือกรองเพื่อเลือกชื่อ dir เป้าหมาย การเลือกรองไม่ได้ขึ้นอยู่กับภูมิภาคหรือตำแหน่งของเคอร์เซอร์ - คุณสามารถวางได้หลายครั้งตามที่คุณต้องการโดยไม่คำนึงถึงการเปลี่ยนแปลงของแหวนสังหาร คุณสามารถวางโดยใช้เมาส์ แต่ใช้งานง่ายกว่าC-M-yจากsecond-sel.elไลบรารี่


3

ความคิดของคุณฟังตรงไปตรงมาบางทีคุณอาจลองใช้ด้วยตัวเองคุณสามารถใช้สิ่งต่อไปนี้เพื่อเริ่มต้นได้หากคุณต้องการ

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

ขอบคุณมาก. ฉันมีข้อเสนอแนะ: หลังจากวางอัพเดต (รีเฟรช) บัฟเฟอร์ dired เพื่อดูรายการที่คัดลอกใหม่
ชื่อ

ข้อเสนอแนะอื่น: เพื่อยกเลิกการทำเครื่องหมายรายการที่ทำเครื่องหมายหลังจากวาง
ชื่อ

@Name คำแนะนำที่ดี ฉันแนะนำให้คุณใช้มันด้วยตัวเองเพราะคุณเป็นคนที่จะใช้มัน โชคดี.
xuchunyang

2

เรนเจอร์จัดการไฟล์ที่ทำงานในรูปแบบที่คุณอธิบาย แต่มันก็เป็นแรงบันดาลใจจากเสียงเรียกเข้า (จึงเป็นกลุ่ม keybindings yyจะงัด / คัดลอกpวาง ฯลฯ ) Emacs ยังมีการใช้งานของแรนเจอร์ ลองบางทีมันจะพอดีกับความต้องการของคุณ

สำหรับตัวฉันเองใช้ emacs sunrise-commander ซึ่งคล้ายกับ Midnight Commander (mc) ทุกครั้งที่ฉันรู้สึกว่าฉันต้องการจัดการไฟล์สองบานหน้าต่าง

การอัพเดต: dired-ranger มีการคัดลอก / วางที่คุณอธิบายไว้ อย่างน้อยในเอกสาร

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

มีdired-rangerและrangerมีอยู่ใน MELPA คุณหมายถึงอันไหน
ชื่อ

ฉันไม่รู้เกี่ยวกับแรนเจอร์ แต่จากคำอธิบายดูเหมือนว่าคุณต้องการ
Maxim Kim

1

dired-rangerฉันยังอยากจะแนะนำให้ใช้ นี่คือสิ่งที่ฉันมีใน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

แรนเจอร์ที่ตายตัวเป็นทางออกที่แท้จริงสำหรับฉัน:

คุณสามารถบรรลุพฤติกรรมการสำรวจไฟล์ทั่วไปตามที่คุณอธิบายเพียงแค่กำหนดค่าอย่างง่าย (สมมติว่าคุณใช้use-package):

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.