Các cách đơn giản để sao chép / dán tệp và thư mục giữa các bộ đệm được chuyển hướng


10

Có một M-w C-ycách tiếp cận đơn giản để sao chép tập tin dán và thư mục giữa hai bộ đệm được chuyển hướng?

Tôi có nghĩa là đánh dấu một số mục (tệp và bộ đệm) bằng cách msao chép chúng bằng M-w(hoặc một phím tắt khác), sau đó chuyển đến một bộ đệm được điều hướng khác (không nhất thiết phải nằm trong cửa sổ cạnh nhau của cửa sổ của bộ đệm được chuyển hướng trước đó ) sau đó yankingtất cả các tập tin sao chép bởi C-y(hoặc một phím tắt khác) ở đó? Đây là một nhiệm vụ đơn giản mà nhiều nhà thám hiểm tệp trong các hệ điều hành khác nhau có thể làm.

Vấn đề với tùy chọn Sao chép cổ điển C trong thư mục là ngay khi được nhấn, nó sẽ yêu cầu đích. Nếu đường dẫn của bộ đệm đích quá dài hoặc có quá nhiều bộ đệm được mở, thì cách tiếp cận này rất phức tạp.

Tôi đang tìm kiếm một giải pháp để đầu tiên sao chép các mục sau đó để dán chúng vào một bộ đệm được điều hướng thích hợp.

Có một câu hỏi liên quan Làm thế nào để nhanh chóng sao chép / di chuyển tệp trong Emacs Dired? trong đó sử dụng cách tiếp cận cổ điển của việc nhấn C khi hai cửa sổ chuyển hướng được phân tách theo chiều dọc bằng cách sử dụng tùy chọn (setq dired-dwim-target t).

Những cách để đạt được điều này là gì?

Câu trả lời:


5

Tôi đã thêm tính năng này ngay bây giờ vào Dired + .

Bạn có thể sử dụng C-y(lệnh diredp-yank-files) để dán các tệp, có tên tuyệt đối mà bạn đã sao chép vào vòng khử, vào thư mục hiện tại. "Thư mục hiện tại" ở đây là những gì dired-current-directorytrả về: thư mục con được chèn trong đó con trỏ được đặt hoặc thư mục chính được điều hướng nếu con trỏ không nằm trong danh sách thư mục con.

Với một tiền tố arg, C-ythay vào đó sẽ nhắc bạn cho thư mục đích để dán. Vì vậy, bạn không cần phải ở trong bộ đệm Dired để dán tệp vào thư mục.

Bạn nên sao chép tên tệp vào vòng kill bằng cách sử dụng M-0 whoặc M-x diredp-copy-abs-filenames-as-kill.

Trong Dired + các lệnh đó cũng đặt biến diredp-last-copied-filenamesthành cùng một chuỗi tên tệp. C-ysử dụng giá trị của biến đó, không phải bất cứ thứ gì hiện đang đứng đầu vòng giết. Điều này có nghĩa là bạn không cần dán ngay sau khi sao chép tên tệp. Và điều đó có nghĩa là bạn có thể, thay vì sao chép tên tệp vào vòng khử, chỉ cần đặt tên trong biến đó (ví dụ như lập trình).

Khi bạn sử dụng C-y, bạn được nhắc xác nhận ( yhoặc n). Bạn cũng có thể nhấn l(cho "danh sách") khi được nhắc, để hiển thị danh sách các tệp sẽ được dán.


Bạn cũng có thể sao chép các tệp được đánh dấu từ bộ đệm Dired hiện tại và bất kỳ tệp được đánh dấu nào trong các thư mục con được đánh dấu của nó, được định nghĩa đệ quy . Cho rằng bạn sử dụng M-0 M-+ M-w(không có tiền tố arg với lệnh diredp-copy-filename-as-kill-recursive) hoặc sử dụng M-x diredp-copy-abs-filenames-as-kill-recursive.


Lưu ý rằng với Dired +, bạn cũng có thể dễ dàng có bộ đệm Dired liệt kê bất kỳ số lượng tệp và thư mục nào, từ bất cứ đâu. Đó là, các mục được liệt kê không cần phải trong cùng một thư mục hoặc thậm chí trong các thư mục liên quan. Xem C-x D F(lệnh diredp-dired-for-files), trên menu thanh menu Dir dưới dạng mục Tệp được định hướng ở mọi nơi . Bạn có thể đánh dấu và sau đó dán (sao chép) các tệp tùy ý như vậy từ bộ đệm Dired vào bất kỳ thư mục nào.


Cập nhật 2019-04-22:

Tôi cũng đã thêm khả năng di chuyển (không chỉ dán) các tệp có tên (tuyệt đối) mà bạn đã sao chép vào vòng khử vào thư mục hiện tại (hoặc khác). Điều này bị ràng buộc C-wtrong Dired.

diredp-move-files-named-in-kill-ringlà một chức năng Lisp tương tác trong dired+.el.

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

Di chuyển các tệp, có tên tuyệt đối bạn đã sao chép, vào thư mục hiện tại.

Với tiền tố không âm, thay vào đó, bạn được nhắc cho thư mục đích.

Với tiền tố không tích cực, bạn có thể xem chi tiết về các tệp nếu bạn nhấn lkhi được nhắc xác nhận dán. Nếu không, bạn chỉ thấy tên tập tin. Các chi tiết bạn thấy được xác định bởi tùy chọn diredp-list-file-attributes.

Bạn nên sao chép danh sách tên tệp dưới dạng chuỗi vào vòng khử bằng cách sử dụng M-0 whoặc M-x diredp-copy-abs-filenames-as-kill. Những lệnh này cũng đặt biến diredp-last-copied-filenamescho cùng một chuỗi. diredp-move-files-named-in-kill-ringsử dụng giá trị của biến đó, không phải bất cứ thứ gì hiện đang đứng đầu vòng giết.

Khi được gọi từ Lisp:

  • Tùy chọn arg NO-CONFIRM-Pcó nghĩa là không yêu cầu xác nhận để di chuyển.
  • Arg tùy chọn DETAILSđược chuyển đến diredp-y-or-n-files-p.

Làm việc tốt Do diredp phải C-wdi chuyển / đổi tên tập tin thay vì sao chép? Cảm ơn
azzamsa

@azzamsa: Không, tôi không nghĩ vậy. (Tôi đoán bạn có nghĩa là sử dụng tên tệp trên kill-ringđể nói với Dired để di chuyển các tệp đó đi đâu đó, ví dụ: nhắc nhở nơi để di chuyển chúng.)
vẽ

Chắc chắn rồi. Ý tôi là tại sao bạn không thêm chức năng này? nó sẽ rất tuyệt :). Bởi vì hiện tại, chỉ hỗ trợ Cy. Chỉ sao chép, Không di chuyển / đổi tên.
azzamsa

Hiện nay. Tôi sử dụng hack dired-ranger cho Cảm ơn này .
azzamsa

FYI - Bây giờ bạn có thể sử dụng C-wđể di chuyển các tệp có tên bạn đã sao chép.
vẽ

4

Bạn có thể thực hiện các thao tác sau trong vanilla Dired (không cần thư viện của bên thứ 3):

  1. Đầu tiên đến bộ đệm Dired liệt kê thư mục đích .

  2. Với con trỏ trên dòng tiêu đề thư mục để liệt kê thư mục đích, hãy sử dụng w(lệnh dired-copy-filename-as-kill). Điều này sao chép tên tuyệt đối của thư mục đích đó. (Bạn có thể sao chép tên thư mục từ bất kỳ dòng tiêu đề phụ liệt kê được liệt kê theo cùng một cách.)

  3. Chuyển đến bộ đệm Dired liệt kê các tệp bạn muốn sao chép . Đánh dấu các tập tin.

  4. Sử dụng C(lệnh dired-do-copy) để sao chép các tập tin được đánh dấu . Tại dấu nhắc, sử dụng C-yđể dán tên (tuyệt đối) của thư mục đích . Bạn chỉ có thể dán nó mà không cần phải xóa thư mục mặc định được chèn trong bộ thu nhỏ. (Dán nó sau tên thư mục mặc định đó làm mờ tên mặc định đó - nó bị bỏ qua.)

Tôi nghĩ, điều này đơn giản như những gì bạn mô tả ( C-wđể sao chép tên tệp được đánh dấu theo sau C-ytrong danh sách được điều hướng đích), nhưng thứ tự ngược lại : bạn sao chép tên thư mục đích trước, sau đó dán nó vào lệnh C( dired-do-copy) .

( dired-do-copykiểm tra các tệp hiện có cùng tên trong thư mục đích, v.v.)


Mẹo: (Điều này không cần thiết nếu bạn sử dụng Dired + - xem câu trả lời khác của tôi ở đây.) Nếu bạn có ý định sao chép (hoặc di chuyển) các tệp từ nhiều thư mục vào cùng một thư mục đích và bạn có thể thực hiện những việc khác với lệnh kill-ring ở giữa, để tên thư mục tiêu được sao chép có thể không còn là đầu tiên trong vòng khử, sau đó sử dụng lựa chọn thứ cấp để chọn tên thư mục tiêu. Lựa chọn thứ cấp không phụ thuộc vào khu vực hoặc vị trí của con trỏ - bạn có thể dán nó bao nhiêu lần tùy ý, bất kể thay đổi đối với vòng khử. Bạn có thể dán nó bằng chuột, nhưng nó dễ sử dụng hơn C-M-ytừ thư viện second-sel.el.


2

Ý tưởng của bạn nghe có vẻ đơn giản, có thể bạn có thể cố gắng tự thực hiện nó, bạn cũng có thể sử dụng những điều sau đây để bắt đầu nếu bạn muốn.

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

Cảm ơn rât nhiều. Tôi có một gợi ý: sau khi dán, hãy cập nhật (làm mới) bộ đệm đã chuyển hướng để xem các mục đã sao chép mới.
Tên

Một đề nghị khác: bỏ đánh dấu các mục được đánh dấu sau khi dán.
Tên

@Tên đề xuất tốt. Tôi khuyên bạn nên tự thực hiện chúng vì bạn là người sẽ sử dụng nó. Chúc may mắn.
xuchunyang

2

Trình quản lý tệp Ranger hoạt động theo cách bạn mô tả, nhưng nó được lấy cảm hứng từ vim (do đó, vim keybindings yyđể yank / copy pđể dán, v.v.). Emacs cũng đã thực hiện kiểm lâm. Hãy thử nó, có thể nó sẽ phù hợp với nhu cầu của bạn.

Bản thân tôi sử dụng chỉ huy mặt trời mọc của emacs tương tự như Midnight Commander (mc), bất cứ khi nào tôi cảm thấy mình cần quản lý tập tin hai mặt.

Trình cập nhật: dired-ranger có bản sao / dán mà bạn đã mô tả. Ít nhất là trong các tài liệu.

;; 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-rangerrangercó sẵn trên MELPA. Ý bạn là cái nào?
Tên

tốt, tôi không biết về dired-ranger nhưng từ mô tả có vẻ như bạn muốn.
Maxim Kim

1

Tôi cũng sẽ đề nghị sử dụng dired-ranger. Đây là những gì tôi có trong 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

Kiểm lâm viên là giải pháp thực sự cho tôi:

Bạn có thể đạt được hành vi trình duyệt tệp phổ biến như bạn mô tả, chỉ với cấu hình đơn giản này (giả sử bạn sử dụng use-package):

(use-package dired-ranger
  :bind (:map dired-mode-map
              ("W" . dired-ranger-copy)
              ("X" . dired-ranger-move)
              ("Y" . dired-ranger-paste)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.