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/...elispbashそしてsh答え。
Konstantin Morenko 2016

回答:


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$DISPLAYが設定されている場合は、そのディスプレイでフレームを探して、新しいフレームを作成する必要があるかどうかを確認します。

編集:-nwディスプレイがある場合でも、ターミナルで開くかどうかを手動で指定できるように変更しました。


1
マイナーなnitpick: $@ 引用する必要があります
dshepherd 2015年

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 2015年

@spelufoシェルを殺してもサーバーは殺されません。&コマンドの最後にあるに注意してください。サーバーをバックグラウンドプロセスとして実行することを意味します。
HåkonHæglandJun

現在のシェルの背景にフォークします。シェルを取り戻しても殺されませんが、そのシェルを完全に閉じると殺されます(C-d)。
spelufo 2015年

デーモンは、すべての端末を閉じても実行され続けます。server-startサーバーをデーモンプロセスとして起動した場合にのみ、実行を続けます。emacsをそのように起動してすべてのemacsとターミナルを閉じ、新しいターミナルを開いて実行すると、pgrep emacs何が得られますか?
spelufo 2015年

@spelufo実際には、まだ実行中C-dです。私は今gnome-terminalUbuntu 14.10で使用してこれを試しました。すべてのEmacsフレームを閉じた後に実行中のインスタンスを参照していると思いますか?その場合、デーモンプロセスが必要になります。
HåkonHæglandJun
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.