Как прервать emacs, когда control-g не работает в очень больших файлах?

16

Я столкнулся с некоторым типом поведения O (n ^ 2) или хуже при просмотре очень больших (например, 128 МБ) файлов в Emacs и переходе к концу файла. Я думаю, что это может иметь отношение к моему алгоритму окраски, чтобы окрашивать текст контекстно. Если я наберу control-g (клавиатура-выход), операция не будет затронута. Я хотел бы как-нибудь восстановить мой сеанс Emacs, не убивая его. Я попытался отправить SIGINT, но emacs только что вышел. Могу ли я послать какие-либо сигналы или каким-либо другим способом (возможно, в отладчике), чтобы заставить любое выполняемое действие отказаться и вернуть мне контроль?

WilliamKF
источник
Я не знаю, как сделать блокировку шрифтов прерываемой, но вы можете найти что-то полезное на этой странице Emacs Wiki по ускорению блокировки шрифтов .
Аарон Миллер
5
Ты пробовал убежать 3 раза?
yPhil
Да, я думаю, что здесь виноват ваш собственный код блокировки шрифта. font-lock-keywordsВнимательно изучите свои регулярные выражения, чтобы попытаться найти проблему.
Дрю
1
EMACS: восемь мегабайт и постоянная
замена
2
Удар по три раза ничего не значит для меня.
WilliamKF

Ответы:

9

Я сомневаюсь, что это режим блокировки шрифтов. Это, вероятно, только делает разделы рядом с тем, что видно. Это, вероятно, копирование данных в памяти.

sigusr1

sigusr2

Эти события генерируются, когда процесс Emacs получает сигналы SIGUSR1и SIGUSR2. Они не содержат никаких дополнительных данных, потому что сигналы не несут дополнительную информацию. Они могут быть полезны для отладки (см. « Отладка ошибок» ).

Источник: GNU Emacs Lisp Справочное руководство: Разные события

Я не знаю, что он будет делать (или какую версию emacs вы используете), но вы можете попробовать НАДЕЖНЫЙ неразрушающий сигнал (USR1 или USR2).

$ kill -USR1 pid

Или вы могли бы пойти спать и посмотреть, излечится ли это.

9mjb
источник
Интересно, насколько занят (процессор и диск) ваша машина. Это может немного рассказать вам о том, что он делает. ... и вы можете запустить другую копию emacs и "убить -USR1 pid" эту новую, чтобы посмотреть, что произойдет, прежде чем делать ту, которая вам нужна.
9мб
3
Ух, отправка kill -USR2в emacs-mac у меня сработала в аналогичной ситуации - загрузил большой файл в js2-mode и запустил isearch. USR2 вышел из поиска и вошел в отладчик. Намного лучше, чем убивать процесс!
Уильям
Я не согласен с вашими сомнениями. Убийство сработало для меня. Это пнуло меня к отладчику, и font-lock-default-fontify-region был там, где он застрял.
Брайан С.
2

Я не знаю о какой-либо обработке сигналов, которую выполняет emacs, но вы можете использовать Emacs Server, вставив server-startфайл ~ / .emacs, чтобы вы могли выполнять RPC на своем работающем экземпляре emacs.

Затем, когда вы захотите убить emacs и написать, вы можете звонить из вашей оболочки emacsclient -e '(save-buffers-kill-emacs t)'.

Дуайт Спенсер
источник