Как начинающий Emacs, я работаю над написанием второстепенного режима. Мой текущий (наивный) метод программирования elisp состоит из внесения изменений, закрытия Emacs, перезапуска Emacs и наблюдения за изменением. Как я могу оптимизировать этот процесс? Есть ли команда обновить все?
Как я могу легко перезагрузить Emacs lisp код, когда я его редактирую?
Ответ 1
Вы можете попробовать использовать M-C-x (eval-defun
), который будет переоценивать форму верхнего уровня вокруг точки. В отличие от M-x eval-buffer или C-x C-e (exal-last-sexp
), это будет reset переменные, объявленные с defvar
и defcustom
, к их начальным значениям, что может привести к отключению.
Ответ 2
Также попробуйте C-u C-M-x
, который оценивает определение в точке и устанавливает там точку останова, поэтому вы попадаете в отладчик при нажатии этой функции.
M-x ielm
также очень полезен как более функциональный Lisp REPL при разработке кода Emacs.
Ответ 3
M-x eval-buffer должен делать это.
Ответ 4
Все зависит от того, что вы пишете и как вы его написали. Переключение режима должно привести к новому поведению. Если вы используете [define-minor-mode][1]
, вы можете добавить код в тело макроса, который отключает переменную режима:
(define-minor-mode my-minor-mode
"doc string"
nil
""
nil
(if my-minor-mode
(progn
;; do something when minor mode is on
)
;; do something when minor mode is off
)
Но, еще один способ быстро проверить это, - это создать новый Emacs из существующего:
M-x shell-command emacs&
Ответ 5
Шон сказал. Кроме того, я (eval-defun)
связан с ключом вместе с тестом. Затем цикл разработки становится: 1) редактировать функцию, 2) нажимать клавишу eval-test, 3) наблюдать результаты, 4) повторять. Это очень быстро.
Во время разработки я пишу тест, привязываю его к jmc-test
, затем использую вышеуказанный ключ, чтобы запустить его на моей только что отредактированной функции. Я редактирую больше, а затем снова нажимаю клавишу, снова проверяя его. Когда функция работает, я zap jmc-test
, редактирую другую функцию и записываю другую функцию jmc-test. Они почти всегда являются одной строкой кода, поэтому легко просто ударить.
(defun jmc-eval-and-test ()
(interactive)
(eval-defun nil)
(jmc-test))
(define-key emacs-lisp-mode-map (kbd "<kp-enter>") 'jmc-eval-and-test)
(when t
(defun myfunc (beer yum)
(+ beer yum))
(defun jmc-test () (message "out: %s" (myfunc 1 2))))
При редактировании "myfunc", если я нахожу клавиатуру, введите "out: 3".
Ответ 6
Я просто определяю функцию ldf (short для load-file) в моем файле .emacs, например:
(defun ldf (arg) (интерактивный "P" ) (load-file (buffer-file-name)))
Как вы можете видеть, эта небольшая функция ищет имя текущего буфера и загружает файл. Всякий раз, когда мне нужно перезагрузить текущий буферный файл elisp, просто введите "M-x ldf"