Если я пытаюсь запустить команду оболочки в Emacs Lisp, в которой я вызываю rsync
(или scp
) несколько раз, какой вариант командной оболочки использовать? В настоящее время я использую shell-command
, который блокирует Emacs до тех пор, пока процесс не будет выполнен, и вывод, который должен быть видимым с --verbose
до rsync
, не печатается; Я могу использовать shell-command
с &
в конце командной строки, чтобы сделать его асинхронным, что печатает прогресс, но, хотя он не полностью блокирует Emacs, минибуфер повторно спрашивает, хочу ли я убить процесс, который вредит тем временем; и start-process-shell-command
, который, как представляется, останавливает функцию только после переноса первого файла/каталога; игнорируя остальные, когда есть несколько вызовов rsync
, выполненных через мою функцию. Ни один из них не кажется идеальным, любые подсказки?
Какая командная оболочка в emacs lisp?
Ответ 1
У меня был наибольший успех, используя сам процесс запуска.
(start-process "process-name"
(get-buffer-create "*rsync-buffer*")
"/path/to/rsync"
arg1
...
argn)
Это отправит весь вывод в один буфер.
Ответ 2
Одним из решений может быть запуск команды в фактическом shell-буфере. Затем вы можете выбрать, какой из них запустить:
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
для его использования. Возможно, вы также захотите провести проверку ошибок на output из процессов.