Wie kann ich .emacs nach dem Ändern neu laden?


375

Wie kann ich Emacs dazu bringen, alle meine Definitionen, die ich aktualisiert habe, neu zu laden, .emacsohne Emacs neu zu starten?


18
Ich weiß, dass Emacs oft als Betriebssystem angesehen wird, aber ... s / reboot / restart /?
William Pursell

6
Ich bin kein Entwickler, daher bedeuten mir viele der Antworten, die für Entwickler sofort Sinn machen, nicht so viel
Yazz.com,

4
@MJB Der Zweck von Stack Overflow ist es, ein Wissens-Repository für selbst die grundlegendsten Fragen zu sein. Diese Frage passt perfekt zum Zweck des Stapelüberlaufs. Bitte sehen Sie stackoverflow.com/faq
chollida


10
haha jetzt fünf Jahre später führt die vorgeschlagene "Google-Suche zuerst" hierher! nett
JimLohse

Antworten:


350

Sie können den Befehl load-file verwenden ( M-x load-fileund dann zweimal die Eingabetaste drücken, um den Standarddateinamen zu akzeptieren, bei dem es sich um die aktuell bearbeitete Datei handelt).

Sie können den Punkt auch einfach an das Ende eines Sexp verschieben und drücken C-xC-e, um genau diesen Sexp auszuführen. Normalerweise ist es nicht erforderlich, die gesamte Datei neu zu laden, wenn Sie nur ein oder zwei Zeilen ändern.


22
Denken Sie daran, dass dies möglicherweise nicht immer genau das tut, was Sie denken. Wenn Sie Variablen haben, deren Inhalt gefloppt ist (dh einen Booleschen Wert auf das Gegenteil setzen), entspricht das Verhalten nicht dem Laden der Datei.
Chollida

4
Alle Nebenwirkungen im Allgemeinen können das gewünschte Verhalten
beeinträchtigen

Wenn ich das mache, bekomme ich die Nachricht: Laden mit Code-Konvertierung: Der Wert des Symbols als Variable ist ungültig: n
Chris Marie

2
Anstatt den Punkt hinter ein defunoder zu verschieben defvar, können Sie ihn auch im Deklarationskörper und -typ belassen C-M-x. Sehr praktisch.
Thomas

151

Sehr seltsam, dass das sehr praktisch ist

M-x eval-buffer

wird hier nicht erwähnt.

Es wertet sofort den gesamten Code im Puffer aus. Dies ist die schnellste Methode, wenn Sie .emacsidempotent sind.


3
Wer sagt, dass .emacsdas idempotent ist (oder sein muss)?
Mike

@mike: nicht ich. "Gegeben a, b ist wahr" bedeutet für mich, "wenn a, b wahr ist", aber ich kann sehen, was Sie meinen. Ich wechsle zu wenn für mehr Klarheit gegeben.
Peter

7
@mike: Wann wäre es sinnvoll, .emacsnicht idempotent zu sein?
Zaz

Ich hätte gedacht, dass dies der erste Vorschlag ist.
Stryker

1
Ich würde nicht sagen, dass es ein guter Stil ist, aber es könnte passieren. Sie können beispielsweise festlegen, dass eine Funktion nicht neu definiert wird, wenn sie bereits definiert ist (ab dem ersten Start). Bei der Auswertung Ihrer Init-Datei wird möglicherweise keine Änderung der Definition festgestellt.
Kaligule

43

Normalerweise können Sie die geänderte Region einfach neu bewerten. Markieren Sie die Region von ~ / .emacs, die Sie geändert haben, und verwenden Sie sie dann M-x eval-region RET. Dies ist oft sicherer als eine Neubewertung der gesamten Datei, da es einfach ist, eine .emacs-Datei zu schreiben, die nach zweimaligem Laden nicht richtig funktioniert.


2
Interessant. Ich hatte nicht über die Idee einer .emacs-Datei nachgedacht, die nicht idempotent war. Etwas, auf das ich achten muss, wenn ich mit ELisp beginne
Erik

2
Ich würde vermuten, dass es selten ist, eine .emacs-Datei zu finden, die idempotent ist, zumindest im starken Sinne von zwei Ausführungen, die genau den gleichen Status wie eine Ausführung ergeben. Zumindest ist es durchaus üblich, an verschiedene Listen anzuhängen, häufig auf eine Weise, die doppelte Einträge bei einer zweiten Ausführung nicht unterdrückt.
Dale Hagglund

1
Ein anderer Gedanke: Mit dem oben vorgeschlagenen Ansatz ist es möglich, dass der Emacs-Status, den Sie haben, nicht dem entspricht, was Ihre .emacs tatsächlich tun. Dh, da Sie nicht die gesamte Emacs - Datei von einem sauberen Schiefer ausgeführt haben, müssen Sie nicht wirklich wissen , dass es das tut , was Sie wollen.
Dale Hagglund

1
Wäre es nicht möglich, .emacs idempotent zu schreiben? Der globale Zustand ist eklig.
Ehtesh Choudhury

39

Wenn Sie Ihre .emacs-Datei im aktuell aktiven Puffer geöffnet haben:

Mx Eval-Puffer

12
Beachten Sie hierbei, dass Sie sich dadurch möglicherweise nicht in einem Zustand befinden, der mit einem Neustart identisch ist. (Erfundenes Beispiel: Wenn Sie in Ihren .emacs einen "Umschalt" -Effekt hatten).
Luapyad



13

Lösung

M-: (load user-init-file)


Anmerkungen

  • Sie geben es in der Eval:Eingabeaufforderung ein (einschließlich der Klammern)
  • user-init-fileist eine Variable, die ~/.emacsstandardmäßig den Wert enthält (der auf den Pfad der Konfigurationsdatei zeigt)
  • (load)ist eine kürzere, ältere und nicht interaktive Version von (load-file); Es ist kein Emacs-Befehl (der eingegeben werden muss M-x), sondern eine bloße Elisp-Funktion

Fazit

M-: > M-x


ist M-:> Strg Alt x? basierend auf deiner Logik stelle ich mir M-: <CMx vor, wenn nur eine Zeile in der Init-Datei geändert wird? Vielleicht ist es nur ==
Robert Houghton

12

Andere haben Ihre Frage bereits wie angegeben beantwortet, aber ich finde, dass ich normalerweise die Zeilen ausführen möchte, die ich gerade geschrieben habe. dafür CtrlAltxfunktioniert im lisp ganz gut.


3
Siehe auch eval-lastsexpbeiC-x C-e
Derek Slager

Mit C-M-xmüssen Sie nicht "am Ende des Lispelns" sein - denken Sie C-x C-evielleicht an? Das Schöne daran C-M-xist, dass Sie es auch dann aufrufen können, wenn sich point in der Mitte einer Funktions- / Variablendeklaration befindet.
Thomas

Ich habe mir wahrscheinlich angewöhnt, das Lisp zu beenden, als ich nur Cx Ce verwendet habe. Danke für den Fang!
Bahbar

9

Ich schlage vor, dass Sie dies zunächst nicht tun. Starten Sie stattdessen eine neue Emacs-Sitzung und testen Sie alle vorgenommenen Änderungen, um festzustellen, ob sie ordnungsgemäß funktionieren. Der Grund dafür ist, dass Sie sich nicht in einem Zustand befinden, in dem Sie eine nicht funktionsfähige .emacs-Datei haben, die nicht oder nicht sauber geladen werden kann. Wenn Sie die gesamte Bearbeitung in der ursprünglichen Sitzung und alle Tests in einer neuen Sitzung durchführen, haben Sie immer etwas Zuverlässiges, um fehlerhaften Code zu kommentieren.

Wenn Sie mit Ihren Änderungen endlich zufrieden sind, verwenden Sie eine der anderen Antworten zum erneuten Laden. Meine persönliche Präferenz ist evalnur der Abschnitt, den Sie hinzugefügt / geändert haben, und um dies zu tun, markieren Sie einfach den Bereich des hinzugefügten / geänderten Codes und des Aufrufs M-x eval-region. Dadurch wird der ausgewertete Code minimiert und unbeabsichtigte Nebenwirkungen minimiert, wie luapyad betont.


9

Tastaturkürzel:

(defun reload-init-file ()
  (interactive)
  (load-file user-init-file))

(global-set-key (kbd "C-c C-l") 'reload-init-file)    ; Reload .emacs file

brillant! Das ist sehr gut!
PinkCollins

7
C-x C-e ;; current line
M-x eval-region ;; region
M-x eval-buffer ;; whole buffer
M-x load-file ~/.emacs.d/init.el

4

Ich bin derzeit auf Ubuntu 15.04; Ich definiere gerne einen Schlüssel dafür.
[M-Einfügen] bedeutet auf meiner Tastatur Alt-Einfügen.
Fügen Sie dies in Ihre .emacs-Datei ein:

(global-set-key [M-insert] '(lambda() (interactive) (load-file "~/.emacs")))

3

Definieren Sie es in Ihrer Init-Datei und rufen Sie es per Mx reload-user-init-file auf

(defun reload-user-init-file()
  (interactive)
  (load-file user-init-file))

2

Obwohl dies M-x eval-bufferfunktionieren wird, können Probleme mit Umschaltern und ähnlichen Dingen auftreten. Ein besserer Ansatz könnte darin bestehen, zu markieren oder hervorzuheben, was in Ihren .emacs neu ist (oder sogar den Scratch-Puffer, wenn Sie nur herumspielen) und dann M-x eval-region. Hoffe das hilft.


2

Hier ist eine schnelle und einfache Möglichkeit, Ihre Konfiguration schnell zu testen. Sie können auch C-x C-eam Ende eines bestimmten Lisp verwenden, um bestimmte Funktionen einzeln auszuführen.

Cx Ce führt den Befehl eval-last-sexp (in global-map gefunden) aus, eine interaktive kompilierte Lisp-Funktion.

Es ist an Cx Ce gebunden.

(eval-last-sexp EVAL-LAST-SEXP-ARG-INTERN)

Bewerten Sie sexp vor Punkt; Druckwert im Echo-Bereich. Drucken Sie die Ausgabe interaktiv mit dem Präfixargument in den aktuellen Puffer.

Normalerweise schneidet diese Funktion die lange Ausgabe gemäß dem Wert der Variablen 'eval-expression-print-length' und 'eval-expression-print-level' ab. Bei einem Präfixargument von Null gibt es jedoch keine solche Kürzung. Ein solches Präfixargument führt auch dazu, dass Ganzzahlen in mehreren zusätzlichen Formaten (Oktal, Hexadezimal und Zeichen) gedruckt werden.

Wenn 'eval-expression-debug-on-error' nicht null ist, was die Standardeinstellung ist, sorgt dieser Befehl dafür, dass alle Fehler in den Debugger eingegeben werden.



0

Sie können die Schlüsselbindung für solche Emacs festlegen

;; reload emacs configuration
(defun reload-init-file ()
  (interactive)
  (load-file "~/.emacs"))

(global-set-key (kbd "C-c r") 'reload-init-file) 

Hoffe das wird helfen!


-2

Wenn Sie zufällig eine Shell in Emacs geöffnet haben, können Sie auch Folgendes tun:

. ~/.emacs

Kann ein paar Tastenanschläge sparen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.