Je suis en train de développer une bibliothèque et je voudrais la recharger après avoir édité sans quitter Emacs (supposons qu'elle soit allumée load-path
):
(load-library "myname")
Lorsque je fais cela, Emacs ne defvar
détecte pas les modifications apportées aux variables liées.
Je ne veux pas appeler eval-defun
( C-M-x) manuellement sur chaque formulaire de niveau supérieur. Est -ce que le M-x eval-buffer
respect defvar
/ defcustom
?
(unload-feature 'myname)
abord?eval-defun
cela, il ne détecte pas de changementsdefvar
.defvar
s dans un fichier ou un tampon, si je comprends bien.load-file
implique qu'il veut évaluer l'ensemble du fichier tout en s'assurant que les defvars sont réévalués.Réponses:
(progn (unload-feature 'your-lib) (load-library "your-lib"))
Cela fonctionnera tant que vous aurez chargé les defvars pour la première fois en chargeant la bibliothèque via emacs, sans l'utiliser
eval-defun
,eval-buffer
etc.Lorsque vous utilisez
require
,load-library
etc. Emacs gardera une trace des variables et des fonctions qui font partie de votre bibliothèque, et les supprimera entièrement pour vous lorsque vous utilisezunload-feature
.Lors de l'écriture de packages, je trouve que l'utilisation du code ci-dessus est une meilleure solution que l'exécution
eval-defun
lorsque vous écrivez du nouveau code afin de ne pas entrer dans des états intermédiaires.la source
(info "(elisp) Loading")
,(info "(elisp) Unloading")
Etunload-feature
exigerforce
arg si la bibliothèque est la dépendance à une autre bibliothèque. Très bonne réponse! Je me demande quelle version d'Emacs commence à fournir le déchargement ...defvar
ne réaffecte pas la valeur d'une variable de la même manière que, disonssetq
ousetf
. Une fois qu'une variable a une valeur,defvar
ne la touchez pas.Du
defvar
docstring de:Comme vous avez probablement
defvar
édité les variables en question pour leur donner des valeurs lors du premier chargement de la bibliothèque, le rechargement de la bibliothèque ne changera pas les valeurs.Voir aussi le nœud manuel elisp sur la définition des variables globales .
Au lieu de vous fier à
defvar
, vous pouvez toujours réaffecter des valeurs avecsetq
. Comme alternative, une option maladroite, vous pouvezunintern
les symboles afin que lesdefvar
s ne les trouvent pas lors du rechargement:la source
defvar
est la bonne chose à utiliser.setq
encombrerait les personnalisations définies par les utilisateurs individuels. OP demande un moyen de forcer l'écrasement desdefvar
variables pendant le développement du paquet . Passer àsetq
nécessiterait de revenir à ladefvar
date de publication du package.defvar
pour le développement de paquets. Je souligne seulement quedefvar
cela ne réattribue pas les valeurs, alors que lesetq
fait.Essaye ça:
Cela utilise simplement le même code que celui
eval-defun
utilisé sur undefvar
. Il traverse le tampon (ou sa restriction en se rétrécissant), s'arrêtant à chacundefvar
et utilisant leeval-defun
code dessus.la source
Après avoir entendu qu'il n'y a pas de solution pratique pour réévaluer le tampon avec la réaffectation de
defvar
, j'ai fait une fonction simple qui repose sureval-defun
:Structure de code inspirée de l'
eval-defun-2
implémentation. Il est similaire à Comment puis-je forcer la réévaluation d'un defvar? Solution.À l'origine, je veux que la fonction de haut niveau réévalue la bibliothèque qui a été réinstallée via le script de construction afin:
La solution Drew fonctionne même sur imbriqué,
defvar
mais il est difficile de comprendre complètement le code.Je pense aussi à
unintern
tous les symboles basés sur le préfixe / l'expression régulière des symboles (comme Dan l'a suggéré) mais je suis paresseux de taper le préfixe à chaque fois ... Voir Comment puis-je dissocier toutes les définitions de symboles avec un certain préfixe?la source