Estoy desarrollando una biblioteca y me gustaría volver a cargarla después de editarla sin salir de Emacs (suponga que está encendida load-path
):
(load-library "myname")
Cuando hago esto, Emacs no recoge los cambios en las defvar
variables de enlace.
No quiero llamar eval-defun
( C-M-x) manualmente en cada formulario de nivel superior. ¿ M-x eval-buffer
Respeto defvar
/ defcustom
?
(unload-feature 'myname)
primero?eval-defun
, no detecta los cambiosdefvar
.defvar
s en un archivo o búfer, si lo entiendo correctamente.load-file
implica que quiere evaluar todo el archivo mientras se asegura de que los defvars sean reevaluados.Respuestas:
(progn (unload-feature 'your-lib) (load-library "your-lib"))
Esto funcionará siempre que cargue los defvars por primera vez al cargar la biblioteca a través de emacs, y no usar
eval-defun
,eval-buffer
etc.Cuando lo use
require
,load-library
etc. Emacs hará un seguimiento de las variables y funciones que forman parte de su biblioteca, y las eliminará por completo cuando las useunload-feature
.Al escribir paquetes, encuentro que usar el código anterior es una mejor solución que ejecutarlo
eval-defun
mientras escribes un código nuevo para no entrar en estados intermedios.fuente
(info "(elisp) Loading")
,(info "(elisp) Unloading")
yunload-feature
requierenforce
arg si la biblioteca es dependencia de otra biblioteca. ¡Gran respuesta! Me pregunto qué versión de Emacs comenzará a proporcionar descarga ...defvar
no reasigna el valor de una variable de la misma manera que, digamossetq
osetf
. Una vez que una variable tiene un valor,defvar
no lo toca.De
defvar
la cadena de documentos:Como presumiblemente
defvar
editó las variables en cuestión para darles valores cuando cargó la biblioteca por primera vez, volver a cargar la biblioteca no cambiará los valores.Consulte también el nodo manual elisp sobre Definición de variables globales .
En lugar de confiar en
defvar
, siempre puede reasignar valores consetq
. Como opción alternativa, torpe, puedeunintern
usar los símbolos para que losdefvar
s no los encuentren al recargar:fuente
defvar
es lo correcto para usar.setq
podría personalizar las personalizaciones establecidas por usuarios individuales. OP está pidiendo una forma de forzar la sobrescritura dedefvar
variables durante el desarrollo del paquete . Cambiar asetq
requeriría volver adefvar
cuando se lanza el paquete.defvar
es apropiado para el desarrollo de paquetes. Solo estoy señalando quedefvar
no reasigna valores, mientras que losetq
hace.Prueba esto:
Eso solo usa el mismo código que
eval-defun
usa en undefvar
. Atraviesa el búfer (o su restricción al reducirse), deteniéndose en cada unodefvar
y usando eleval-defun
código en él.fuente
Después de escuchar que no hay una solución conveniente para la reevaluación del búfer con la reasignación de
defvar
's, hice una función simple que se transmite eneval-defun
:Estructura de código inspirada en la
eval-defun-2
implementación. Es similar a ¿Cómo fuerzo la reevaluación de un defvar? solución.Originalmente, quiero que la función de alto nivel vuelva a evaluar la biblioteca que se reinstaló a través del script de compilación, por lo que:
La solución Drew funciona incluso en anidados,
defvar
pero es difícil entender completamente el código.También pienso en
unintern
todos los símbolos basados en el prefijo / expresión regular de símbolos (como sugirió Dan ) pero soy flojo para escribir prefijos cada vez ... Vea ¿Cómo puedo desvincular todas las definiciones de símbolos con un prefijo determinado?fuente