Emacs Lisp中setq和setq default之间的差异

Emacs Lisp中setq和setq default之间的差异,emacs,elisp,Emacs,Elisp,我有一个关于Emacs Lisp的问题。setq和setq default之间有什么区别 教程说,setq在本地缓冲区中生效,而setq default影响所有缓冲区 例如,如果我在init.el中写入(setq a-var a-vars-value),我发现在启动Emacs并打开新缓冲区后,a-var也在那里,它的值是a-vars-value。我以为它不应该在那里。似乎setq和setq default之间没有区别 我的理解有问题吗 例如: 我在init.el文件中编写了(setq hello

我有一个关于Emacs Lisp的问题。setqsetq default之间有什么区别

教程说,setq在本地缓冲区中生效,而setq default影响所有缓冲区

例如,如果我在init.el中写入(setq a-var a-vars-value),我发现在启动Emacs并打开新缓冲区后,a-var也在那里,它的值是a-vars-value。我以为它不应该在那里。似乎setqsetq default之间没有区别

我的理解有问题吗

例如:

  • 我在init.el文件中编写了(setq hello 123),在shell中运行emacs abuffer,然后输入“hello C-x C-e”,它显示“123”。当我在所有新的缓冲区中运行它时,也会发生同样的情况

  • 我在init.el文件中编写了(setq tab width 4)。当我运行标签宽度C-x C-e时,它显示“8”(当前模式为“文本”)。但是,当我使用(setq默认选项卡宽度4)时,它会显示“4”。我无法解释这种现象


  • Emacs中的一些变量是“buffer local”,这意味着每个缓冲区都允许为该变量指定一个单独的值,该值覆盖全局默认值<代码>制表符宽度是缓冲区局部变量的一个很好的例子

    如果变量是缓冲区局部变量,则
    setq
    在当前缓冲区中设置其局部值,
    setq default
    设置全局默认值

    如果变量不是缓冲区本地变量,则
    setq
    setq default
    执行相同的操作


    在您的案例2中,
    (setq tab width 4)
    在当前缓冲区中将
    tab width
    的缓冲区本地值设置为4,将
    tab width
    的全局默认值保留为8,因此当您在没有本地值的不同缓冲区中计算
    tab width
    时,您会看到8。然后,当您将默认值设置为4时,该缓冲区会将其拾取,因为它仍然没有本地值。

    当I(设置选项卡宽度4)并对其求值时,每个缓冲区中的值始终为8。我不知道为什么。看来没有效果。但当我使用(设置默认选项卡宽度4)时,它会在每个缓冲区中生效。我也不知道为什么:(
    (setq tab width 4)
    在您计算表达式的缓冲区中生效;如果您在
    *scratch*
    缓冲区中计算它,则检查它在该缓冲区中的值。
    tab width
    是缓冲区局部变量。因此当您
    (setq tab width 4)时
    ,在当前缓冲区中仅设置为4。所有其他缓冲区保留全局默认值的
    选项卡宽度
    ,8。当您
    (设置默认选项卡宽度4)
    ,您正在将
    选项卡宽度的全局默认值更改为4,因此现在每个未定义
    选项卡宽度的缓冲区本身都有新的默认值。是。请参阅emacs列表。读取init文件是第12步,调出初始缓冲区是第23步。@ruanhao如果您(setq tab width 4)在init.el中,它将只应用于该缓冲区(init.el)。如果希望此更改应用于所有新缓冲区,则(setq default tab width 4)将完成此操作。此外,如果要为特定类型的文件创建模式,可能需要使用(setq tab width 4)以避免覆盖全局默认值。