Emacs - подключиться к демону (если он существует) без использования emacsclient

Если у меня есть emacs, работающий как демон в моей системе, я могу легко подключиться к нему с помощью emacsclient. Это я знаю. Однако я хотел бы знать, есть ли способ сказать emacs (не emacsclient) вести себя как emacsclient, если демон уже запущен?

e.g.

# emacs daemon is not running
emacs # should start a new frame

# ...

# emacs daemon IS running
emacs # should actually behave like emacsclient, i.e. connect to my daemon

Могу ли я что-нибудь сделать со своим init.el, чтобы воспроизвести такое поведение?


person bstamour    schedule 30.11.2011    source источник
comment
Это не совсем мой вопрос, хотя это его часть. Я изменил название, чтобы лучше отразить то, что мне действительно нужно.   -  person bstamour    schedule 30.11.2011


Ответы (2)


Я так не думаю, но можно ли добиться аналогичного эффекта, используя emacsclient с пустой строкой в ​​качестве параметра --alternate-editor? Из http://www.gnu.org/s/libtool/manual/emacs/emacsclient-Options.html#emacsclient-Options:

-a command

--alternate-editor=command

. . . В качестве особого исключения, если команда представляет собой пустую строку, то emacsclient запускает Emacs в режиме демона и затем снова пытается подключиться.

person Luke Girvin    schedule 30.11.2011

Вы можете сделать -a '' вещь с emacsclient, но то, что делаю я и многие люди, - это какой-то сценарий, который в основном делает то, что делает emacsclient '', в несколько этапов.

Моя версия похожа на этот сценарий BASH: вас интересует функция ensure-server-is-running. Это основная функция скрипта, далее следует функция ensure-server-is-running, а остальное используется после этого для вашего любопытства, но не способствует ответу на вопрос.

#!/bin/bash
# ec.sh
#
# [function definitions]
#

ensure-server-is-running
ensure-frame-exists

focus-current-frame

Убедитесь, что сервер работает

# ec.sh function definition
# From https://emacs.stackexchange.com/a/12896/19972
function server-is-running() {
    emacsclient -e '(+ 1 0)' > /dev/null 2>&1
}

function ensure-server-is-running(){
    if ! server-is-running ; then
        echo "Need to start daemon, press enter to continue, C-c to abort"
        read
        emacs --daemon
    fi
}

И две другие функции:

# ec.sh function definition
# From https://superuser.com/a/862809
function frame-exists() {
    emacsclient -n -e "(if (> (length (frame-list)) 1) 't)" 2>/dev/null | grep -v nil >/dev/null 2>&1
}

function ensure-frame-exists() {
    if ! frame-exists ; then
        emacsclient -c --no-wait
    fi
}

# From https://emacs.stackexchange.com/a/54139/19972
function focus-current-frame() {
    # Doesn't work a frame exists and is in a terminal
    emacsclient --eval "(progn (select-frame-set-input-focus (selected-frame)))"
}

focus-current-frame - это то, что заставит ОС поместить вас в текущий фрейм Emacs. Это самая важная особенность. Лично я вставляю адаптированную версию этого в приложение MacOS Automator. Когда есть фрейм графического интерфейса emacs, выполнение поиска в Spotlight EmacsC (обычно достаточно простого ввода e) помещает меня в мое окно emacs. Это сверхбыстрый способ перехода к окну emacs.

person Philippe Carphin    schedule 01.05.2021