edebug-defun
最初にdefunをマークするためのヒントを@ abo-aboに感謝します。
を有効/無効にする簡単な方法を次に示しedebug-defun
ます。これはsearch-backward-regexp
、use-package
ラッパーで定義されているかどうかにかかわらず、defunまたはdefmacroの名前を正しくedebug-instrumentまたはeval するために使用します。
;; 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))))
使用法 -関数/マクロ本体の任意の場所でポイントをmodi/toggle-edebug-defun
使用するとedebug
、そのエンティティの呼び出しが有効または無効になります。
debug-on-entry
@glucasと@Drewのおかげで、を切り替える便利な方法を用意しましたdebug-on-entry
。これも上記と同じアプローチを使用して、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)))))
使用法 -関数本体の任意の場所でポイントを使用modi/toggle-debug-defun
すると、呼び出しによってdebug-on-error
その関数のが有効またはキャンセルされます。
dummy/function
、トップレベルで(つまり、use-packageの外で)定義すると、差し迫った問題が修正されますか?名前付き関数を優先して、匿名フック関数の使用をやめ、モードフックで同様の種類の問題に対処しました。