Як я можу зробити запуск emacsclient із запуску єдності повторно використовувати існуюче вікно emacs


12

Якщо ви створюєте програму запуску emacsclient, скопіювавши файл .desktop (наприклад, Emacs), він не поводиться у стандартному режимі запуску Unity. Це завжди запускає нове вікно; він не визнає, що існують вікна Emacsclient, щоб перейти до них. Як я можу змусити його вести себе?

Як фон, це дуже корисний режим використання для Emacs, де ви запускаєте його як демон:, emacs --daemonа потім ви викликаєте вікно emacs emacsclient. Хороший спосіб зробити це для звичних користувачів emacs - це розмістити emacs --daemonу своїх програмах запуску.

Відповіді:


16

Рішення полягає в створенні emacsclient.desktopфайлу, що включає директиву до нього класу вікна, використовуючи налаштування StartupWMClass. Без цього Unity не може сказати, що це вікно походить від Emacsclient. Це створить один на основі вмісту Emacs one (/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, викликаний із запуску, не бачить цього визначення, але emacsclient, викликаний з оболонки, робить. emacs (після запуску сервера) відкриває сокет в / tmp, emacsclient намагається спілкуватися з emacs через сокет у $ {HOME} / tmp, і робить це дуже погано. Чи можу я використовувати emacsclient.desktop для передачі потрібного значення для TMPDIR?
waltinator

Я перенесла своє запитання на власну нитку і отримала відповідь. Дивіться askubuntu.com/questions/64005/launcher-doesnt-respect-tmpdir/…
waltinator

Єдність повністю ігнорувала мою emacsclient.desktopчомусь. Я врешті-решт обминув це, створивши alacarteнатомість пускову установку (GUI "Головне меню").
Брайан 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

Отже, ви завжди викликаєте одну і ту ж команду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.