스크립트로 emacsclient 실행

스크립트로 emacsclient 실행

또는 emacsclient으로 실행해야 하는지 결정하는 스크립트를 만들려고 합니다 . 스크립트는 다음과 같습니다.-nc-t이 버전):

#!/bin/sh 
if [ -z "$DISPLAY" ]; then 
    IS_GRAPHICAL=true 
else 
    IS_GRAPHICAL=$(emacs --batch -Q --eval='(if (fboundp '"'"'tool-bar-mode) (message "true") (message "false"))' 2>&1) 
fi 
if $IS_GRAPHICAL; then 
    emacsclient -a "" -nc "$@" 
else 
    emacsclient -a "" -t "$@" 
fi

그러나 이 emacs --batch -Q ...회선은 베어 인스턴스를 사용하는 것만큼 시간이 걸립니다 emacs. 이 줄을 주석 처리하면 tty에서 실행될 때 깨끗한 화면 대신 아무것도 얻지 못합니다. 더 빠르게 감지할 수 있나요?

나는 이미 systemd 사용자 유닛을 사용하여 emacs 데몬을 시작했습니다. 나는 emacsclient다음을 원한다:

  • 머무르다터미널에서(즉, GUI 창을 열지 않음) 파일과 함께 호출되거나(예: 에 의해 호출됨 git-commit) 그래픽 환경이 존재하지 않는 경우(예: tty에서 호출됨) 종료할 때까지 계속 실행( C-x C-c)
  • 파일 없이 호출할 때 GUI 창을 열고(기본 emacs호출처럼 동작합니다. 이 작업을 수행하면 emacsclient입력 파일이 필요하다는 메시지가 표시됨) 즉시 반환됩니다.

답변1

Arch Wiki의 해당 스크립트

emacs해당 검사를 호출하면 (fboundp 'tool-bar-mode)Emacs 빌드에 GUI 지원이 포함되어 있는지 테스트됩니다. 약간의 RAM과 디스크 공간을 절약하기 위해 Emacs를 구축하지 않고도 Emacs를 구축할 수 있지만 이는 드문 일입니다. GUI 지원이 부족한 Emacs 빌드와의 호환성에 관심이 없다면 이 부분은 잊어버리세요.

따라서 당신은

if [ -n "$DISPLAY" ]; then
  emacsclient -a "" -n -c "$@"
else
  emacsclient -a "" "$@"
fi

emacsclient그리고 그러한 수준의 복잡성도 새 GUI 창을 열면 즉시 호출이 반환되도록 하려는 경우에만 필요합니다 . (터미널에서 실행 중인 경우 해당 터미널 사용을 마칠 때까지 계속 실행해야 합니다.) 이 동작을 원하는지 여부를 결정하는 것은 사용자의 몫입니다. 그렇지 않다면 간단히 달릴 수 있습니다

emacsclient -a "" "$@"

emacsclient그리고 어쨌든 세션으로 Emacs를 시작한다면(예를 들어 시스템 단위로) 시작하라고 말할 필요가 없습니다 . 그래서 우리에게 남은 건

emacsclient "$@"

더 이상 단순화할 수는 없습니다.

추가된 요구사항

  • 파일과 함께 호출되거나(...) 그래픽 환경이 없을 때(...) 터미널에 그대로 유지됩니다(...).
  • 파일(…) 없이 호출되면 GUI 창을 열고 즉시 반환

이를 위해서는 스크립트가 인수와 함께 호출되었는지 테스트해야 합니다. 임의의 emacsclient옵션(예: --eval)을 전달하면 해당 옵션이 인수로 간주된다고 가정하겠습니다 .

if [ $# -ne 0 ]; then
  emacsclient -nw "$@"
elif [ -n "$DISPLAY" ]; then
  emacsclient -c -n
else
  emacsclient -c
fi

¹ GUI를 지원하지 않는다는 것은 필수 라이브러리를 설치할 필요가 없다는 것을 의미합니다. emacs해당 특정 세션에서 GUI 기능을 사용하지 않더라도 프로그램이 제공하는 라이브러리가 없으면 프로그램을 시작할 수 없습니다 .

관련 정보