또는 를 사용하여 실행 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
1GUI 지원이 없다는 것은 필요한 라이브러리를 설치할 필요가 없다는 것을 의미합니다. 프로그램에 존재하지 않는 라이브러리가 포함되어 있으면 emacs
해당 특정 세션에서 GUI 기능을 사용하지 않더라도 프로그램을 시작할 수 없습니다.