例如有多个 minor mode 共用一个变量, 这些 mode 不知道彼此的存在,它们在各自启用时都会设置 buffer local variable,禁用的时候销毁 buffer local variable。
那么问题来了,当 foo-mode, bar-mode 都启用了,这时禁用其中之一,buffer local variabe 被销毁,剩下的 mode 使用的就是默认变量值了。
(with-default-emacs
(defvar lvar nil)
(define-minor-mode foo-mode
"Toggle Foo mode."
:init-value nil
:lighter " Foo"
:group 'foo
(if foo-mode
(setq-local lvar t)
(kill-local-variable 'lvar)))
(define-minor-mode bar-mode
"Toggle Bar mode."
:init-value nil
:lighter " Bar"
:group 'bar
(if bar-mode
(setq-local lvar t)
(kill-local-variable 'lvar)))
(with-current-buffer (get-buffer-create "*test*")
(foo-mode)
(bar-mode)
(foo-mode -1)
lvar))
;; => nil [actual]
;; => t [expected]
是不是可以实现类似引用计数的效果,只有当最后一个使用该变量的 mode 禁用时才真正销毁?