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 defvarvariables de enlace.
No quiero llamar eval-defun( C-M-x) manualmente en cada formulario de nivel superior. ¿ M-x eval-bufferRespeto defvar/ defcustom?

(unload-feature 'myname)primero?eval-defun, no detecta los cambiosdefvar.defvars en un archivo o búfer, si lo entiendo correctamente.load-fileimplica 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-bufferetc.Cuando lo use
require,load-libraryetc. 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-defunmientras escribes un código nuevo para no entrar en estados intermedios.fuente
(info "(elisp) Loading"),(info "(elisp) Unloading")yunload-featurerequierenforcearg si la biblioteca es dependencia de otra biblioteca. ¡Gran respuesta! Me pregunto qué versión de Emacs comenzará a proporcionar descarga ...defvarno reasigna el valor de una variable de la misma manera que, digamossetqosetf. Una vez que una variable tiene un valor,defvarno lo toca.De
defvarla cadena de documentos:Como presumiblemente
defvareditó 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, puedeuninternusar los símbolos para que losdefvars no los encuentren al recargar:fuente
defvares lo correcto para usar.setqpodría personalizar las personalizaciones establecidas por usuarios individuales. OP está pidiendo una forma de forzar la sobrescritura dedefvarvariables durante el desarrollo del paquete . Cambiar asetqrequeriría volver adefvarcuando se lanza el paquete.defvares apropiado para el desarrollo de paquetes. Solo estoy señalando quedefvarno reasigna valores, mientras que losetqhace.Prueba esto:
Eso solo usa el mismo código que
eval-defunusa en undefvar. Atraviesa el búfer (o su restricción al reducirse), deteniéndose en cada unodefvary usando eleval-defuncó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-2implementació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,
defvarpero es difícil entender completamente el código.También pienso en
uninterntodos 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