Dired копия асинхронно - PullRequest
       11

Dired копия асинхронно

11 голосов
/ 19 декабря 2008

Есть ли способ изменить / сообщить dired для асинхронного копирования файлов? Если вы пометите несколько файлов в dired, а затем используете «C» для их копирования, emacs блокируется до тех пор, пока не будет скопирован каждый файл. Вместо этого я хочу, чтобы эта копия была запущена, и чтобы я продолжил редактирование, как это происходит в фоновом режиме. Есть ли способ получить такое поведение?

РЕДАКТИРОВАТЬ: На самом деле, C вызывает «dired-do-copy» в dired-aux, а не в самом dired. Извините за путаницу.

Ответы [ 3 ]

5 голосов
/ 19 декабря 2008

Я думаю, что emacs в основном ограничен одним потоком, так что это может быть невозможно напрямую с помощью стандартных команд с задержкой, таких как C-копия.

Однако есть команда dired " dired-do-shell-command ", которая вызывает оболочку для выполнения работы в фоновом режиме. Если вы выбираете файлы, которые хотите скопировать, а затем используете клавишу '!' (это запускает команду dired-do-shell-command), затем введите 'cp? [пункт назначения] (возможно, вы можете использовать «копировать», если вы находитесь в Windows). Я не проверял это - так что смотрите справку по "dired-do-shell-command" для полной информации.

2 голосов
/ 16 января 2014

См. Также функцию Emacs dired-do-async-shell-command.

Для еще более общего решения см. https://github.com/jwiegley/emacs-async, с помощью которого вы также можете оценивать произвольный код Emacs Lisp посредством вызова отдельного процесса Emacs (что, конечно, требует дополнительной задержки). Более конкретно о файловых операциях см. Файл dired-async.el в этом репозитории.

Также обратите внимание, что в Emacs есть работа с многопоточностью под рабочим именем Concurrent Emacs, но она еще не там. Подробнее см. http://www.emacswiki.org/emacs/ConcurrentEmacs.

0 голосов
/ 26 апреля 2017

Я нашел этот ответ весьма полезным: 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)
...