在干燥缓冲区之间复制/粘贴文件和目录的简单方法


10

有没有一种简单的M-w C-y方法可以在两个干缓冲区之间复制粘贴文件和目录?

我的意思是标记一些项目(文件和缓冲区),m然后通过M-w(或其他快捷方式)将它们复制,然后转到另一个Dired缓冲区(不一定与先前Dired缓冲区的窗口并排在一个窗口中) ),然后yanking通过C-y(或另一个快捷方式)复制所有文件?这是一个简单的任务,不同操作系统中的许多文件浏览器都可以完成。

经典复制选项C的问题是,一旦按下该按钮,就会要求目的地。如果目标缓冲区的路径很长或打开的Dired缓冲区太多,则此方法很复杂。

我正在寻找一种解决方案,首先复制项目,然后将其粘贴到适当的干燥缓冲区中。

有一个相关的问题,如何在Emacs Dired中快速复制/移动文件?当使用选项将两个垂直窗口垂直分开时 ,使用经典的按下C的方法(setq dired-dwim-target t)

有什么方法可以做到这一点?

Answers:


5

我现在已将此功能添加到Dired +

您可以使用C-y(命令diredp-yank-files)将已复制其绝对名称的文件粘贴到当前目录中。返回的“当前目录”是dired-current-directory:光标所在的插入子目录,如果光标不在子目录中,则为Dired主目录。

使用前缀arg C-y代替,提示您输入粘贴的目标目录。因此,您无需在Dired缓冲区中将文件粘贴到目录中。

您应该使用M-0 w或将文件名复制到kill ring M-x diredp-copy-abs-filenames-as-kill

在Dired +中,这些命令还将变量设置diredp-last-copied-filenames为相同的文件名字符串。 C-y使用该变量的值,而不使用当前处于kill ring开头的任何值。这意味着您无需在复制文件名后立即粘贴。这意味着您可以将文件名放在该变量中(例如,以编程方式),而不是将文件名复制到kill ring中。

使用时C-y,系统会提示您确认(yn)。您也可以l在出现提示时打(对于“列表”),以显示将要粘贴的文件的列表。


您还可以从当前Dired缓冲区复制标记的文件,并从其递归定义的标记子目录中复制任何标记的文件。为此,您可以使用M-0 M-+ M-w(带command的零前缀arg diredp-copy-filename-as-kill-recursive)或使用M-x diredp-copy-abs-filenames-as-kill-recursive


请注意,使用Dired +,您还可以轻松地拥有Dired缓冲区,该缓冲区可从任何地方列出任意数量的文件和目录。即,列出的条目不必在同一目录中,甚至不必在相关目录中。请参阅Dir菜单栏菜单上的C-x D F(命令diredp-dired-for-files),将Dired Files位于任何地方。您可以标记这些任意文件并将其从Dired缓冲区粘贴(复制)到任何目录。


更新2019-04-22:

我还添加了复制到kill ring的(绝对)名称的文件移动(而不是粘贴)到当前(或另一个)目录的功能。这必然与C-wDired有关。

diredp-move-files-named-in-kill-ring是的交互式Lisp函数dired+.el

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

将您复制了绝对名称的文件移动到当前目录。

使用非负前缀arg时,会提示您输入目标目录。

如果输入非肯定前缀arg,则l在提示您确认粘贴时单击,则可以查看有关文件的详细信息。否则,您只会看到文件名。您看到的详细信息由option定义 diredp-list-file-attributes

您应该使用M-0 w或将文件名列表作为字符串复制到kill ring M-x diredp-copy-abs-filenames-as-kill。这些命令还将变量设置diredp-last-copied-filenames为相同的字符串。 diredp-move-files-named-in-kill-ring使用该变量的值,而不使用当前处于kill ring开头的任何值。

从Lisp调用时:

  • 可选的arg NO-CONFIRM-P表示不要求确认才能移动。
  • 可选arg DETAILS传递给diredp-y-or-n-files-p

表现不错。diredp是否C-w必须移动/重命名文件而不是copy?。谢谢
azzamsa

@azzamsa:不,我不这么认为。(我猜你的意思是使用上的文件名kill-ring告诉Dired将这些文件移动到某处,例如,提示将文件移动到何处。)
Drew

当然。我的意思是为什么不添加此功能?这一定非常棒 :)。因为当前,仅支持Cy。仅复制,不移动/重命名。
阿扎姆萨

现在。我使用dired-游侠破解这个感谢。
azzamsa

仅供参考-您现在可以C-w用来移动复制了名称的文件。
画了

4

您可以在Vanilla Dired(无需第三方库)中执行以下操作:

  1. 首先转到Dired缓冲区,该缓冲区列出了目标目录

  2. 将光标放在目标表列表的目录标题行上,使用w(命令dired-copy-filename-as-kill)。这将复制该目标目录的绝对名称。(您可以以相同方式从任何Dired-listing子目录标题行复制目录名称。)

  3. 转到Dired缓冲区,该缓冲区列出了要复制文件。标记这些文件。

  4. 使用C(命令dired-do-copy复制标记的文件。在提示符下,使用C-y粘贴目标目录的(绝对)的名字。您可以粘贴它,而不必费心删除插入在迷你缓冲区中的默认目录。(在该默认目录名称后粘贴该名称会使该默认名称变暗-它将被忽略。)

我认为这很简单,就像您描述的那样(C-w复制标记的文件名,然后C-y在目标Dired列表中复制),但顺序相反:首先复制目标目录名,然后将其粘贴到Cdired-do-copy)命令中。

dired-do-copy检查目标目录中是否存在相同名称的现有文件,等等。)


提示:(如果使用Dired +,则不需要此操作-请在此处查看我的其他答案。)如果打算将文件从多个目录复制(或移动)到同一目标目录,并且您可能正在使用kill-ring做其他事情在这两者之间,因此复制的目标目录名称可能不再位于终止环中,然后使用辅助选择来选择目标目录名称。次要选择项不取决于光标的区域或位置-您可以将其粘贴多次,而无需考虑终止环的更改。您可以使用鼠标粘贴它,但是C-M-y从library中使用它比较方便second-sel.el


2

您的想法听起来很简单,也许您可​​以尝试自己实现,也可以根据需要使用以下内容入门。

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

非常感谢你。我有一个建议:粘贴后,更新(刷新)干燥的缓冲区以查看新复制的项目。
命名

另一个建议:粘贴后取消标记已标记的项目。
命名

@Name好建议。我建议您自己实现它们,因为您将要使用它。祝好运。
xuchunyang '18

2

Ranger文件管理器按照您描述的方式工作,但是它受到了vim的启发(因此,vim的键绑定yy可以拉动/复制p以粘贴等)。Emacs还具有Ranger的实现。尝试一下,也许它会满足您的需求。

每当我感觉需要双窗格文件管理时,我自己就使用emacs日出指挥官,其类似于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-rangerranger可在MELPA。你是说哪一个?
命名

好吧,我对Dired-Ranger不了解,但是从描述中看,它似乎很想要。
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)))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.