Como interromper o emacs quando control-g não funciona em arquivos muito grandes?

16

Eu encontrei algum tipo de comportamento O (n ^ 2) ou pior ao exibir arquivos muito grandes (por exemplo, 128 MB) no Emacs e pular para o final do arquivo. Eu acho que pode ter a ver com meu algoritmo de cores para colorir o texto contextualmente. Se eu digitar control-g (sair do teclado), a operação não será afetada. Eu gostaria de alguma maneira de recuperar minha sessão do emacs sem simplesmente matá-la. Tentei enviar um SIGINT, mas o emacs acabou de sair. Existe algum sinal que eu possa enviar ou de alguma outra maneira (talvez em um depurador) para forçar a ação que está sendo executada a desistir e devolver o controle para mim?

WilliamKF
fonte
Não conheço uma maneira de tornar o bloqueio de fontes interrompível, mas você pode encontrar algo útil nesta página Wiki do Emacs para acelerar o bloqueio de fontes .
Aaron Miller
5
Você tentou acertar a fuga 3 vezes?
usar o seguinte comando
Sim, acho que seu próprio código de bloqueio de fonte provavelmente está errado aqui. Examine seus font-lock-keywordsregexps com cuidado para tentar encontrar o problema.
Drew
11
EMACS: Oito Megabytes e constantemente Trocar :-)
user829755
2
Atingir uma fuga três vezes não faz nada para mim.
perfil completo de WilliamKF

Respostas:

8

Duvido que seja o modo de bloqueio de fonte. Provavelmente, apenas as seções se aproximam do que é visível. Provavelmente está copiando dados na memória.

sigusr1

sigusr2

Esses eventos são gerados quando o processo Emacs recebe os sinais SIGUSR1e SIGUSR2. Eles não contêm dados adicionais porque os sinais não carregam informações adicionais. Eles podem ser úteis para depuração (consulte Erro na depuração ).

Fonte: GNU Emacs Lisp Manual de Referência: Eventos Diversos

Não sei o que faria (ou qual versão do emacs você está executando), mas você poderia tentar um sinal PROVÁVEL não destrutivo (USR1 ou USR2).

$ kill -USR1 pid

Ou você pode ir dormir e ver se ele se recupera.

9mjb
fonte
Gostaria de saber como sua máquina está ocupada (CPU e disco). Isso pode lhe contar um pouco sobre o que está fazendo. .. e você poderá executar outra cópia do emacs e "kill -USR1 pid" para ver o que acontece antes de fazer o que você gosta.
9mjb
2
Uau, enviar kill -USR2para o emacs-mac funcionou para mim em uma situação semelhante - carregou um arquivo grande no modo js2 e iniciou uma pesquisa. USR2 encerra o isearch e entra no depurador. Muito melhor do que matar o processo!
William
Eu discordo de suas dúvidas. A matança funcionou para mim. Chutou-me para o depurador e a fonte-lock-default-fontify-region estava onde estava presa.
Brian C.
2

Não conheço qualquer manipulação de sinal que o emacs faça, mas você pode usar o Emacs Server colocando server-startseu arquivo ~ / .emacs para poder fazer RPC na instância em execução do emacs.

Então, quando você quiser matar o emacs e escrever, poderá ligar do seu shell emacsclient -e '(save-buffers-kill-emacs t)'.

Dwight Spencer
fonte