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

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

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

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

トレースをやめるには M-x untrace-function
M-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関数をトレースする方法
参照してください。

設定 141001104025.eval-defun.trace-function.el(以下のコードと同一)

(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

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。