use-packageブロックで定義された関数をどのように編集するのですか?


7

これは問題を示すための最低限の実例であり、use-packageパッケージをインストールする必要があります。

(use-package ido
  :config
  (progn
    (defun dummy/function ()
      (interactive)
      (message "I am in the dummy function."))))

私はEdebugの計測器を追加しようとするとdummy/function使用してM-x edebug-defun、私はすでにやったかのように、それはEdebugののrightawayを開始しますM-x dummy/function。打つことでやめなければならないq。しかし、実際に実行するM-x dummy/functionと、edebugがアクティブになるのがわかりません。

use-packageedebugインストゥルメンテーションを混乱させるラッパーについて何かありますか?どうすれば修正できますか?


use-packageがどのように機能するかはわかりませんがdummy/function、トップレベルで(つまり、use-packageの外で)定義すると、差し迫った問題が修正されますか?名前付き関数を優先して、匿名フック関数の使用をやめ、モードフックで同様の種類の問題に対処しました。
タイラー

@はい、use-packageラッパーの外部で定義された関数は問題なくデバッグできます。私は、パッケージXの内部に関連するラッパーすべてに希望の(use-package X ..)私のカスタム関数Xに関連しているが、これらの機能のEdebugのが問題であるならば、私は私のコードの組織を再考する必要があるでしょう。..含め、
Kaushalモディ

探している動作が提供されるべきであるが提供されていないと思われる場合は、Emacs機能拡張リクエストを提出することを検討してくださいM-x report-emacs-bug。から始まる簡単なレシピを用意できるように準備してくださいemacs -Q
2015年

1
edebug-defunはトップレベルのフォームをデバッグすると思います。この場合は(use-package ...)use-packageマクロに渡すdefunではなく、それ自体です。edebug-on-entry定義した関数の名前を使用して与えることはできますか?
グルカ2015年

1
FWIW、私は通常のEmacsデバッガーを使用してdebugedebugます。たとえば、M-x debug-on-entry。HTH。
ドリュー

回答:


9

呼び出すedebug-defunと、トップレベルのフォーム(この場合は)がデバッグされます(use-package ...)

を使用debug-on-entryして、名前付き関数をデバッグできます。


4
  1. 適切なdefunをマークして呼び出しますC-x nnnarrow-to-region
  2. C-u C-M-xedebug-defun
  3. C-x nwwiden

物事をすばやく行うのが好きな場合、これのlispyショートカットはN xe Wです。


1
narrow-to-defunと同じ(use-package ...)形に狭まるため、これは機能しませんedebug-defun。ただし、最初にdefunをマークしてを使用すると機能しますnarrow-to-region
グルカ2015年

はい、そういう意味です。実際には使用していませんnarrow-to-defunlispyN地域を選択して呼び出しますnarrow-to-region
abo-abo 2015年

3

edebug-defun

最初にdefunをマークするためのヒントを@ abo-aboに感謝します。

を有効/無効にする簡単な方法を次に示しedebug-defunます。これはsearch-backward-regexpuse-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その関数のが有効またはキャンセルされます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.