2008-12-19 9 views
9

Existe-t-il un moyen de modifier/dire dired pour copier des fichiers de manière asynchrone? Si vous marquez plusieurs fichiers dans dired, puis utilisez 'C' pour les copier, emacs se verrouille jusqu'à ce que tous les fichiers soient copiés. Je préfère que cette copie soit démarrée et que je continue à la modifier en arrière-plan. Y at-il un moyen d'obtenir ce comportement?Copie dirigée de manière asynchrone

EDIT: En réalité, C appelle 'dired-do-copy' dans dired-aux, pas dans dired lui-même. Désolé pour toute confusion.

Répondre

5

Je pense qu'emacs est principalement limité à un seul thread - donc cela peut ne pas être directement possible via des commandes standard, comme la copie 'C'. Toutefois, il existe une commande dired "dired-do-shell-command" qui appelle un shell pour effectuer le travail en arrière-plan. Si vous sélectionnez les fichiers que vous souhaitez copier, utilisez la touche '!' (ceci exécute dired-do-shell-command) puis tapez 'cp? [destination] '(peut éventuellement utiliser' copier 'si vous êtes sur Windows). Je n'ai pas testé cela - alors consultez l'aide sur "dired-do-shell-command" pour plus de détails.

2

Voir aussi la fonction Emacs dired-do-async-shell-command. Pour une solution encore plus générique, voir https://github.com/jwiegley/emacs-async avec lequel vous pouvez également évaluer le code Emacs Lisp arbitraire par appel à un processus Emacs distinct (ce qui entraîne évidemment un peu de latence supplémentaire). Plus particulièrement les opérations sur les fichiers voient le fichier dired-async.el dans ce repo.

Notez également qu'il y a du travail sur le threading dans Emacs sous le nom de travail Concurrent Emacs mais il n'y est pas encore. Voir http://www.emacswiki.org/emacs/ConcurrentEmacs pour plus de détails.

0

J'ai trouvé cette réponse assez utile: https://emacs.stackexchange.com/a/13802/10761. La lecture de cette réponse montre que vous pouvez faire en sorte que dired copie avec la méthode scp au lieu de la méthode ssh (cette dernière code initialement le fichier avec gzip et cela peut être assez lent). La méthode scp copie uniquement avec le programme scp lorsque le fichier est supérieur à tramp-copy-size-limit (10240 par défaut). L'utilisation de cette méthode scp en conjonction avec dired-async-mode est très agréable, car elle va non seulement copier rapidement avec scp, mais elle le fera aussi de manière asynchrone et hors de votre chemin.

Aussi, je pense que c'est utile: https://oremacs.com/2016/02/24/dired-rsync/. Il fournit cet extrait de code pour utiliser rsync pour copier des fichiers dans 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) 
Questions connexes