Зробіть emacsclient створити кадр, лише якщо його вже немає


11

Як я можу emacsclient -a '' -nстворити новий кадр, лише якщо його вже немає?

Проблема з -cпрапором полягає в тому, що він щоразу створює новий кадр. Проблема без цього полягає в тому, що якщо немає кадру, він відкриється в командному рядку.

Якщо я можу перевірити, чи є відкритий кадр Emacs з оболонки, я можу зателефонувати з або без -cцього, щоб отримати поведінку, яку я хочу. Я намагався:

$ emacsclient -a '' --eval '(frames-on-display-list)'
(#<frame F1 0xba2740>)

Я завжди отримую однаковий результат.

Я міг би використовувати тимчасові файли або pgrep, але ці підходи дуже схильні до помилок.

Це схоже на це питання , але воно не є дублікатом, оскільки там Оперативна служба була задоволена тим, що перед викликом потрібно було відкрити кадр emacsclient.


1
На те саме питання superuser.com/questions/358037/… з elisp, bashі shвідповіді.
Костянтин Моренко

Відповіді:


3

Я закінчив робити цей сценарій на основі цього

#!/bin/bash -e

if [[ "$DISPLAY" ]]; then
        frame=`emacsclient -a '' -e "(member \"$DISPLAY\" (mapcar 'terminal-name (frames-on-display-list)))" 2>/dev/null`
        [[ "$frame" == "nil" ]] && opts='-c' # if there is no frame open create one
        [[ "${@/#-nw/}" == "$@" ]] && opts="$opts -n" # don't wait unless we've asked to run in a terminal
else
        opts='-nw'
fi

exec emacsclient -a '' $opts "$@"

Якщо дисплея немає, він відкривається -nw. Якщо $DISPLAYвстановлено, він шукає кадри на цьому дисплеї, щоб побачити, чи потрібно зробити новий.

Редагувати: я змінив його, щоб ви могли вручну вказати, -nwчи потрібно відкривати в терміналі, навіть якщо є дисплей.


1
Незначна нитка: $@ слід цитувати .
дшеферд

0

Ви можете використовувати:

emacsclient -s server_name -e '(+ 1 0)' >/dev/null 2>&1

щоб перевірити, чи "server_name"вже працює сервер Emacs . Якщо команда повертає код виходу 0, вона працює. Якщо так, просто використовуйте emacsclientкоманду:

emacsclient -s server_name -n file_name.txt

Якщо він не працює, ви можете відкрити новий сервер Emacs, наприклад:

emacs --eval '(setq server-name "server_name")' --eval '(server-start)' file_name.txt &

Але таким чином, коли ви закриєте оболонку, ви вб'єте сервер, правда? В emacsclient -a ''починається emacs --daemonпри необхідності, яка зберігається навіть при закритті оболонки.
spelufo

@spelufo Сервер не вбивається вбивством оболонки. Зверніть увагу &на кінець команди; це означає запустити сервер як фоновий процес ..
Håkon Hægland

Який спрямовує його на фон поточної оболонки. Він не вбивається, коли ви повернете свою оболонку, але вона вбита, коли ви повністю закриєте цю оболонку ( C-d).
spelufo

Демон продовжує працювати, навіть якщо закрити всі свої термінали. Він буде продовжувати працювати лише в тому випадку, якщо server-startсервер запускається як демон-процес. Що ви отримуєте, якщо таким чином запустити emacs, а потім закрити всі emacs та термінали, потім відкрити новий термінал і запустити pgrep emacs?
спелуфо

@spelufo Насправді це все ще працює після C-d. Я спробував це зараз, використовуючи gnome-terminalUbuntu 14.10 .. Я думаю, що ви посилаєтесь на запущений екземпляр після закриття всіх кадрів Emacs? Тоді, це потребує
демонового
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.