“使用”有什么区别;setq";还是不设置Emacs设置?

“使用”有什么区别;setq";还是不设置Emacs设置?,emacs,dot-emacs,Emacs,Dot Emacs,非常简单的问题,但让我困惑了一段时间: (setq visible-bell t) 及 两者似乎都能起作用 但是 工作,而 (setq desktop-save-mode 1) 不是 请问这是为什么?Well setq(具有自动引用功能的“set”)用于为变量赋值。在本例中,它显然不是必需的,因为正如您所提到的,省略它对第一组示例有效 基本上,visible bell是一个变量,您给它赋值“t”以启用visible bell 但是,桌面保存模式是一个交互式功能,所以您不需要使用setq为其赋

非常简单的问题,但让我困惑了一段时间:

(setq visible-bell t)

两者似乎都能起作用

但是

工作,而

(setq desktop-save-mode 1)
不是

请问这是为什么?

Well setq(具有自动引用功能的“set”)用于为变量赋值。在本例中,它显然不是必需的,因为正如您所提到的,省略它对第一组示例有效

基本上,visible bell是一个变量,您给它赋值“t”以启用visible bell

但是,桌面保存模式是一个交互式功能,所以您不需要使用setq为其赋值,而是通过参数调用它

当您不确定某件事是什么时,可以使用内置的帮助功能:

C-h v visible-bell RET
这将返回visible bell的信息——注意命令中的“v”是因为它是一个变量。如果要搜索有关函数的信息,请执行以下操作:

C-h f desktop-save-mode RET

顺便说一句,在本例中,桌面保存模式也是一个变量,但它是一个只读变量,用于确定是否启用了桌面保存模式,因此尝试更改它将不起作用。

它们不同,因为它们不同:)

(setq可视铃声t)
正在将值
t
赋给名为
visible bell
的变量

(可视铃声t)
正在调用名为
visible bell
的函数1(并将值
t
作为参数传递)

(尽管仅供参考,在当前版本的Emacs中,默认情况下没有
可见的bell
功能,因此我并不清楚这是否真的按照您的想法工作?不过,假设您确实有这样的功能……)

Emacs Lisp是一个“Lisp-2”,这意味着它对变量和函数有单独的名称空间,因此您可以(通常也可以)使用相同名称的变量和函数。在代码的上下文中,引用哪一个始终是隐式的(例如,
setq
始终引用一个变量)

简而言之,这两段代码所做的事情非常不同。这并不意味着它们不能产生等效的效果(例如,函数可能只是设置变量的值);但事实是否如此完全取决于函数的定义


1实际上,第一行代码也在调用一个函数2:它调用
setq
,并向它传递两个参数
visible bell
t
,然后
setq
根据其参数设置值。希望您现在开始了解lisp语法是如何工作的


2严格来说,
setq
实际上是一个“特殊形式”而不是一个函数,特殊形式更接近宏而不是函数;但是,这些区别对于本问答并不重要。

其他人已经告诉了您有关
setq
的功能以及变量与函数的基本点

Wrt
可视铃声
本身:

  • 据我所知,在任何Emacs版本中,Emacs都没有提供任何功能
    visible bell
    ,而且从来没有。(我已经通过Emacs 20检查过了,根据记忆,我相信从一开始也是如此。只有变量
    可见的bell

    因此,正如@phils所建议的,不清楚您所说的是否正确:“两者似乎都起作用”。除非您正在加载的一些额外代码定义了一个同名函数(我们无法对其进行评论,也无法看到它),否则评估
    (可视bell t)
    会引发一个未定义(无效)函数错误

  • 变量
    visible bell
    不仅仅是一个变量。它是一个用户选项,而且至少从Emacs 20以来一直如此

  • 您应该而不是,一般来说,只需使用
    setq
    来更改用户选项的值。在许多情况下,如果这样做,您不会遇到麻烦,但有时会遇到麻烦,而且这不是一个好习惯

    setq
    不执行任何适用于给定用户选项的特殊初始化或更新操作。它不适用于用户选项。或者更确切地说,用户选项不适用于
    setq
    ——它们可能比
    setq
    提供的更复杂

  • 您应该使用
    setq
    而不是Customize。可以交互方式(
    M-x Customize option RET visible bell RET
    ,或
    C-h v RET visible bell RET
    ,然后单击
    Customize
    链接)或在初始文件中使用Lisp代码

  • 如果使用Lisp代码,则使用以下函数之一(而不是
    setq
    ):

    • 自定义设置变量
    • 自定义设置值
    • 自定义设置变量
    使用
    C-hf
    后跟每个函数名,查看有哪些(细微)差异


  • 这里有三个问题

  • 在Emacs Lisp中,相同的符号既可以是变量也可以是函数
  • 在桌面保存模式下,它既是一个函数,也是一个变量

    因为它是一个函数,所以你可以调用

    (desktop-save-mode 1)
    
    因为它是一个变量,所以你要给它设置一个值

    (setq desktop-save-mode t)
    
    您可以定义自己的函数,也可以定义一个同名变量来测试它

    注意:函数的参数应该是什么或者变量的值有什么意义取决于函数或变量

  • 现在是第二个问题。一般来说,对于激活次要模式的函数(命令),约定是一个正整数意味着打开它,否则就关闭它
  • 此外,对于激活次要模式的命令,通常有一个同名变量,值为t或nil,以指示模式是否打开

  • 现在,还有第三个国际空间站
    (desktop-save-mode 1)
    
    (setq desktop-save-mode t)
    
    (desktop-save-mode 1) ; correct. To turn on.
    (desktop-save-mode) ; Confusing. Should take value 1 to turn on. Usually works because by default it's off.
    (desktop-save-mode t) ; wrong. Take value of positive integer to turn on.
    (desktop-save-mode nil) ; Confusing. Value should be integer
    (setq desktop-save-mode t) ; wrong. Shoud call function instead
    (setq desktop-save-mode nil) ; wrong. Shoud call function instead
    (setq desktop-save-mode 1) ; wrong. Shoud call function instead. Besides, only t and nil make sense