edebug-defun
Gracias a @ abo-abo por el consejo para marcar el defun primero.
Aquí hay una forma rápida de habilitar / deshabilitar edebug-defun
. Esto se usa search-backward-regexp
para edebug-instrument o evaluar el nombre defun o defmacro correctamente, ya sea que esté definido en el use-package
contenedor o no.
;; Edebug a defun or defmacro
(defvar modi/fns-in-edebug nil
"List of functions for which `edebug' is instrumented.")
(defconst modi/fns-regexp (concat "(\\s-*"
"\\(defun\\|defmacro\\)\\s-+"
"\\(?1:\\(\\w\\|\\s_\\)+\\)\\_>") ; word or symbol char
"Regexp to find defun or defmacro definition.")
(defun modi/toggle-edebug-defun ()
(interactive)
(let (fn)
(save-excursion
(search-backward-regexp modi/fns-regexp)
(setq fn (match-string 1))
(mark-sexp)
(narrow-to-region (point) (mark))
(if (member fn modi/fns-in-edebug)
;; If the function is already being edebugged, uninstrument it
(progn
(setq modi/fns-in-edebug (delete fn modi/fns-in-edebug))
(eval-region (point) (mark))
(setq-default eval-expression-print-length 12)
(setq-default eval-expression-print-level 4)
(message "Edebug disabled: %s" fn))
;; If the function is not being edebugged, instrument it
(progn
(add-to-list 'modi/fns-in-edebug fn)
(setq-default eval-expression-print-length nil)
(setq-default eval-expression-print-level nil)
(edebug-defun)
(message "Edebug: %s" fn)))
(widen))))
Uso : con el punto en cualquier lugar de la función / cuerpo de macro, la llamada modi/toggle-edebug-defun
habilitará o deshabilitará edebug
esa entidad.
debug-on-entry
Gracias a @glucas y @Drew, he preparado una forma conveniente de alternar debug-on-entry
. Esto también utiliza el mismo enfoque que el anterior para analizar el nombre defun / defmacro.
;; Debug on entry
(defvar modi/fns-in-debug nil
"List of functions for which `debug-on-entry' is instrumented.")
(defun modi/toggle-debug-defun ()
(interactive)
(let (fn)
(save-excursion
(search-backward-regexp modi/fns-regexp)
(setq fn (match-string 1)))
(if (member fn modi/fns-in-debug)
;; If the function is already being debugged, cancel its debug on entry
(progn
(setq modi/fns-in-debug (delete fn modi/fns-in-debug))
(cancel-debug-on-entry (intern fn))
(message "Debug-on-entry disabled: %s" fn))
;; If the function is not being debugged, debug it on entry
(progn
(add-to-list 'modi/fns-in-debug fn)
(debug-on-entry (intern fn))
(message "Debug-on-entry: %s" fn)))))
Uso : con el punto en cualquier parte del cuerpo de la función, la llamada modi/toggle-debug-defun
habilitará o cancelará la debug-on-error
función.
dummy/function
en el nivel superior (es decir, fuera de use-package) soluciona el problema inmediato? He dejado de usar funciones lambda anónimas a favor de funciones con nombre para tratar problemas similares en los ganchos de modo.use-package
contenedor se pueden depurar bien. Me gustaría envolver todo lo relacionado con el paquete X dentro(use-package X ..)
, incluidas mis funciones personalizadas relacionadas con X. Pero si edebug de esas funciones es un problema, entonces necesitaría repensar mi organización de código ...M-x report-emacs-bug
. Esté preparado para proporcionar una receta simple que comience desdeemacs -Q
.edebug-defun
depura la forma de nivel superior, que en este caso es la(use-package ...)
propia en lugar de la defun que está pasando a lause-package
macro. ¿Puedes usaredebug-on-entry
y dar el nombre de la función que has definido?debug
, noedebug
. Por ejemplo,M-x debug-on-entry
. HTH.