即使在阅读了SX上的所有文档和大量帖子之后,我也不太清楚缓冲区局部变量的所有变体。
以下是我的理解摘要:
(defvar foo ..)
为文件声明一个动态变量。但是该变量是(1)其他文件不知道的变量,除非它们也包含一条defvar
语句,并且(2)该变量的作用域是全局的,而不是局部于缓冲区的。
(make-variable-buffer-local foo)
之后,defvar
上述告诉编译器和其他人,变量foo是被当作缓冲区局部处处设置了,当它是集。因此,此模式是声明缓冲区局部变量,将两个语句背靠背放置在文件中的好样式。
(defvar xxx ...) ;declare xxx with global scope
(make-variable-buffer-local 'xxx) ;but now make it buffer-local everywhere
为了方便起见,该(defvar-local xxx ...)
表格可以用作一行,代替上面的两行:
(defvar-local xxx ...) ;make xxx buffer local everywhere
一旦如上所述声明,变量xxx就可以像setq语句中的任何其他变量一样使用。
如果我只想拥有一个已经是全局动态变量的局部缓冲区变量的实例,则可以使用以下声明。第一个声明全局变量动态变量,第二个语句仅在当前缓冲区中创建该变量的本地缓冲区版本的一个实例:
(defvar xxx ...) ;declare xxx with global scope
(make-local-variable 'xxx) ;make xxx local in this buffer only
现在是我的明确问题(以上所有都是关于我的理解是否正确的隐性问题)。
设置变量的值时,可以使用setq
或
setq-local
。什么时候应该setq-local
使用?为什么?
如果我setq-local
在局部缓冲区变量或非局部缓冲区变量上使用会怎样?
声明的变量是setq-local
必需的defvar-local
吗?
将setq-local
普通defvar
声明的变量转换为局部缓冲区变量吗?(换句话说,它在setq-local
某种程度上等同于(make-variable-local xxx)
声明吗?
(setq-local VAR VALUE)
是的简写(set (make-local-variable VAR) VALUE)
,这曾经是(现在仍然是)一个惯用语。