프레임이없는 경우에만 emacsclient가 프레임을 작성하게하십시오


11

emacsclient -a '' -n새 프레임이없는 경우에만 새 프레임을 만들 려면 어떻게 해야합니까?

-c플래그 의 문제점 은 매번 새 프레임을 작성한다는 것입니다. 프레임이 없으면 명령 행에서 열리게됩니다.

쉘에서 열린 Emacs 프레임이 있는지 확인할 수 있다면 -c원하는 동작을 얻기 위해 전화를 걸거나받지 않고 호출 할 수 있습니다 . 나는 시도했다 :

$ emacsclient -a '' --eval '(frames-on-display-list)'
(#<frame F1 0xba2740>)

나는 항상 같은 결과를 얻습니다.

임시 파일이나 pgrep을 사용할 수 있지만 이러한 방법은 오류가 발생하기 쉽습니다.

이것은 이 질문 과 비슷 하지만, OP가 호출하기 전에 프레임을 열어야하는 것에 만족했기 때문에 복제본이 아닙니다 emacsclient.


1
같은 질문 superuser.com/questions/358037/...elisp, bash그리고 sh답변.
Konstantin Morenko

답변:


3

나는에 따라이 스크립트를 만들고 결국

#!/bin/bash -e

if [[ "$DISPLAY" ]]; then
        frame=`emacsclient -a '' -e "(member \"$DISPLAY\" (mapcar 'terminal-name (frames-on-display-list)))" 2>/dev/null`
        [[ "$frame" == "nil" ]] && opts='-c' # if there is no frame open create one
        [[ "${@/#-nw/}" == "$@" ]] && opts="$opts -n" # don't wait unless we've asked to run in a terminal
else
        opts='-nw'
fi

exec emacsclient -a '' $opts "$@"

디스플레이가 없으면로 열립니다 -nw. 경우 $DISPLAYIS 설정 그것은 새로운 하나를 만들 필요가 있는지 그 디스플레이의 프레임을 찾습니다.

편집 : -nw디스플레이가 있어도 터미널에서 열지 여부를 수동으로 지정할 수 있도록 수정했습니다 .


1
작은 nitpick : $@ 따옴표로 묶어야 합니다.
dshepherd

0

당신이 사용할 수있는:

emacsclient -s server_name -e '(+ 1 0)' >/dev/null 2>&1

Emacs 서버 "server_name"가 이미 실행 중인지 확인하십시오 . 명령이 종료 코드 0을 리턴하면 실행 중입니다. 그렇다면 다음 emacsclient명령을 사용하십시오 .

emacsclient -s server_name -n file_name.txt

실행 중이 아닌 경우 다음과 같이 새 Emacs 서버를 열 수 있습니다.

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &

그러나 그렇게하면 쉘을 닫으면 서버가 죽일 것입니다. emacsclient -a ''시작 emacs --daemon쉘을 닫을 경우에도이 지속 필요한 경우.
spelufo 2016 년

@spelufo 셸을 종료해도 서버가 종료되지 않습니다. &명령이 끝날 때 주의하십시오 . 서버를 백그라운드 프로세스로 실행하는 것을 의미합니다.
Håkon Hægland 2016 년

현재 쉘의 배경으로 포크합니다. 껍질을 되 찾을 때 죽지는 않지만 껍질을 완전히 닫으면 죽습니다 ( C-d).
spelufo 2016 년

모든 터미널을 닫아도 데몬은 계속 실행됩니다. server-start서버를 데몬 프로세스로 시작한 경우에만 계속 실행됩니다 . emacs를 시작한 다음 모든 emacs 및 터미널을 닫은 다음 새 터미널을 열고 실행하면 무엇을 얻을 수 pgrep emacs있습니까?
spelufo 2016 년

@spelufo 실제로는 여전히 이후에 실행되고 C-d있습니다. 나는 gnome-terminalUbuntu 14.10에서 이것을 사용해 보았습니다 . 모든 Emacs 프레임을 닫은 후 실행중인 인스턴스를 참조한다고 생각하십니까? 그러면 데몬 프로세스가 필요합니다.
Håkon Hægland
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.