如何从unity启动器重新使用现有的emacs窗口运行emacsclient

如果通过复制.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 < 

将emacsclient放入启动器中(例如,点按“超级”,键入“emacsclient”,将其拖动),然后注销。

另一种方法是使用脚本 :

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

所以你总是调用相同的命令。

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

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

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

现在我可以点击文件,然后在正在运行的emacs中打开它们,如果存在,则启动emacs。