变量的几种定义方式
使用setq
(setq num 100)
也可以使用set,但变量名称需要使用'
作为前缀:
(set 'num 100)
也可以一次定义多个变量:
(setq name "Cabins"
age 20
address "Shenzhen")
使用defvar
基本语法格式:
(defvar name "Cabins"
"Define the name of the author.")
- 只能定义之前没有存在的变量,如果对已经存在的变量进行重新定义,则不起作用
- 可以添加变量文档来说明变量的用途
只在当前buffer生效的变量
使用setq-local
来定义。
(setq-local file-name "test.el")
这样定义的变量只在当前的buffer中生效,其他的buffer中仍然使用其原来的值。
如果只声明而不赋值,则可使用make-variable-buffer-local
函数完成:
(make-variable-buffer-local 'var-buffer-only)
设置默认值
使用setq-default
完成对buffer-local的变量完成赋值。
(setq-default tab-width 2
eval-shift-width 2)
需要特别注意的是:这个函数修改之后只对未来生效,当前的buffer并不生效。
作用域
全局作用域
- 常用于储存命令的配置,或者全局配置
- 将来代码执行的时候需要用到的变量的值
局部作用域
当前代码块就需要使用的变量。
- 使用let
- 使用let*
两者的区别是let* 定义的变量在接下来的变量定义中立马就可以使用。如以下代码中的z就使用了定义中的x,y:
(let* ((x 1)
(y 2)
(z (+ x y)))
)
面向用户配置的变量
使用defcustom来定义面向用户配置的一些变量。常用于允许用户自定义配置的场景。而且这样定义的变量会出现在UI配置界面中。
基本语法格式为:
(defcustom custom-variable 42
"The custom variable with default value 42.")
defcustom会带有几个常见的附加参数:
- :type 变量类型
- :group 变量隶属的组
- :options 变量的可能取值范围
- :set 变量被赋值时触发的函数
- :initialize 变量初始化时候触发的函数
- :local 是否变量定义为buffer-local
使用customize-set-variable
进行自定义变量的赋值。
使用customize-variable-p
来判断是否是自定义变量。