schwaa
1
请问如何在各种hook中正确地访问使用defvar-local定义的变量?直接访问似乎不对,得到的值是nil。
比如这段代码,
(add-hook 'window-size-change-functions
(lambda (frame)
(print pdfview-document #'external-debugging-output)))
其中的pdfview-document是使用defvar-local定义的变量,初值为nil,在执行add-hook之前已经赋了非nil值。但是当窗口大小变化时,上面的lambda打印出来的却是nil。
我目前需要在窗口大小变化之后修改某些变量,上面的问题是我在试验的时候遇到的。
buffer-local 指变量在各个 buffer 中有单独值,相互不影响。Emacs Lisp 执行得看当前 buffer 是哪一个。要访问 Buffer A 中的 pdfview-document 值,你得先保证当前 buffer 就是 Buffer A。
(add-hook 'window-size-change-functions
(defun foo (frame)
(message "=> %s at %s" (current-buffer) frame)))
schwaa
3
你说的对。这里 有关于在 lambda 中使用 local 变量更详细的说明。
(add-hook 'window-size-change-functions
`(defun foo (frame)
(when (eq (current-buffer) ,(current-buffer))
(bar ...))))
另。
hook 有先后。
有的 hook 在 buffer local 变量生效之前就调用了。
这就复杂了。楼主的需求比较奇怪。
通常是在hook里设置buffer-local变量,各个hook设置各个变量,然后所有hook跑完后,所有这些buffer-local变量对buffer的行为造成影响。
即:分成两个阶段,设置变量=》变量定义行为。
这样即使有执行顺序的问题,也只是hook的先后,只需要:保证某个hook在最后=》保证某个变量的值=》保证得到我想要的某个行为。
在hook里读buffer-local变量就把时序搞成鸡蛋蛋鸡搞不清了。