有没有办法修改/告诉dired异步复制文件?如果您在dired中标记了多个文件,然后使用'C'将其复制,emacs将锁定,直到每个文件都被复制。我反而希望这个副本能够开始,并且让我在后台继续编辑。有没有办法获得这种行为?Dired复制异步
编辑:其实,C调用dired-aux中的'dired-do-copy',而不是在dired本身。对不起,有任何困惑。
有没有办法修改/告诉dired异步复制文件?如果您在dired中标记了多个文件,然后使用'C'将其复制,emacs将锁定,直到每个文件都被复制。我反而希望这个副本能够开始,并且让我在后台继续编辑。有没有办法获得这种行为?Dired复制异步
编辑:其实,C调用dired-aux中的'dired-do-copy',而不是在dired本身。对不起,有任何困惑。
我认为emacs大多局限于单个线程 - 所以这可能不能直接通过标准dired命令(如'C')复制。
但是,有一个直接命令“dired-do-shell-command”,它调出一个shell在后台执行工作。如果您选择要复制的文件,然后使用键“!” (这运行dired-do-shell-command)然后键入'cp? [目标]'(如果你在窗口中可能可以使用“复制”)。我没有测试过这个 - 所以请参阅“dired-do-shell-command”的帮助以获得完整的详细信息。
另请参阅Emacs功能dired-do-async-shell-command
。
对于更通用的解决方案,请参阅https://github.com/jwiegley/emacs-async,您还可以通过调用单独的Emacs进程来评估任意Emacs Lisp代码(这当然会带来一点额外延迟)。更具体地说,关于文件操作,请参阅本回购中的文件dired-async.el。
另请注意,在Emacs的工作名称Concurrent Emacs中有工作线程,但它尚未完成。详情请参阅http://www.emacswiki.org/emacs/ConcurrentEmacs。
我觉得这个回答挺有帮助的:https://emacs.stackexchange.com/a/13802/10761。读取该答案表明,您可以使dired
将使用scp
方法而不是ssh
方法(后者最初使用gzip
对文件进行编码,而且可能非常慢)复制。当文件大于tramp-copy-size-limit
(默认为10240
)时,scp
方法将仅与scp
程序一起复制。使用这种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)