2009-09-21 4 views
10

rsync (또는 scp)을 여러 번 호출하는 Emacs Lisp 함수에서 쉘 명령을 실행하려는 경우 어떤 쉘 명령 변형을 사용해야합니까? 나는 현재 shell-command을 사용하고 있는데, 프로세스가 끝날 때까지 Emacs를 잠그고 --verbose에서 rsync으로 볼 수있는 출력이 출력되지 않는다. 명령 행의 끝에 을 사용하여 비동기로 만들면 진행 상황을 인쇄 할 수 있습니다. 그러나 Emacs를 완전히 잠그지는 않지만, minibuffer는 프로세스를 죽이려고하는지 반복적으로 묻습니다. 그 동안에는 절뚝 거리고있다. start-process-shell-command은 첫 번째 파일/디렉토리가 전송 된 후에 만 ​​기능을 중지하는 것으로 보입니다. 내 기능을 통해 복수 rsync 호출이있을 때 나머지는 무시합니다. 이것들 중 어느 것도 이상적인 것처럼 보이지 않습니다.emacs lisp에서 어떤 쉘 명령을 사용합니까?

+1

http://www.gnu.org/software/emacs/manual/html_node/elisp/Asynchronous-Processes.html을 읽으셨습니까? –

답변

13

저는 시작 프로세스를 가장 많이 사용했습니다.

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

이렇게하면 모든 출력이 단일 버퍼로 전송됩니다.

+1

이것은 매우 간단합니다 - 감사합니다. – hatmatrix

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에 읽기. 또한 프로세스에서 output에 대한 일부 오류 검사를 원할 수 있습니다.

+0

안녕하세요, Trey, 항상 감사합니다. 이번에는 Jonathan의 솔루션을 선택해야했지만이 목적을 위해 직접적이고 잘 맞았습니다 (process-send-string은 get-buffer-create를 사용하여 생성되고 명시 적으로 참조 된 버퍼에서만 작동하는 것처럼 보였습니다. 임시 버퍼 ...)하지만 나는 필터링 기능을 읽고 ... grok에 많이있다 그리고 나는 그것의 끝에 사용을 찾을 확신합니다. 다시 감사합니다. – hatmatrix

관련 문제