버퍼를 팝업하지 않고 백그라운드에서 비동기 프로세스를 어떻게 실행할 수 있습니까?


23

async-shell-command내 .emacs에서를 사용하여 비동기 백그라운드 프로세스를 실행하는 일부 함수를 정의 했지만 명령을 실행할 때마다 새 프레임 (프레임 아님)이 만들어지고 프로세스 버퍼가 표시됩니다. "팝업"버퍼없이 명령을 어떻게 실행할 수 있습니까?

답변:


21

start-process버퍼를 팝업하지 않아야하는로 백그라운드 프로세스를 시작할 수 있습니다 .

(start-process "process-name" "buffer-name" "program")

필요한 경우 복제를 피하기 위해 프로세스 이름이 수정되므로 걱정하지 마십시오. 나중에 디버깅에 유용한 이름을 지정하십시오!

을 지정하면 "buffer-name"버퍼가 생성되지만 즉시 표시되지는 않습니다. 이것은 프로세스 관리 및 출력 확인에 편리 할 수 ​​있습니다. 버퍼를 전혀 작성하지 않으려면 nil버퍼 이름으로 전달 하십시오.

(start-process "process-name" nil "program")

start-processsudo 명령 에 사용할 수 있습니까? 나는 내 전화를 배치 시도 start-process에서 (let ((default-directory "/sudo::")) ... )그러나 그것은 나를 위해 작동하지 않았다.
sid-kap

@ sid-kap : 모르겠다. 아마도 독립형 질문으로 물어봐야합니다.
Tikhon Jelvis

1
"program"이 경우 프로그램 이름 (예 : 노틸러스, caja, 파이어 폭스) 일 뿐이며 "arg1 arg2 ..."의 네 번째 위치 인수에 있어야합니다 start-process. 나는 문서를 읽음으로써 그것을 알아 냈습니다 :)
biocyberman

8

티콘이 언급했듯이 (start-process)갈 길입니다. 버퍼를 만들고 싶지 않지만 백그라운드 프로세스 상태에 계속 반응하려면을 사용할 수도 있습니다 (set-process-sentinel). projector패키지 에서 가져온 수정 된 예는 다음과 같습니다 .

(set-process-sentinel (start-process "process-name" nil "command") #'output-message-sentinel)

(defun output-message-sentinel (process msg)
  (when (memq (process-status process) '(exit signal))
    (message (concat (process-name process) " - " msg))))

Emacs 기능 설명에서 :

(set-process-sentinel PROCESS SENTINEL)

Give PROCESS the sentinel SENTINEL; nil for default.
The sentinel is called as a function when the process changes state.
It gets two arguments: the process, and a string describing the change.

ProcessesGNU 매뉴얼 페이지 는 자세한 정보를 제공합니다.


set-process-sentinel좀 더 정확하게 설명해 주 시겠습니까? 프로세스를 관리하는 기능을 가지고 있다는 일반적인 아이디어를 얻었지만 모든 세부 사항을 완전히 이해하지는 못합니다. 감사!
Tikhon Jelvis

당신이 경우에 M-x describe-function를 입력 set-process-sentinel하면 짧은 이맥스 문서에서 답변을 얻을 것이다 : (SET-프로세스 감시 프로세스 SENTINEL) PROCESS에게 감시 SENTINEL을 지정을; 기본값은 nil입니다. 센티넬은 프로세스가 상태를 변경하면 함수로 호출됩니다. 프로세스와 변경을 설명하는 문자열이라는 두 가지 인수를 얻습니다.
waymondo

1
SentinelsProcessesGNU Emacs 매뉴얼 페이지 는 실제로 자세한 정보에 매우 적합합니다.
waymondo

시원한. 아마도 당신은 당신의 답변에 대한 링크를 편집 할 수 있습니까? 나는 또한 하나를 사용하여 더 배울 수 있다고 생각합니다 C-h f...
Tikhon Jelvis

2

비동기 명령 실행 방법을 변경할 필요가 없습니다. Emacs는 단일 데이터 구조 인을 수정하여 버퍼가 팝업 될 위치 또는 여부를 제어 할 수있는 일반적인 기능을 가지고 display-buffer-alist있습니다.

아래 솔루션에서 액션 함수 display-buffer-no-window(예 : 팝업 없음)가 이름이 시작되는 버퍼와 연결되도록 설정되어 있음을 확인할 수 있습니다 *Asynchronous Shell Command*(emacs는 둘 이상의 생성 요청시 증분 접미사를 추가 함).

사용 가능한 다른 디스플레이 옵션 목록을 보려면 C-h f display-buffer"동작 기능"목록을 입력 하고 찾으십시오.

;; Buffers that I don't want popping up by default
(add-to-list 'display-buffer-alist
  '("\\*Async Shell Command\\*.*" display-buffer-no-window))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.