如何让从 Unity Launcher 运行的 emacsclient 重用现有的 emacs 窗口

如何让从 Unity Launcher 运行的 emacsclient 重用现有的 emacs 窗口

如果您通过复制 .desktop 文件(例如 Emacs 文件)来创建 emacsclient 启动器,它不会按照标准的 Unity 启动器方式运行。它总是启动一个新窗口;它无法识别现有的 Emacsclient 窗口并跳转到它们。我该如何让它正常运行?

作为背景,这是 Emacs 的一个非常有用的使用模式,您可以将其作为守护进程运行: emacs --daemon,然后使用 调出一个 emacs 窗口emacsclient。对于习惯使用 emacs 的用户来说,一个好方法是将其放入emacs --daemon您的启动应用程序中。

答案1

解决方案是创建一个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 放在启动器中(例如,点击超级,输入“emacsclient”,将其拖上去),然后注销/登录。

答案2

james.ferguson 的解决方案很有效。我想要的是将 emacsclient 链接到某些文件类型作为“首选应用程序”。为此,我找到了 james 的脚本,其中有一个新的“Exec”行

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

对我来说效果更好:如果没有运行,它会运行一个新的 emacs,不会打开新窗口,也不会让 emacs 抱怨客户端仍在等待事情发生。

现在我可以单击文件,如果存在,它们将在正在运行的 emacs 中打开,否则 emacs 就会启动。

答案3

另一种方法是使用脚本

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

因此您总是调用相同的命令。

相关内容