在hook中访问buffer-local变量

请问如何在各种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)))

你说的对。这里 有关于在 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变量就把时序搞成鸡蛋蛋鸡搞不清了。