スクリプトで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のスクリプト

この の呼び出しは、emacsEmacs(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 機能を使用しない場合でも、必要なライブラリが存在しない場合はプログラムは起動できません。

関連情報