Comment puis-je recharger .emacs après l'avoir changé?

375

Comment puis-je demander à Emacs de recharger toutes mes définitions que j'ai mises à jour .emacssans redémarrer Emacs?

Yazz.com
la source
18
Je sais qu'emacs est souvent considéré comme un système d'exploitation, mais ... s / reboot / restart /?
William Pursell
6
Je ne suis pas un développeur, donc beaucoup de réponses qui ont un sens immédiatement pour les développeurs ne signifient pas grand-chose pour moi
Yazz.com
4
@MJB le but de Stack Overflow est d'être un référentiel de connaissances pour les questions les plus élémentaires. Cette question s'inscrit parfaitement dans le but de Stack Overflow. Veuillez voir stackoverflow.com/faq
chollida
5
doublon possible de stackoverflow.com/questions/2281593/…
Trey Jackson
10
haha maintenant cinq ans plus tard, la "recherche Google en premier" suggérée mène ici! agréable
JimLohse

Réponses:

350

Vous pouvez utiliser la commande load-file ( M-x load-file, puis appuyez deux fois sur retour pour accepter le nom de fichier par défaut, qui est le fichier en cours de modification).

Vous pouvez également déplacer le point à la fin de n'importe quel sexp et appuyer sur C-xC-epour exécuter uniquement ce sexp. Habituellement, il n'est pas nécessaire de recharger le fichier entier si vous changez simplement une ligne ou deux.

Bryan Oakley
la source
22
Gardez à l'esprit que cela ne fait pas toujours exactement ce que vous pensez. Si vous avez des variables dont le contenu est floppé (c'est-à-dire en définissant un booléen à l'opposé), le comportement ne sera pas le même que le chargement du fichier.
chollida
4
Tous les effets secondaires en général sont susceptibles de casser le comportement souhaité: chargement de fichiers, etc.
vemv
Lorsque je fais cela, j'obtiens le message: chargement avec conversion de code: la valeur du symbole en tant que variable est nulle: n
Chris Marie
2
Au lieu de déplacer le point derrière un defunou defvar, vous pouvez également le laisser à l'intérieur du corps et du type de déclaration C-M-x. Très utile.
Thomas
151

Très étrange que le très pratique

M-x eval-buffer

n'est pas mentionné ici.

Il évalue immédiatement tout le code dans le tampon, c'est la méthode la plus rapide, si votre .emacsest idempotent.

Peter
la source
3
Qui a dit que .emacsc'était (ou devait être) idempotent?
Mike
@mike: pas moi. «Étant donné a, b est vrai» signifiait pour moi, «si a, b est vrai», mais je peux voir ce que vous voulez dire. Je change donné à if pour plus de clarté.
Peter
7
@mike: Quand serait-il judicieux de .emacsne pas être idempotent?
Zaz
J'aurais pensé que c'était la première suggestion.
Stryker
1
Je ne dirais pas que c'est un bon style mais cela pourrait arriver. Par exemple, vous pouvez choisir de ne pas redéfinir une fonction si elle est déjà définie (dès le premier démarrage). Vous ne verrez peut-être pas de changement dans sa définition lors de l'évaluation de votre fichier init.
Kaligule
43

Vous pouvez généralement simplement réévaluer la région modifiée. Marquez la région de ~ / .emacs que vous avez modifiée, puis utilisezM-x eval-region RET . C'est souvent plus sûr que de réévaluer le fichier entier car il est facile d'écrire un fichier .emacs qui ne fonctionne pas tout à fait après avoir été chargé deux fois.

Dale Hagglund
la source
2
Intéressant. Je n'avais pas envisagé l'idée d'un fichier .emacs qui n'était pas idempotent. Quelque chose à surveiller lorsque je commence avec ELisp
Erik
2
Je suppose qu'il est rare de trouver un fichier .emacs qui est idempotent, au moins dans le sens fort de deux exécutions résultant exactement dans le même état qu'une exécution. À tout le moins, il est assez courant de les ajouter à diverses listes, souvent de manière à ne pas supprimer les entrées en double lors de leur deuxième exécution.
Dale Hagglund
1
Une autre pensée: en utilisant l'approche que je suggère ci-dessus, il est possible que l'état emacs que vous avez ne soit pas ce que fait réellement votre .emacs. C'est-à-dire, puisque vous n'avez pas exécuté l'intégralité du fichier .emacs à partir d'une table rase, vous ne savez pas réellement qu'il fait ce que vous voulez.
Dale Hagglund
1
Cela étant dit, ne serait-il pas possible d'écrire .emacs de manière idempotente? L'état mondial est capricieux.
Ehtesh Choudhury
39

Si vous avez ouvert votre fichier .emacs dans le tampon actuellement actif:

Mx eval-buffer
Dominic Rodger
la source
12
Une chose à savoir ici est que cela peut ne pas vous laisser dans un état identique à une approche de redémarrage. (Exemple artificiel: si vous aviez un effet "bascule" dans votre .emacs).
luapyad
28
M-x load-file
~/.emacs
digitaldreamer
la source
1
Ce faisant, j'ai appris que sur mon installation de Windows 7, le dossier .emacs.d se trouvait dans le dossier% appdata% au lieu du dossier de départ des utilisateurs.
Bassdrop Cumberwubwubwub
14

Ce qui suit devrait le faire ...

M-x load-file
Rythme
la source
13

Solution

M-: (load user-init-file)


Remarques

  • vous le tapez à l' Eval:invite (y compris les parenthèses)
  • user-init-fileest une variable contenant la ~/.emacsvaleur (pointant vers le chemin du fichier de configuration) par défaut
  • (load) est une version plus courte, plus ancienne et non interactive de (load-file) ; ce n'est pas une commande emacs (à taper M-x) mais une simple fonction elisp

conclusion

M-: > M-x


la source
est M-:> Ctrl Alt x? basé sur votre logique j'imagine M-: <CMx quand une seule ligne dans le fichier init est modifiée? C'est peut-être juste ==
Robert Houghton
12

D'autres ont déjà répondu à votre question comme indiqué, mais je trouve que je veux généralement exécuter les lignes que je viens d'écrire. pour cela, CtrlAltxdans le lisp fonctionne très bien.

Bahbar
la source
3
Voir aussi eval-lastsexp, àC-x C-e
Derek Slager
Avec C-M-x, vous n'avez pas besoin d'être "à la fin du lisp" - pensez-vous C-x C-epeut-être? Ce qui est bien, C-M-xc'est que vous pouvez l'invoquer même lorsque le point est au milieu d'une déclaration de fonction / variable.
Thomas
J'ai probablement pris l'habitude d'aller en fin de lisp à l'époque où je n'utilisais que du Cx Ce. Merci pour la capture!
Bahbar
9

Je suggère que vous ne fassiez pas cela au départ. Au lieu de cela, démarrez une nouvelle session emacs et testez toutes les modifications que vous avez apportées pour voir si elles fonctionnent correctement. La raison pour procéder de cette manière est d'éviter de vous laisser dans un état où vous avez un fichier .emacs inutilisable, qui ne se charge pas ou ne se charge pas proprement. Si vous effectuez toutes vos modifications dans la session d'origine et tous vos tests dans une nouvelle session, vous aurez toujours quelque chose de fiable pour commenter le code incriminé.

Lorsque vous êtes enfin satisfait de vos modifications, allez-y et utilisez l'une des autres réponses pour recharger. Personnellement, je préfère evalsimplement la section que vous avez ajoutée / modifiée, et pour ce faire, mettez simplement en évidence la région du code ajouté / modifié et appelez M-x eval-region. Faire cela minimise le code évalué, minimisant tout effet secondaire involontaire, comme le souligne luapyad.

Joe Casadonte
la source
9

Raccourci clavier:

(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
la source
brillant! C'est très bien!
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
la source
4

Je suis actuellement sur Ubuntu 15.04; J'aime définir une clé pour cela.
[M-insert] se traduit par alt-insert sur mon clavier.
Mettez ceci dans votre fichier .emacs:

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

Définissez-le dans votre fichier init et appelez par Mx reload-user-init-file

(defun reload-user-init-file()
  (interactive)
  (load-file user-init-file))
jacekmigacz
la source
2

Bien que M-x eval-buffercela fonctionne, vous pouvez rencontrer des problèmes avec les bascules et autres choses similaires. Une meilleure approche pourrait être de "marquer" ou de mettre en évidence ce qui est nouveau dans votre .emacs (ou même un tampon de travail si vous ne faites que jouer), puis M-x eval-region. J'espère que cela t'aides.

user1026139
la source
2

Voici un moyen rapide et facile de tester rapidement votre configuration. Vous pouvez également utiliser C-x C-eà la fin du lisp spécifique pour exécuter certaines fonctions individuellement.

Cx Ce exécute la commande eval-last-sexp (trouvée dans global-map), qui est une fonction Lisp interactive compilée.

Il est lié à Cx Ce.

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

Évaluer sexp avant le point; valeur d'impression dans la zone d'écho. De manière interactive, avec l'argument préfixe, imprimer la sortie dans le tampon actuel.

Normalement, cette fonction tronque la sortie longue en fonction de la valeur des variables «eval-expression-print-length» et «eval-expression-print-level». Avec un argument de préfixe de zéro, cependant, il n'y a pas une telle troncature. Un tel argument de préfixe entraîne également l'impression d'entiers dans plusieurs formats supplémentaires (octal, hexadécimal et caractère).

Si «eval-expression-debug-on-error» n'est pas nul, ce qui est la valeur par défaut, cette commande organise toutes les erreurs pour entrer dans le débogueur.

Lorem Ipsum Dolor
la source
2

À côté des commandes comme Mx eval-buffer ou Mx load-file, vous pouvez redémarrer un nouveau emacs à partir de la ligne de commande:

emacs -q --load "init.el"

Exemple d'utilisation stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/

Picaud Vincent
la source
La question demande comment procéder sans redémarrer Emacs. Lancer une nouvelle copie, tout en répondant techniquement à la question, ne semble pas correspondre à l'esprit de la question. 😄
chwarr
0

Vous pouvez définir une liaison de clé pour emacs comme celui-ci

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

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

J'espère que cela vous aidera!

Vinh Trieu
la source
-2

S'il vous arrive d'avoir un shell ouvert dans Emacs, vous pouvez également faire:

. ~/.emacs

Peut enregistrer quelques frappes clés.

benjaminz
la source