色々パッケージ入れてると、なぜか変数がよく分からない値になってる事がたまにある。そんな時は debug-on-variable-change
や add-variable-watcher
を使うと調べる事ができる。
Info から引用:
https://ayatakesi.github.io/lispref/29.2/elisp-ja.html#Variable-Debugging
Command: debug-on-variable-change variable
この関数はvariableの変更時に常にデバッガが呼び出されるようにアレンジする。
https://ayatakesi.github.io/lispref/29.2/elisp-ja.html#Watching-Variables
Function: add-variable-watcher symbol watch-function
この関数はsymbolが変化したときは常にwatch-functionが呼び出されるようにアレンジする。エイリアスを介した変更にも同じ効果をもつ(変数のエイリアスを参照)。
条件無しでいいなら debug-on-variable-change
が手軽。何か条件を付けたいなら add-variable-watcher
がよさげ。
add-variable-watcher
の例はこんな感じ:
(defun variable-watcher (symbol newval operation where)
(when (and (string= (buffer-name where) "main.go") (= newval 2))
(backtrace)
(message "variable event: %s" (list symbol newval operation where))
(backtrace)))
;; 登録
(add-variable-watcher 'tab-width 'variable-watcher)
;; 解除
(remove-variable-watcher 'tab-width 'variable-watcher)
どちらも Emacs 26 で導入されたものらしい。知らなかった。
when a symbol's value is changed. This is used to implement the new debugger command 'debug-on-variable-change'.
ちなみに僕の場合は editorconfig が変えていたのでした。