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

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

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

15
задан 6 March 2017 в 04:35

3 ответа

Решение заключается в создании файла 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", перетащите его), и выйдите/в систему.

18
ответ дан 6 March 2017 в 04:35

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

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

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

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

3
ответ дан 6 March 2017 в 04:35

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

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

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

1
ответ дан 6 March 2017 в 04:35

Другие вопросы по тегам:

Похожие вопросы: