私はいくつかの状態を保存するためにバッファローカル変数を使用するemacsメジャーモードを書いています:
(defun foo-mode ()
"My nice major mode"
(interactive)
(kill-all-local-variables)
(setq mode-name "foo")
(setq major-mode 'foo-mode)
(set (make-local-variable 'foo-state) "bar"))
(defun foo-change-state ()
(setq foo-state "baz"))
これは非常にうまく機能し、メジャー モードを使用していないバッファでは、foo-state
変数がバインドされないという特性があります (これは、シンボル テーブルが乱雑になるのを避けるため、私の意見では良いことです)。
ただし、このようなコードをバイト コンパイルすると、次の警告が生成されます。
Warning: assignment to free variable `foo-state'
を使用defvar
すると警告がなくなりますが、副作用があり、foo-state
どこにでもバインドされるようになりました。これは私の意見では望ましくありません。
すべてのバッファでモード固有の変数をバインドせずに警告を取り除く方法はありますか? それとも、これらの変数をグローバルに宣言するべきではないと思うのは間違っていますか?