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


12

如果通过复制.desktop文件(例如Emacs文件)来创建emacsclient启动器,则它不会以标准的Unity启动器方式运行。它总是启动一个新窗口。它不认识到现有的Emacsclient窗口可以跳转到它们。我该如何表现?

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

Answers:


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看不到此定义,但是从shell调用的emacsclient可以看到。emacs(在服务器启动后)在/ tmp中打开一个套接字,emacsclient尝试通过$ {HOME} / tmp中的套接字与emacs进行通信,但效果很差。我可以使用emacsclient.desktop为TMPDIR传递正确的值吗?
waltinator 2011年

我把问题移到了自己的话题上,并得到了回答。见askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/...
waltinator

emacsclient.desktop出于某种原因,Unity完全忽略了我。我最终通过在alacarte(“主菜单” GUI)中创建启动器来解决此问题。
Brian Z

2

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

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

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

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


1

另一种方法是使用脚本

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.