.desktopファイル(Emacsファイルなど)をコピーしてemacsclientランチャーを作成した場合、標準のUnityランチャーの方法では動作しません。常に新しいウィンドウを起動します。既存のEmacsclientウィンドウが存在することを認識して、それらにジャンプすることはできません。どのように動作させることができますか?
背景として、これはEmacsの非常に便利な使用モードであり、デーモンとして実行します:emacs --daemon
、次にemacsclient
でemacsウィンドウを呼び出します。習慣的なemacsユーザーのためにこれを行う良い方法は、emacs --daemon
をスタートアップアプリケーションに入れることです。
解決策は、StartupWMClass設定を使用して、ウィンドウのクラスへのディレクティブを含むemacsclient.desktop
ファイルを作成することです。それなしでは、UnityはそのウィンドウがEmacsclientから来たことを知ることができません。これにより、Emacsの内容(/usr/share/applications/emacs23.desktop)に基づいて作成されます。
mkdir -p ~/.local/share/applications
cat > !$/emacsclient.desktop <<EOF
[Desktop Entry]
Version=1.0
Name=Emacsclient
GenericName=Text Editor
Comment=View and edit files
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-Java;text/x-moc;text/x-Pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=/usr/bin/emacsclient -c %F
Icon=/usr/share/icons/hicolor/scalable/apps/emacs23.svg
Type=Application
Terminal=false
Categories=Utility;Development;TextEditor;
StartupWMClass=Emacs
EOF
Emacsclientをランチャーに配置し(例:Superをタップし、「emacsclient」と入力してドラッグします)、ログアウト/ログインします。
James.fergusonによる解決策はうまく機能します。私が望んでいたのは、emacsclientを「優先アプリケーション」としていくつかのファイルタイプにリンクすることでした。このために、新しい「Exec」行を持つジェームズのスクリプトを見つけました
Exec=/usr/bin/emacsclient --alternate-editor emacs24 --no-wait %F
私にとってはうまく機能します。何も実行されていない場合は新しいemacsを実行し、新しいウィンドウを開かず、クライアントが何かが起こるのをまだ待っていると文句を言いません。
これで、ファイルをクリックして、実行中のemacs(存在する場合)で開かれます。存在しない場合は、emacsが起動します。
別の方法は script を使用することです:
if [ "$(pidof emacs)" ] ; then
emacsclient "$@" &
else
emacs -mm "$@" &
fi
したがって、常に同じコマンドを呼び出します。