Estou desenvolvendo uma biblioteca e gostaria de recarregá-la após a edição sem sair do Emacs (suponha que esteja ativado load-path
):
(load-library "myname")
Quando faço isso, o Emacs não defvar
capta as alterações nas variáveis de saída.
Não quero chamar eval-defun
( C-M-x) manualmente em cada formulário de nível superior. Será que M-x eval-buffer
o respeito defvar
/ defcustom
?
(unload-feature 'myname)
primeiro?eval-defun
dele não capta mudançasdefvar
.defvar
s em um arquivo ou buffer, se bem entendi.load-file
implica que ele deseja avaliar o arquivo inteiro e garantir que os defvars sejam reavaliados.Respostas:
(progn (unload-feature 'your-lib) (load-library "your-lib"))
Isso funcionará desde que você carregue os defvars pela primeira vez carregando a biblioteca no emacs, e não usando
eval-defun
,eval-buffer
etc.Quando você usa
require
,load-library
etc. O Emacs monitora quais variáveis e funções fazem parte da sua biblioteca e as remove totalmente para você quando você usaunload-feature
.Ao escrever pacotes, acho que usar o código acima é uma solução melhor do que executar
eval-defun
quando você escreve um novo código para não entrar em estados intermediários.fonte
(info "(elisp) Loading")
,(info "(elisp) Unloading")
Eunload-feature
exigemforce
arg se biblioteca é de dependência para outra biblioteca. Ótima resposta! Eu estou querendo saber qual é a versão Emacs começar a fornecer descarga ...defvar
não reatribui o valor de uma variável da mesma maneira que, digamos,setq
ousetf
. Depois que uma variável tiver um valor,defvar
ela não será tocada.Da
defvar
documentação de:Como você presumivelmente
defvar
editou as variáveis em questão para fornecer valores a elas quando você carregou a biblioteca, recarregar a biblioteca não alterará os valores.Consulte também o nó manual elisp em Definindo variáveis globais .
Em vez de confiar
defvar
, você sempre pode reatribuir valores comsetq
. Como opção alternativa e desajeitada, você podeunintern
usar os símbolos para que osdefvar
s não os encontrem ao recarregar:fonte
defvar
é a coisa correta a ser usada.setq
usaria personalizações definidas por usuários individuais. O OP está pedindo uma maneira de forçar a substituição dedefvar
variáveis durante o desenvolvimento do pacote . Mudar parasetq
exigiria voltar paradefvar
quando o pacote for lançado.defvar
é apropriado para o desenvolvimento de pacotes. Estou apenas apontando quedefvar
não reatribui valores, enquanto osetq
faz.Tente o seguinte:
Isso apenas usa o mesmo código que
eval-defun
usa em umdefvar
. Ele atravessa o buffer (ou sua restrição estreitando), parando em cada umdefvar
e usando oeval-defun
código nele.fonte
Depois que ouvi dizer que não há uma solução conveniente para a reavaliação do buffer com a reatribuição de
defvar
funções que fiz simples, que se baseiam emeval-defun
:Estrutura de código inspirada na
eval-defun-2
implementação. É semelhante a Como forço a reavaliação de um defvar? solução.Originalmente, quero que a função de alto nível reavalie a biblioteca que foi reinstalada por meio do script de construção, para:
A solução Drew funciona mesmo em aninhados,
defvar
mas é difícil entender completamente o código.Também penso em
unintern
todos os símbolos com base no prefixo / regex de símbolos (como Dan sugeriu), mas estou com preguiça de digitar o prefixo toda vez ... Consulte Como posso desassociar todas as definições de símbolos com um determinado prefixo?fonte