Skip to content

Latest commit

 

History

History
78 lines (65 loc) · 2.86 KB

1410011053.eval-defun-or-trace-function.org

File metadata and controls

78 lines (65 loc) · 2.86 KB

【デバッグの友】現在位置のEmacs Lisp関数をトレースする超簡単な方法!

Emacs Lispをデバッグしていて、特定の関数の引数と返り値を トレースしたくなることはよくあります。

そのときは標準添付の trace.el を使います。

M-x trace-function で、トレースする関数と トレース結果を出力するバッファを指定します。

その後で対象関数を呼び出すと、 トレース結果のバッファが ポップアップします。

トレースをやめるには M-x untrace-functionM-x untrace-all を使います。

しかし、これらのコマンドはわざわざ関数名を 入力する必要があるため使いづらいものです。

そこで、現在の関数(defun)を評価するC-M-xに 組み込んでしまいましょう。

元々 C-u C-M-x で現在の関数を edebug デバッガにかけることができるので、 C-u C-u C-M-xでtrace-function、 C-u C-u C-u C-M-xでuntrace-function することにしました。

トレースの詳しい使い方は 旧ブログ:デバッグの第一歩!Emacs Lisp関数をトレースする方法 を 参照してください。

(require 'cl-lib)
(defun current-defun ()
  (save-excursion
    (beginning-of-defun)
    (forward-char 1)
    (forward-sexp 2)
    (symbol-at-point)))
(defun eval-defun-or-trace-function (arg)
  "C-M-xにtrace-functionの機能をつける"
  (interactive "p")
  (cl-case arg
    (64 (untrace-function (current-defun))
        (message "untrace-function: %s" (current-defun)))
    (16 (trace-function (current-defun))
        (message "trace-function: %s" (current-defun)))
    (4 (eval-defun t))
    (t (eval-defun nil))))
(define-key emacs-lisp-mode-map (kbd "C-M-x") 'eval-defun-or-trace-function)

実行方法

$ wget http://rubikitch.com/f/141001104025.eval-defun.trace-function.el
$ emacs -Q -f package-initialize -l 141001104025.eval-defun.trace-function.el