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.
Processes 의 GNU 매뉴얼 페이지 는 자세한 정보를 제공합니다.
답변
비동기 명령 실행 방법을 변경할 필요가 없습니다. 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))