Wie zwinge ich Emacs zum Töten?

7

Ich habe oft eine unvollständige oder ungültige Emacs-Konfiguration, die das normale Verhalten kill-emacsso bricht, dass es bei einem Fehler stoppt.

In diesem Fall möchte ich Emacs gewaltsam töten, ohne die PID zu jagen und eine killaus der Shell herauszugeben. Kann ich das in reinem Emacs Lisp machen?

PythonNut
quelle
Ich bin mir nicht sicher, ob ich folge. Wenn kill-emacsdies nicht funktioniert, werden möglicherweise auch andere Elisp-Ansätze verschmutzt, da sie wahrscheinlich auf die kill-emacseine oder andere Weise aufgerufen werden . Welchen Fehler bekommen Sie? Es kann einfacher sein, den Fehler zu beheben.
Tyler
Ich meine, Sie könnten eine Funktion erstellen, die kill -9zum Beispiel die aktuelle Emacs-PID aufruft . Sie müssten sehr durcheinander sein, um das zu brechen.
PythonNut
5
Sie können versuchen kill-emacs-hook, nilvor dem Anruf auf einzustellen kill-emacs. Sie können auch Emacs 'PID verwenden emacs-pidund Selbstmord begehen, indem Sie call-processmit " kill -9" anrufen .
Konstantin
1
Wenn Sie die PID trotzdem nicht jagen möchten, gibt es pkill & pgrep: \
Nsukami _
1
Nicht verwandt, aber Sie sollten vermeiden, mehrere Sitzungen von Emacs auszuführen
Sean Allred

Antworten:

12

Sie können versuchen kill-emacs-hook, nilvor dem Aufruf Folgendes einzustellen kill-emacs:

(defun really-kill-emacs ()
  "Like `kill-emacs', but ignores `kill-emacs-hook'."
  (interactive)
  (let (kill-emacs-hook)
    (kill-emacs)))

Alternativ können Sie die PID von Emacs verwenden emacs-pidund Selbstmord begehen, indem Sie call-processmit " kill -9" anrufen :

(defun brutally-kill-emacs ()
  "Use `call-process' to send ourselves a KILL signal."
  (interactive)
  (call-process "kill" nil nil nil "-9" (number-to-string (emacs-pid))))
Konstantin
quelle
3
Keine Kritik an der Antwort, nur zusätzliche Informationen: Beachten Sie, dass die Verwendung von Signal neun (das -9In kill -9) alle Prozesse verwaist, die von Emacs erzeugt wurden, genau wie es passieren würde, wenn Emacs ein einfaches Shell-Skript wären.
Sean Allred
Obwohl TERM Emacs in einem kaputten Zustand oft nicht tötet. Es kann also das einzige sein.
PythonNut
1

Manchmal habe ich mehrere nicht erreichbare Emacs-Prozesse. Mein Emacsclient startet normalerweise automatisch einen Emacs und ruft auf - server-startIch denke, irgendwo in meiner Konfiguration gibt es einen Fehler, der dazu führt, dass dies mehr als einmal passiert.

Ich töte das zusätzliche Emacsen mit killall emacsin einer Muschel. Bisher -9wurde nicht benötigt. (Es funktioniert auch, wenn nur ein Emacs läuft und ich keine PID jagen muss!)

daveloyall
quelle
Manchmal, wenn Emacs vollständig hängen, wird ein -9benötigt. Das bedeutet natürlich, dass Emacs keinen Selbstmord begehen können, aber ich füge es für alle Fälle hinzu.
PythonNut
Dies war das einzige, was für mich funktionierte, nachdem ich ein:jupyter-notebookalle anderen Methoden verhindert hatte. Ich denke, es hing irgendwo, aber ich hatte bereits alle Python-Prozesse beendet und alle Puffer getötet.
n1k31t4