如何将“setcdr”与缓冲区局部变量一起使用



我使用setcdr时遇到的行为似乎表明它不局限于在不同缓冲区中包含相同名称的缓冲区局部变量。我尝试过使用with-current-buffer,但这并不能解决问题。

例如,buffer-Abuffer-B都包含一个名为variable-one的局部变量,该变量是cons单元,例如(overlay-string t),并且setcdr用于将cdr值设置为tnil

是否有办法确保setcdr仅限于修改缓冲区本地值?

否,列表的cdr没有缓冲区本地值。

如果两个变量指向同一列表,并且您修改了该列表,那么您将在两个变量中看到效果。

这与缓冲区局部变量无关,而是与将列表分配给变量的含义有关。

如果希望这两个变量指向不同的列表,则需要复制整个列表。

您可以使用(copy-sequence LIST)来复制列表。或者(append LIST nil)也是常见的(因为追加复制了除最后一个参数之外的所有参数)。

n.b.这些函数创建了一个新的列表结构,但列表中的仍然是原始对象。通常,这就是所需的全部内容,但如果您确实需要列表内容彼此完全独立,那么请使用copy-tree

我认为您不能,因为使用setcdr,您正在修改绑定到您声明为buffer local的变量的值。如果没有为缓冲区局部变量指定新值,则该值为其默认值。请注意,buffer-local是变量名与其值的绑定。

唯一的方法(我知道)是给缓冲区本地变量分配一个副本,然后使用setcdr。这需要在每个缓冲区中完成。

另一种选择是根本不使用setcdr,而是使用setq

(setcdr foo bar) ===> (setq foo (cons (car foo) bar))

最新更新