ユニティランチャーからemacsclientを実行して既存のemacsウィンドウを再利用するにはどうすればよいですか


12

.desktopファイル(Emacsファイルなど)をコピーしてemacsclientランチャーを作成する場合、標準のUnityランチャーの方法では動作しません。常に新しいウィンドウが起動します。既存のEmacsclientウィンドウが存在することを認識していません。どのように動作させることができますか?

背景として、これはEmacsの非常に便利な使用モードであり、デーモンとして実行し emacs --daemon、でemacsウィンドウを呼び出しますemacsclient。習慣的なemacsユーザーのためにこれを行う良い方法はemacs --daemon、スタートアップアプリケーションに入れることです。

回答:


16

解決策はemacsclient.desktop、StartupWMClass設定を使用して、ウィンドウのクラスにディレクティブを含むファイルを作成することです。それなしでは、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」と入力してドラッグします)、ログアウト/ログインします。


.bashrcで、TMPDIR = $ {HOME} / tmpを定義して、一時ファイルが暗号化された$ HOMEの下にあるようにします。ランチャーから呼び出されたemacsはこの定義を認識しませんが、シェルから呼び出されたemacsclientは認識します。emacs(server-start後)は/ tmpでソケットを開き、emacsclientは$ {HOME} / tmpのソケットを介してemacsと通信しようとしますが、非常に不十分です。emacsclient.desktopを使用して、TMPDIRに正しい値を渡すことはできますか?
ワルティンレーター

私は自分の質問を独自のスレッドに移動し、回答を得ました。参照してくださいaskubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/...
waltinator

Unity emacsclient.desktopは何らかの理由で完全に無視しました。alacarte代わりに(「メインメニュー」GUI)でランチャーを作成することで、最終的にこれを回避しました。
ブライアンZ

2

james.fergusonによる解決策はうまく機能します。私が望んでいたのは、emacsclientを「優先アプリケーション」としていくつかのファイルタイプにリンクすることでした。このために、新しい「Exec」行を持つジェームズのスクリプトを見つけました

Exec=/usr/bin/emacsclient --alternate-editor emacs24 --no-wait %F

私にとってはうまく機能します:何も実行されていない場合は新しいemacsを実行し、新しいウィンドウを開かず、クライアントがまだ何かが起こるのを待っていると文句を言いません。

これで、ファイルをクリックして、実行中のemacs(存在する場合)で開かれます。存在しない場合、emacsが起動します。


1

別の方法は、スクリプトを使用することです:

if [ "$(pidof emacs)" ] ; then
    emacsclient "$@" &
else
    emacs -mm "$@" &
fi

したがって、常に同じコマンドを呼び出します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.