какая команда оболочки в emacs lisp? - PullRequest
10 голосов
/ 21 сентября 2009

Если я пытаюсь запустить команду оболочки в функции Emacs Lisp, в которой я вызываю rsync (или scp) несколько раз, какой вариант команды оболочки мне следует использовать? В настоящее время я использую shell-command, который блокирует Emacs до завершения процесса, и вывод, который должен быть виден с --verbose до rsync, не печатается; Я могу использовать shell-command с & в конце командной строки, чтобы сделать ее асинхронной, которая печатает ход выполнения - но, хотя он не «полностью блокирует» Emacs, минибуфер неоднократно спрашивает, хочу ли я убить процесс, который наносит урон тем временем; и start-process-shell-command, который, по-видимому, останавливает функцию только после передачи первого файла / каталога; пренебрегая остальными, когда через мою функцию совершено несколько вызовов rsync. Ничто из этого не кажется идеальным, есть намеки?

Ответы [ 2 ]

13 голосов
/ 21 сентября 2009

Я добился наибольшего успеха, используя сам процесс запуска.

(start-process "process-name" 
               (get-buffer-create "*rsync-buffer*") 
               "/path/to/rsync"
               arg1
               ...
               argn)

Это отправит весь вывод в один буфер.

5 голосов
/ 21 сентября 2009

Одним из решений может быть запуск команды в фактическом буфере оболочки . Затем вы можете выбрать, какой из них запустить:

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. Вы также можете захотеть проверить ошибки на выводе из процессов.

...