Как я могу отправить сигнал Cg ​​/quit в emacs из emacsclient, когда сервер занят?

В моей текущей настройке я запускаю emacs --daemon при загрузке и последующем использовании emacsclient делать работу. Тем не менее, я заметил проблему с этим. Когда происходит сложная часть обработки, Cg перестает работать: сложная работа не может быть остановлена ​​или прекращена досрочно. Насколько я могу судить, это связано с тем, что клиент emacs должен ждать подтверждения от сервера перед обработкой любого ввода от клиента. В результате Cg не будет работать, когда мне это больше всего нужно - спасать процессы, которые отнимают много времени или могут быть разрушительными.

Есть ли какие-либо обходные пути к этому или способ заставить серверный процесс "остановить это!"? Ничто в разделах руководства " Выход из системы" или " Аварийный выход", похоже, не признает, что эта проблема существует, поэтому возможно, что это результат того, что я сделал что-то не так. Если так, что я делаю не так?

Если ответ "нет, нет способа сделать то, что вы хотите; emacsclient процессы не могут справиться с блокировкой сервера в течение нетривиального промежутка времени ", я отмечу как принятый ответ, который указывает в коде или документации, где этот ответ может быть получен: я не смог найти такой вещь.:(

2 ответа

Пока что единственный способ, который я нашел, - это отправить SIGUSR2 сигнал занятому процессу Emacs с помощью командной строки kill - независимо от того, работает ли он как сервер (с --daemon) или нет. Это не приведет к принудительному завершению процесса emacs, в то время как он может прерывать то, что он делает. Давайте попробуем пример, чтобы сломать sleep-for цикл работает на сервере Emacs. (Да, sleep-for может быть сломан C-g но это всего лишь пример. Это работало в некоторых случаях, когда emacs не отвечает на команды клавиатуры.)

Сначала запустите сервер Emacs, затем используйте emacsclient подключитесь к нему, введите M-: (sleep-for 120), Теперь перейдите в другой терминал и найдите идентификатор процесса сервера с помощью командной строки: ps x|grep 'emacs.*--daemon', Предполагая, что PID, который мы нашли здесь, 12345. Теперь используйте терминал, чтобы сломать его:

kill -USR2 12345

Теперь мы должны увидеть sleep-for цикл прерван. В некоторых случаях мне нужно отправить этот сигнал несколько раз.

Также обратите внимание, что SIGUSR1 не работает так SIGUSR2 рекомендуется, и это может работать только на версиях Emacs, которые больше v24. Надеюсь это поможет!

К сожалению, я не думаю, что есть элегантное решение. Одна из возможностей - создать запасной сеанс emacsclient, спрятанный в сеансе tmux/screen, который вы можете восстановить, а затем вставить туда Cg. Но это отчасти грубо.

Другие вопросы по тегам