Как я могу легко перезагрузить Emacs lisp код, когда я его редактирую?

Как начинающий Emacs, я работаю над написанием второстепенного режима. Мой текущий (наивный) метод программирования elisp состоит из внесения изменений, закрытия Emacs, перезапуска Emacs и наблюдения за изменением. Как я могу оптимизировать этот процесс? Есть ли команда обновить все?

Ответ 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"