J'ai rencontré une sorte de comportement O(n^2) ou pire lors de l'affichage de très gros fichiers (par exemple 128MB) dans Emacs et en sautant à la fin du fichier. Je pense que cela peut avoir à faire avec mon algorithme de coloration pour colorer le texte contextuellement. Si je tape control-g (quitter le clavier), l'opération n'est pas affectée. J'aimerais trouver un moyen de récupérer ma session emacs sans la tuer. J'ai essayé d'envoyer un SIGINT, mais emacs s'est simplement arrêté. Y a-t-il des signaux que je puisse envoyer, ou un autre moyen (peut-être dans un débogueur) de forcer l'action en cours à abandonner et à me rendre le contrôle ?
Réponses
Trop de publicités?Je doute que ce soit le mode de verrouillage des polices. Cela ne fait probablement que des sections proches de ce qui est visible. C'est probablement la copie de données en mémoire.
sigusr1
sigusr2
Ces événements sont générés lorsque le processus Emacs reçoit les signaux
SIGUSR1
etSIGUSR2
. Ils ne contiennent pas de données supplémentaires car les signaux ne transportent pas d'informations supplémentaires. Ils peuvent être utiles pour le débogage (voir Débogage des erreurs ).Source : Manuel de référence de GNU Emacs Lisp : Événements divers
Je ne sais pas ce que cela ferait (ou quelle version d'emacs vous utilisez) mais vous pourriez essayer un signal PROBABLEMENT non destructif (USR1 ou USR2).
$ kill -USR1 _pid_
Ou vous pourriez vous endormir et voir s'il se rétablit.
Voici ma réponse à une question similaire qui peut vous aider : https://stackoverflow.com/a/47070702/3818556
Jusqu'à présent, le seul moyen que j'ai trouvé qui fonctionne est d'envoyer un SIGUSR2
signal au processus emacs occupé en utilisant la ligne de commande kill
-- peu importe s'il fonctionne en tant que serveur (avec --daemon
) ou non. Cela ne forcera pas la terminaison du processus emacs tout en étant capable d'interrompre ce qu'il est en train de faire. Essayons un exemple pour interrompre un sleep-for
boucle fonctionnant sur le serveur emacs. (Oui, sleep-for
peut être brisé par C-g
mais ce n'est qu'un exemple. Cela a fonctionné sur un peu de les cas où emacs ne répond pas aux commandes du clavier).
Tout d'abord, lancez le serveur emacs puis utilisez emacsclient
pour vous y connecter, entrez M-: (sleep-for 120)
. Maintenant, allez dans un autre terminal et trouvez l'ID du processus du serveur en utilisant la ligne de commande : ps x|grep 'emacs.*--daemon'
. En supposant que le PID que nous avons trouvé ici est 12345. Maintenant, utilisez le terminal pour le casser :
kill -USR2 12345
Nous devrions maintenant voir le sleep-for
boucle interrompue. Dans certains cas, je dois envoyer ce signal plusieurs fois.
Notez également que SIGUSR1
ne fonctionne pas donc SIGUSR2
est recommandé, et il se peut que cela ne fonctionne que sur les versions d'Emacs supérieures à la v24. J'espère que cela vous aidera !
Je ne suis pas au courant de la gestion des signaux par emacs mais vous pouvez utiliser le serveur Emacs en mettant server-start
dans votre fichier ~/.emacs pour que vous puissiez faire RPC sur votre instance d'emacs en cours d'exécution.
Ensuite, lorsque vous voulez tuer emacs et écrire, vous pouvez appeler depuis votre Shell emacsclient -e '(save-buffers-kill-emacs t)'
.