Зробіть 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.