Как я могу сделать запуск emacsclient из модуля запуска Unity повторно использовать существующее окно Emacs

12

Если вы создаете модуль запуска emacsclient, копируя файл .desktop (например, файл Emacs), он не будет работать в стандартном режиме запуска Unity. Это всегда запускает новое окно; он не распознает, что существующие окна Emacsclient существуют для перехода к ним. Как я могу заставить его вести себя?

В качестве фона, это очень полезный режим использования для Emacs, когда вы запускаете его как демон:, emacs --daemonа затем вызываете окно emacs emacsclient. Хороший способ сделать это для обычных пользователей emacs - это вставить их emacs --daemonв Startup Applications.

james.ferguson
источник

Ответы:

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», перетащите его) и выйдите из системы.

james.ferguson
источник
В моем .bashrc я определяю TMPDIR = $ {HOME} / tmp, чтобы временные файлы находились в моем зашифрованном $ HOME. emacs, вызываемый из модуля запуска, не видит этого определения, но emacsclient, вызываемый из оболочки, делает это. emacs (после запуска сервера) открывает сокет в / tmp, emacsclient пытается связаться с emacs через сокет в $ {HOME} / tmp, и работает очень плохо. Могу ли я использовать emacsclient.desktop для передачи правильного значения для TMPDIR?
вальтинатор
Я перенес свой вопрос в отдельную ветку и получил ответ. См. Askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/…
вальтинатор
Единство полностью проигнорировало мою emacsclient.desktopпо некоторым причинам. В конце концов я справился с этим, создав alacarteвместо него панель запуска (графический интерфейс «Главное меню»).
Брайан Z
2

Решение от james.ferguson работает хорошо. Я хотел связать emacsclient с некоторыми типами файлов в качестве «предпочтительного приложения». Для этого я нашел скрипт Джеймса с новой строкой "Exec"

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

работает лучше для меня: он запускает новый emacs, если ни один из них не запускается, не открывает новое окно и не заставляет emacs жаловаться на клиентов, все еще ожидающих, что что-то произойдет.

Теперь я могу нажимать на файлы, и они открываются в работающем emacs, если таковой существует, иначе emacs запускается.

user127094
источник
1

Другой способ - использовать скрипт :

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

Таким образом, вы всегда вызываете одну и ту же команду.

yPhil
источник