または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
Emacs(fboundp 'tool-bar-mode)
のビルドに GUI サポートが含まれているかどうかをテストしています。RAM とディスク領域を少し節約するために GUI サポートなしで Emacs をビルドすることは可能ですが、一般的ではありません。GUI サポートのない Emacs ビルドとの互換性を気にしない限り、この部分は忘れてください。
こうなると、
if [ -n "$DISPLAY" ]; then
emacsclient -a "" -n -c "$@"
else
emacsclient -a "" "$@"
fi
そして、そのレベルの複雑さは、新しいGUIウィンドウを開いたときにすぐに呼び出しを返したい場合にのみ必要ですemacsclient
。(ターミナルで実行されている場合は、そのターミナルの使用が終了するまで実行し続ける必要があります。)この動作が気に入るかどうかはあなた次第です。気に入らない場合は、単に以下を実行できます。
emacsclient -a "" "$@"
emacsclient
そして、もしEmacsをセッションで起動するなら、例えばsystemdユニットとして起動するなら、起動を指示する必要はありません。それで、
emacsclient "$@"
これ以上単純化することはできません。
追加の要件
- ファイルで呼び出された場合 (…)、またはグラフィカル環境が存在しない場合は (…)、ターミナルに留まります。
- ファイルなしで呼び出されるとGUIウィンドウを開き(…)、すぐに戻ります
そのためには、スクリプトが引数付きで呼び出されたかどうかをテストする必要があります。任意のemacsclient
オプション (例: --eval
) を渡すと、それが引数としてカウントされると想定します。
if [ $# -ne 0 ]; then
emacsclient -nw "$@"
elif [ -n "$DISPLAY" ]; then
emacsclient -c -n
else
emacsclient -c
fi
¹ GUI サポートがないということは、必要なライブラリをインストールする必要がないことを意味します。emacs
特定のセッションで GUI 機能を使用しない場合でも、必要なライブラリが存在しない場合はプログラムは起動できません。