在Emacs Lisp中使用哪个shell命令?

11
如果我尝试在Emacs Lisp函数中调用rsync(或scp)多次运行shell命令,应该使用哪种shell命令变体?我目前正在使用shell-command,它会在进程完成之前锁定Emacs,并且使用--verbose参数的rsync输出不会被打印出来。我可以在命令字符串的末尾使用&使其异步执行,这会打印进度,但是虽然它没有完全"锁定" Emacs,但是minibuffer会反复询问是否要终止进程,这在此期间非常影响使用。另外一种方法是使用start-process-shell-command,它似乎只有在传输第一个文件/目录后才会暂停函数;当通过我的函数进行多个rsync调用时,将忽略其余的传输。这些都不是理想的方法,有什么提示吗?

1
你读过 http://www.gnu.org/software/emacs/manual/html_node/elisp/Asynchronous-Processes.html 吗? - Anders Lindahl
2个回答

13

我自己使用 start-process 取得了最大的成功。

(start-process "process-name" 
               (get-buffer-create "*rsync-buffer*") 
               "/path/to/rsync"
               arg1
               ...
               argn)
这将把所有的输出发送到一个单独的缓冲区。

5

一个解决方案可能是在实际的shell buffer中运行该命令。然后你可以选择要运行哪个命令:

M-x shell
M-x eshell
M-x term

如果您喜欢这个想法,您可以像这样编写代码:
(defun my-rsync-routine ()
  "run some rsync processes"
  (with-temp-buffer
    (shell (current-buffer))
    (process-send-string nil "rsync ...")
    (process-send-string nil "rsync ...")
    (process-send-string nil "rsync ...")))

阅读更多关于'process-send-string的用法。您可能还需要对来自进程的输出进行一些错误检查。


你好 Trey,一直感谢你。这次我不得不选择 Jonathan 的解决方案,因为它直接并且非常适合这个目的(而 process-send-string 似乎只能在创建并显式引用的缓冲区中工作(使用 get-buffer-create)而不是在临时缓冲区中...),但我正在阅读过滤函数...有很多需要理解的地方,我相信最终会找到用处。再次感谢。 - hatmatrix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接