¿Cómo puedo recargar .emacs después de cambiarlo?

375

¿Cómo puedo hacer que Emacs vuelva a cargar todas mis definiciones que he actualizado .emacssin reiniciar Emacs?

Yazz.com
fuente
18
Sé que emacs a menudo se considera un sistema operativo, pero ... s / reboot / restart /?
William Pursell
66
No soy un desarrollador, por lo que muchas de las respuestas que tienen sentido de inmediato para los desarrolladores no significan mucho para mí
Yazz.com
44
@MJB el propósito de Stack Overflow es ser un depósito de conocimiento para incluso las preguntas más básicas. Esta pregunta encaja perfectamente con el propósito de Stack Overflow. Consulte stackoverflow.com/faq
chollida el
55
posible duplicado de stackoverflow.com/questions/2281593/…
Trey Jackson
10
jaja ahora, cinco años después, la sugerencia de "Búsqueda de Google primero" lleva aquí. agradable
JimLohse

Respuestas:

350

Puede usar el comando load-file ( M-x load-file, luego presione Intro dos veces para aceptar el nombre de archivo predeterminado, que es el archivo actual que se está editando).

También puede mover el punto al final de cualquier sexp y presionar C-xC-epara ejecutar solo ese sexp. Por lo general, no es necesario volver a cargar todo el archivo si solo está cambiando una o dos líneas.

Bryan Oakley
fuente
22
Tenga en cuenta que esto no siempre puede hacer exactamente lo que cree que hace. Si tiene variables cuyos contenidos son flops (es decir, establecer un valor booleano en su lado opuesto), entonces el comportamiento no será el mismo que cargar el archivo.
chollida
44
Es probable que cualquier efecto secundario en general rompa el comportamiento deseado: cargar archivos, etc.
vemv
Cuando hago esto, recibo el mensaje: carga con conversión de código: el valor del símbolo como variable es nulo: n
Chris Marie
2
En lugar de mover el punto detrás de un defuno defvar, también puede dejarlo dentro del cuerpo y el tipo de declaración C-M-x. Muy útil.
Thomas
151

Muy extraño que lo muy conveniente

M-x eval-buffer

No se menciona aquí.

Inmediatamente evalúa todo el código en el búfer, es el método más rápido, si su .emacses idempotente.

Peter
fuente
3
¿Quién dice que .emacses (o tiene que ser) idempotente?
Mike
@ Mike: yo no. "Dado a, b es verdadero" significaba para mí, "si a, b es verdadero", pero puedo ver lo que quieres decir. Cambio dado a si para más claridad.
Peter
77
@mike: ¿Cuándo tendría sentido .emacsno ser idempotente?
Zaz
Hubiera pensado que esta sería la primera sugerencia.
Stryker
1
No diría que es un buen estilo, pero podría suceder. Por ejemplo, podría elegir no redefinir una función si ya está definida (desde el primer inicio). Es posible que no vea un cambio en su definición al evaluar su archivo init.
Kaligule
43

Por lo general, puede volver a evaluar la región modificada. Marque la región de ~ / .emacs que ha cambiado y luego úsela M-x eval-region RET. Esto suele ser más seguro que reevaluar todo el archivo, ya que es fácil escribir un archivo .emacs que no funciona del todo después de cargarlo dos veces.

Dale Hagglund
fuente
2
Interesante. No había considerado la idea de un archivo .emacs que no fuera idempotente. Algo a tener en cuenta cuando empiezo con ELisp
Erik
2
Supongo que es raro encontrar un archivo .emacs que sea idempotente, al menos en el sentido estricto de dos ejecuciones que dan como resultado exactamente el mismo estado que una ejecución. Por lo menos, es bastante común agregar a varias listas, a menudo de manera que no supriman las entradas duplicadas cuando se ejecutan por segunda vez.
Dale Hagglund
1
Otro pensamiento: usando el enfoque que sugiero anteriormente, es posible que el estado de emacs que tienes no sea lo que tus .emacs realmente hacen. Es decir, dado que no ha ejecutado todo el archivo .emacs desde una pizarra limpia, en realidad no sabe que hace lo que desea.
Dale Hagglund
1
Dicho esto, ¿no sería posible escribir .emacs de una manera idempotente? El estado global es asqueroso.
Ehtesh Choudhury
39

Si tiene abierto su archivo .emacs en el búfer activo actualmente:

Mx eval-buffer
Dominic Rodger
fuente
12
Una cosa a tener en cuenta aquí es que hacer esto puede no dejarlo en un estado idéntico a un enfoque de reinicio. (Ejemplo contribuido: si tuvo un efecto de "alternar" en sus .emacs).
luapyad
28
M-x load-file
~/.emacs
soñador digital
fuente
1
Al hacer esto, aprendí que en mi instalación de Windows 7, la carpeta .emacs.d estaba ubicada en la carpeta% appdata% en lugar de la carpeta de inicio de los usuarios.
Bassdrop Cumberwubwubwub
14

Lo siguiente debería hacerlo ...

M-x load-file
Paso
fuente
13

solución

M-: (load user-init-file)


notas

  • lo escribe en el Eval:indicador (incluidos los paréntesis)
  • user-init-filees una variable que contiene el ~/.emacsvalor (que apunta a la ruta del archivo de configuración) de forma predeterminada
  • (load)es una versión más corta, antigua y no interactiva de (load-file); no es un comando emacs (para escribir M-x) sino una mera función elisp

conclusión

M-: > M-x


fuente
es M-:> Ctrl Alt x? basado en su lógica, me imagino M-: <CMx cuando solo se cambia una línea en el archivo de inicio. Tal vez sea solo ==
Robert Houghton
12

Otros ya respondieron su pregunta como se indicó, pero creo que generalmente quiero ejecutar las líneas que acabo de escribir. para eso, CtrlAltxen el lisp funciona bien.

Bahbar
fuente
3
Ver también eval-lastsexp, enC-x C-e
Derek Slager
Con C-M-x, no tienes que estar "al final del ceceo", ¿estás pensando C-x C-equizás? Lo bueno de esto C-M-xes que puede invocarlo incluso cuando el punto está en el medio de una declaración de función / variable.
Thomas
Probablemente tuve la costumbre de terminar el ceceo en el momento en que solo usaba Cx Ce. Gracias por la captura!
Bahbar
9

Sugiero que no hagas esto, inicialmente. En su lugar, inicie una nueva sesión de emacs y pruebe los cambios que realizó para ver si funcionan correctamente. La razón para hacerlo de esta manera es evitar dejarlo en un estado en el que tenga un archivo .emacs inoperable, que no se carga o no se carga de manera limpia. Si realiza toda su edición en la sesión original y todas sus pruebas en una nueva sesión, siempre tendrá algo confiable para comentar el código ofensivo.

Cuando finalmente esté satisfecho con sus cambios, continúe y use una de las otras respuestas para volver a cargar. Mi preferencia personal es evalsolo la sección que ha agregado / cambiado, y para hacer eso solo resalte la región del código agregado / cambiado y llame M-x eval-region. Hacer eso minimiza el código que se evalúa, minimizando los efectos secundarios no intencionales, como señala luapyad.

Joe Casadonte
fuente
9

Atajo de teclado:

(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
fuente
¡brillante! ¡Esto es muy bueno!
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
SabiduríaFusión
fuente
4

Actualmente estoy en Ubuntu 15.04; Me gusta definir una clave para esto.
[M-insert] se traduce en alt-insert en mi teclado.
Ponga esto en su archivo .emacs:

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

Defínalo en tu archivo init y llama por Mx reload-user-init-file

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

Aunque M-x eval-bufferfuncionará, puede tener problemas con los conmutadores y otras cosas similares. Un mejor enfoque podría ser "marcar" o resaltar lo nuevo en sus .emacs (o incluso eliminar el búfer si solo está jugando) y luego M-x eval-region. Espero que esto ayude.

usuario1026139
fuente
2

Aquí hay una manera rápida y fácil de probar rápidamente su configuración. También puede usar C-x C-eal final de lisp específico para ejecutar ciertas funciones individualmente.

Cx Ce ejecuta el comando eval-last-sexp (que se encuentra en global-map), que es una función interactiva de Lisp compilada.

Está vinculado a Cx Ce.

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

Evaluar sexp antes del punto; Valor de impresión en el área de eco. Interactivamente, con argumento de prefijo, imprime la salida en el búfer actual.

Normalmente, esta función trunca la salida larga de acuerdo con el valor de las variables 'eval-expression-print-length' y 'eval-expression-print-level'. Sin embargo, con un argumento prefijo de cero, no existe tal truncamiento. Tal argumento de prefijo también hace que se impriman enteros en varios formatos adicionales (octal, hexadecimal y carácter).

Si 'eval-expression-debug-on-error' no es nulo, que es el valor predeterminado, este comando organiza todos los errores para ingresar al depurador.

Lorem Ipsum Dolor
fuente
2

Además de comandos como Mx eval-buffer o Mx load-file , puede reiniciar un emacs nuevo desde la línea de comandos:

emacs -q --load "init.el"

Ejemplo de uso stackoverflow.com/questions/44959535/company-backends-in-gnu-emacs/

Picaud Vincent
fuente
La pregunta pregunta cómo hacer esto sin reiniciar Emacs. Lanzar una nueva copia, aunque técnicamente responde la pregunta, no parece encajar en el espíritu de la pregunta. 😄
chwarr
0

Puede configurar la combinación de teclas para emacs como este

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

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

Espero que esto ayude!

Vinh Trieu
fuente
-2

Si tiene un shell abierto dentro de Emacs, también puede hacer:

. ~/.emacs

Puede guardar algunos golpes de tecla.

benjaminz
fuente