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?

Yazz.com
quelle
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
5
Mögliches Duplikat von stackoverflow.com/questions/2281593/…
Trey Jackson
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.

Bryan Oakley
quelle
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.

Peter
quelle
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.

Dale Hagglund
quelle
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
Dominic Rodger
quelle
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
28
M-x load-file
~/.emacs
digitaler Träumer
quelle
1
Dabei habe ich erfahren, dass sich bei meiner Windows 7-Installation der Ordner .emacs.d im Ordner% appdata% anstelle des Basisordners des Benutzers befand.
Bassdrop Cumberwubwubwub
14

Folgendes sollte es tun ...

M-x load-file
Tempo
quelle
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


quelle
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.

Bahbar
quelle
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.

Joe Casadonte
quelle
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
Matt Kneiser
quelle
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
WisdomFusion
quelle
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")))
AAAfarmclub
quelle
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))
jacekmigacz
quelle
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.

user1026139
quelle
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.

Lorem Ipsum Dolor
quelle
2

Neben Befehlen wie Mx eval-buffer oder Mx load-file können Sie über die Befehlszeile einen neuen Emac neu starten:

emacs -q --load "init.el"

Verwendungsbeispiel stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/

Picaud Vincent
quelle
In der Frage wird gefragt, wie dies ohne Neustart von Emacs geschehen soll. Das Starten einer neuen Kopie, während die Frage technisch beantwortet wird, scheint nicht zum Geist der Frage zu passen. 😄
Chwarr
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!

Vinh Trieu
quelle
-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.

benjaminz
quelle