(Обратите внимание, что, как говорится в противоположном, этот вопрос не совпадает с вопросом « Как запустить в режиме демона и подавить интерактивные диалоги?» , Поскольку отправитель «ответил» на этот вопрос, исключив причину появления определенного приглашения.)
Я хотел бы знать, существует ли общий способ не emacs --daemon
зависать навсегда, ожидая ответа на приглашение, отображаемое в минибуфере, который еще не существует.
Невозможно соединиться с emacsclient, чтобы ответить на эти запросы, потому что сервер не запускается, пока Emacs не завершит последовательность запуска. (Это означает, что если для ALTERNATE_EDITOR задана пустая строка, что приводит к тому, emacsclient
что сервер не может запустить новый демон, вы можете получить несколько демонов Emacs, которые все застряли и ждут.) Я должен killall emacs
исправить проблему прежде чем продолжить.
Я могу играть в whack-a-mole с каждой вещью, вызывающей приглашение при запуске, когда я ее идентифицирую (запуская Emacs в режиме, не являющемся демоном, и видя, что он запрашивает), но это не решение, потому что он не может остановить следующий демон. от зависания при запуске по новой причине.
В качестве примера: распространенная причина, по которой он зависал, была после перезагрузки системы или сбоя Emacs, когда первый Emacs после перезагрузки захотел узнать, можно ли украсть файлы блокировки у несуществующего Emacs. Я мог бы исправить это, предложив совет, который всегда отвечал «да» без взаимодействия. Но затем одним из файлов, которые были открыты при сохранении предыдущего сеанса, был файл TRAMP, требующий пароль sudo или SSH, поэтому демон застрял в ожидании запроса пароля. Поэтому я исправляю это, вручную редактируя файл сеанса (с помощью vi
или emacs -q
!), Чтобы удалить файлы, нарушающие работу, но это не мешает этому произойти в следующий раз.
Таким образом, я могу прекратить загрузку моего сеанса автоматически при запуске и изменить его на команду, которую я должен выполнить вручную из моего первого emacsclient. Но если он не загружает мой сеанс в фоновом режиме, поэтому он готов к тому времени, когда я буду его использовать, вся цель демона потеряна!
Итак, что я хотел бы это:
- (Лучше всего) Какой-то способ отложить запросы минибуфера, пока я не открою emacsclient, продолжая при этом завершать остальную часть инициализации.
- (ОК) Какой-то способ сделать все запросы минибуфера, которые я еще не советовал, как описано выше, просто вернуть,
no
если не запущен emacsclient. Я могу жить с ошибками моих буферов TRAMP до тех пор, пока они в основном работают.
Есть ли способ достичь любой из этих целей?
источник
(read-desktop)
запустить при запуске восстановление рабочего стола , а затем, перед запускомemacs --daemon
, создать фиктивный файл блокировки, поместив целое число в файл .emacs.desktop.lock (куда поместить этот файл, к сожалению, зависит от вашей конфигурации , но, вероятно, либо ваш homedir, либо ~ / .emacs.d / .Ответы:
Наше обсуждение прояснило, что у вас нет запущенного X-сервера, что делает мое первое решение бесполезным для вас.
Далее я представляю второе решение, которое работает с текстовыми терминальными фреймами.
Когда ваша инициализация требует пользовательского ввода через одну из функций, рекомендуемых
avoid-initial-terminal
Emacs, ждет, пока вы не откроете рамку текстового терминала. Приглашение появится в минибуфере этого кадра, и вы сможете дать свой интерактивный ответ.Информация о коде дана в виде комментариев в коде. Есть
TODO
маркеры с описаниями, которые показывают вам, куда вставить вашу собственную конфигурацию. В настоящее время существуют тестовые формы для проверки кода.Тест: Emacs-версия: 26.1
1-й) Запуск
emacs --daemon
на консоли.2) Запустите
emacsclient --tty
на другой консоли. Там вас просят ввести пароль и строку. После этого вы также должны ответить на запрос y-or-np.источник
Не совсем то, что вы просите, но, возможно, решение вашей первоначальной проблемы:
Если демон предоставляет вам графическую рамку для ответа на вопросы, возникающие на этапе запуска, вы больше не застреваете.
Код ниже определяет общий совет,
my-with-initial-frame
который открывает рамку на первом доступном дисплее (например,:0.0
).Этот совет можно легко добавить к запросам команд типа
y-or-n-p
илиread-passwd
, как показано ниже.Простое открытие фрейма дает вам довольно грубую возможность отвечать на запросы в пользовательском интерфейсе. Можно также использовать диалоговое окно для,
y-or-n-p
но это потребует специальных решений для конкретных команд запросов. Я хотел избежать этого.Если вы попробуете этот код в вашем файле инициализации, убедитесь, что это первое.
Тестовое задание:
Предположения:
Иметь работающий xserver, к которому программы могут подключаться через
DISPLAY
переменную окружения.Ввод на xterm:
emacs --daemon
emacsclient --eval '(y-or-n-p "A")'
Там открывается фрейм с
y-or-n-p
запросом запросаA (y or n)
. Ответьте на этот запрос и попробуйте снова:emacsclient --eval '(y-or-n-p "B")'
Новый запрос с подсказкой
B (y or n)
в том же фрейме. Закройте этот кадр, например, с помощью C-x 5 0и попробуйте снова:emacsclient --eval '(y-or-n-p "C")'
Новый кадр открывается с запросом запроса
C (y or n)
.То же самое работает для ввода пароля.
источник
xterm
. Кроме того, я не думаю, что это решение может работать для тех, кто это делает - если у вас настроен демон для запуска при запуске, он попытается открыть фрейм в верхней части экрана входа в систему, что недопустимо, поэтому аварий.server-start
в конце запуска вместо этого, если у вас чистый запуск, вам не придется ждать. Но ... вам придется подождать, потому что, если я не пойму неправильно, вы не сможете поставить задачу по запуску демона Emacs в сценарий входа в систему, поскольку тогда графический интерфейс пользователя будет недоступен. (И в случае, подобном моему, это никогда неЯ думаю, что отложить запросы в целом будет сложно, но изменить Emacs должно быть довольно легко, чтобы такие подсказки немедленно сигнализировали об ошибке.
Не только это, но если вы не можете ответить на эти запросы без большой гимнастики, я думаю, что это квалифицируется как ошибка, поэтому я рекомендую вам представить отчет об ошибке для этого.
источник
Warning: desktop file appears to be in use by PID xxx. Using it may cause conflicts. Use it anyway? (y or n)
приглашение в ошибку, не обращаясь конкретно к «рабочему столу» каким-либо образом (потому что этот способ, будучи необщим, ложным ударом)?*Messages*
вероятно, является недостаточным хедз-апом при первом подключении клиента, что может привести к серьезным ошибкам и требует немедленного внимания, прежде чем пользователь попытается выполнить какие-либо операции с состоянием.emacs --daemon
либо начавemacsclient
сALTERNATE_EDITOR
переменной окружения, для которой задана пустая строка, вы увидите вывод, который обычно отправляется в*Messages*
эхо-запрос в терминале, пока демон инициализация завершена, и Emacs готов, но многие Emacs запускают демон при запуске системы или во время входа в систему, а выходные данные либо регистрируются, либо выбрасываютсяdesktop
а вy-or-n-p
функции (или еще ниже). У нас есть некоторый механизм для задержки отображения ошибок, которые произошли во время запуска, поэтому мы могли бы использовать его для отображения их, когда первый emacsclient подключается к демону.*Messages*
- и в то время как малоиспользуемая*Warnings*
система действительно открывает окно в буфер, если активный кадр существует, когда генерируется предупреждение, в этом случае нет кадра, и он не Похоже, легко отложить всплывающее окно до первого истощения после проблемы предупреждения. Если бы это могло быть сделано, ваше предложение сделатьyes-or-no-p
предупреждение перед клиентом было бы совершенно идеальным. (Я сомневаюсь, что пользователи прочесывают*Messages*
при запуске!)