버퍼를 팝업하지 않고 백그라운드에서 비동기 프로세스를 어떻게 실행할 수 있습니까? 했지만 명령을 실행할 때마다 새 프레임 (프레임

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



답변

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

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

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

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

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

답변

티콘이 언급했듯이 (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 매뉴얼 페이지 는 자세한 정보를 제공합니다.


답변

비동기 명령 실행 방법을 변경할 필요가 없습니다. 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))