异步复制的副本

时间:2008-12-19 02:15:33

标签: emacs dired

有没有办法修改/告诉dired异步复制文件?如果您在dired中标记多个文件然后使用“C”进行复制,则emacs将锁定,直到复制每个文件。我想要启动这个副本,并让我继续编辑,因为它在后台继续。有没有办法解决这个问题?

编辑:实际上,C在dired-aux中调用'dired-do-copy',而不是在dired本身。抱歉有任何困惑。

3 个答案:

答案 0 :(得分:5)

我认为emacs主要限于一个线程 - 所以这可能不是通过标准的dired命令直接实现的,例如'C'copy。

但是,有一个dired命令“dired-do-shell-command”,它调用shell来在后台完成工作。如果您选择要复制的文件,然后使用键'!' (这运行dired-do-shell-command)然后输入'cp? [目的地]'(如果您在Windows上,可能可以使用'复制')。我没有对此进行过测试 - 请参阅“dired-do-shell-command”获取有关详细信息的帮助。

答案 1 :(得分:2)

另请参阅Emacs函数dired-do-async-shell-command

对于更通用的解决方案,请参阅https://github.com/jwiegley/emacs-async,您还可以通过调用单独的Emacs进程来评估任意Emacs Lisp代码(这当然会产生一些额外的延迟)。更具体地说,文件操作请参见此repo中的文件dired-async.el。

另请注意,Emacs中的线程工作名称为Concurrent Emacs,但它还没有。有关详细信息,请参阅http://www.emacswiki.org/emacs/ConcurrentEmacs

答案 2 :(得分:0)

我发现这个答案非常有用:https://emacs.stackexchange.com/a/13802/10761。阅读该答案表明您可以使dired使用scp方法而不是ssh方法进行复制(后者最初使用gzip对文件进行编码,可能很慢)。当文件大于scp(默认为scp时),tramp-copy-size-limit方法仅会使用10240程序进行复制。将此scp方法与dired-async-mode结合使用是非常好的,因为它不仅可以使用scp快速复制,而且还可以异步并且不受影响地进行复制。

另外,我认为这很有用:https://oremacs.com/2016/02/24/dired-rsync/。它提供了这段代码,可以使用rsync复制dired中的文件:

;;;###autoload
(defun ora-dired-rsync (dest)
  (interactive
   (list
    (expand-file-name
     (read-file-name
      "Rsync to:"
      (dired-dwim-target-directory)))))
  ;; store all selected files into "files" list
  (let ((files (dired-get-marked-files
                nil current-prefix-arg))
        ;; the rsync command
        (tmtxt/rsync-command
         "rsync -arvz --progress "))
    ;; add all selected file names as arguments
    ;; to the rsync command
    (dolist (file files)
      (setq tmtxt/rsync-command
            (concat tmtxt/rsync-command
                    (shell-quote-argument file)
                    " ")))
    ;; append the destination
    (setq tmtxt/rsync-command
          (concat tmtxt/rsync-command
                  (shell-quote-argument dest)))
    ;; run the async shell command
    (async-shell-command tmtxt/rsync-command "*rsync*")
    ;; finally, switch to that window
    (other-window 1)))

(define-key dired-mode-map "Y" 'ora-dired-rsync)