Я занимаюсь разработкой библиотеки и хотел бы перезагрузить ее после редактирования, не выходя из Emacs (предположим, что она включена load-path
):
(load-library "myname")
Когда я делаю это, Emacs не воспринимает изменения связанных defvar
переменных.
Я не хочу вызывать eval-defun
( C-M-x) вручную на каждой форме верхнего уровня. Имеет ли M-x eval-buffer
уважение defvar
/ defcustom
?
(unload-feature 'myname)
сначала?eval-defun
этого не забрать изменения вdefvar
.defvar
s в файле или буфере, если я правильно понимаю.load-file
подразумевает, что он хочет оценить весь файл, убедившись, что defvars переоценены.Ответы:
(progn (unload-feature 'your-lib) (load-library "your-lib"))
Это будет работать до тех пор, пока вы сначала загрузили defvars, загрузив библиотеку через emacs, не используя
eval-defun
иeval-buffer
т.д.Когда вы используете
require
иload-library
т. Д. Emacs будет отслеживать, какие переменные и функции являются частью вашей библиотеки, и полностью удалит их при использованииunload-feature
.При написании пакетов я обнаружил, что использование приведенного выше кода является лучшим решением, чем выполнение,
eval-defun
когда вы пишете новый код, чтобы не попасть в промежуточные состояния.источник
(info "(elisp) Loading")
,(info "(elisp) Unloading")
Иunload-feature
требуютforce
Arg , если библиотека зависимости для другой библиотеки. Отличный ответ! Мне интересно, какую версию Emacs начинают обеспечивать разгрузку ...defvar
не переназначает значение переменной так же, как, скажем,setq
илиsetf
. Как только переменная имеет значение,defvar
не будет ее трогать.Из
defvar
документации:Поскольку вы предположительно
defvar
редактировали эти переменные, чтобы дать им значения при первой загрузке библиотеки, повторная загрузка библиотеки не изменит значения.См. Также узел руководства elisp по определению глобальных переменных .
Вместо того чтобы полагаться
defvar
, вы всегда можете переназначить значения с помощьюsetq
. В качестве альтернативы, неуклюжий вариант, вы можетеunintern
символы, чтобыdefvar
они не нашли их при перезагрузке:источник
defvar
это правильная вещь для использования.setq
может изменить настройки, заданные отдельными пользователями. OP запрашивает способ принудительной перезаписиdefvar
переменных во время разработки пакета . Переключение наsetq
потребует возврата обратно кdefvar
моменту выпуска пакета.defvar
подходит для разработки пакетов. Я только указываю, чтоdefvar
не переназначает значения, покаsetq
делает.Попробуй это:
Это просто использует тот же код, который
eval-defun
используется наdefvar
. Он пересекает буфер (или его ограничение сужением), останавливаясь на каждомdefvar
и используяeval-defun
код на нем.источник
После того, как я узнал, что нет удобного решения для переоценки буфера с переназначением
defvar
, я сделал простую функцию, которая включаетeval-defun
:Структура кода вдохновлена
eval-defun-2
реализацией. Это похоже на Как я могу принудительно пересмотреть defvar? решение.Первоначально я хочу, чтобы функция высокого уровня переоценила библиотеку, которая была переустановлена с помощью скрипта сборки, так:
Решение Дрю работает даже на вложенных,
defvar
но трудно полностью понять код.Я также думаю обо
unintern
всех символах, основанных на префиксе / регулярном выражении символов (как предложил Дэн ), но мне лень набирать префикс каждый раз ... См. Как я могу отменить привязку всех определений символов с определенным префиксом?источник