2008-12-19 17 views
9

¿Hay alguna manera de modificar/indicar a copiar archivos de forma asíncrona? Si marca múltiples archivos en dired y luego usa 'C' para copiarlos, emacs se bloquea hasta que se copia cada archivo. En su lugar, quiero que se inicie esta copia y que continúe editando a medida que transcurre en segundo plano. ¿Hay alguna manera de obtener este comportamiento?Dired copy asincronically

EDITAR: En realidad, C llama 'dired-do-copy' en dired-aux, no en la misma dirección. Perdón por cualquier confusión.

Respuesta

5

Creo que emacs se limita principalmente a un único hilo, por lo que puede que esto no sea posible directamente a través de comandos estándar como 'C'.

Sin embargo, hay un comando directo "dired-do-shell-command" que llama a un shell para hacer el trabajo en segundo plano. Si selecciona los archivos que desea copiar y luego usa la clave '!' (Esto ejecuta dired-do-shell-command) y luego escribe 'cp? [destino] '(posiblemente puede usar' copiar 'si está en Windows). No he probado esto, así que vea la ayuda en "dired-do-shell-command" para más detalles.

2

Vea también la función Emacs dired-do-async-shell-command.

Para una solución aún más genérica, vea https://github.com/jwiegley/emacs-async con la que también puede evaluar el código arbitrario de Emacs Lisp mediante una llamada a un proceso de Emacs separado (que por supuesto incurre en un poco de latencia adicional). Más específicamente, respecto a las operaciones de archivos, vea el archivo dired-async.el en este repositorio.

También tenga en cuenta que hay trabajo en subprocesos en Emacs bajo el nombre de trabajo Concurrent Emacs pero aún no está allí. Vea http://www.emacswiki.org/emacs/ConcurrentEmacs para más detalles.

0

Encontré esta respuesta bastante útil: https://emacs.stackexchange.com/a/13802/10761. Al leer esa respuesta, se puede hacer que dired copie con el método scp en lugar del método ssh (este último codifica inicialmente el archivo con gzip y puede ser bastante lento). El método scp solo se copiará con el programa scp cuando el archivo sea mayor que tramp-copy-size-limit (que es 10240 de manera predeterminada). Usar este método scp junto con dired-async-mode es muy bueno, ya que no solo se copiará rápidamente con scp, sino que también lo hará de forma asíncrona y fuera de su camino.

Además, creo que esto es útil: https://oremacs.com/2016/02/24/dired-rsync/. Proporciona este fragmento de código para usar rsync para copiar archivos en 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)