emacs define-generic-mode 为什么不能使用 regexp-opt?
emacs define-generic-mode why cannot use regexp-opt?
我正在尝试使用 define-generic-mode
为语法突出显示创建简单的主要模式。我发现
(define-generic-mode 'mytest-mode
'("//") nil
'(
((regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
)
nil nil "mytest mode"
)
不工作。但是如果我用手动计算的结果替换 regexp-opt
调用,那么一切都会按预期工作:
(define-generic-mode 'mytest-mode
'("//") nil
'(
("\(?:bool\|int\|string\)" . 'font-lock-type-face)
)
nil nil "mytest mode"
)
那么,为什么我不能只在模式定义中放入 regexp-opt
调用?
编辑
Lindidancer 的回答中关于强制评估引用列表中项目的提示:
(define-generic-mode 'mytest-mode
'("//") nil
'(
(,(regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
)
nil nil "mytest mode"
)
没有帮助:模式激活没有错误,但也没有突出显示
关于使用 list
函数形成列表的第二个提示:
(define-generic-mode 'mytest-mode
'("//") nil
(list
((regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
)
nil nil "mytest mode"
)
激活模式出错:(invalid-function (regexp-opt (quote ("int" "string" "bool"))))
尝试评估时出现同样的错误:
(list
((regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
)
在临时缓冲区中。
编辑 1
(list (list (regexp-opt '("int" "string" "bool")) 'font-lock-type-face))
也没有帮助 - 没有错误,没有突出显示。
编辑 2
我的具体步骤是:
- 在
*Scratch*
缓冲区中执行define-generic-mode
调用
- 切换到缓冲测试中的一些关键字
M-x mytest-mode
因为对regexp-opt
的调用在引用列表中,所以它不被视为函数调用。
您可以使用 list
等函数创建列表,也可以使用反引号,其中 ,
表示应评估下一个表单。
`(
(,(regexp-opt '("int" "string" "integer" "bool" "boolean" "float")) . 'font-lock-type-face)
)
(define-generic-mode 'mytest-mode
'("//") nil
`(
(,(regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
)
nil nil "mytest mode"
)
我正在尝试使用 define-generic-mode
为语法突出显示创建简单的主要模式。我发现
(define-generic-mode 'mytest-mode
'("//") nil
'(
((regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
)
nil nil "mytest mode"
)
不工作。但是如果我用手动计算的结果替换 regexp-opt
调用,那么一切都会按预期工作:
(define-generic-mode 'mytest-mode
'("//") nil
'(
("\(?:bool\|int\|string\)" . 'font-lock-type-face)
)
nil nil "mytest mode"
)
那么,为什么我不能只在模式定义中放入 regexp-opt
调用?
编辑
Lindidancer 的回答中关于强制评估引用列表中项目的提示:
(define-generic-mode 'mytest-mode
'("//") nil
'(
(,(regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
)
nil nil "mytest mode"
)
没有帮助:模式激活没有错误,但也没有突出显示
关于使用 list
函数形成列表的第二个提示:
(define-generic-mode 'mytest-mode
'("//") nil
(list
((regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
)
nil nil "mytest mode"
)
激活模式出错:(invalid-function (regexp-opt (quote ("int" "string" "bool"))))
尝试评估时出现同样的错误:
(list
((regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
)
在临时缓冲区中。
编辑 1
(list (list (regexp-opt '("int" "string" "bool")) 'font-lock-type-face))
也没有帮助 - 没有错误,没有突出显示。
编辑 2
我的具体步骤是:
- 在
*Scratch*
缓冲区中执行define-generic-mode
调用 - 切换到缓冲测试中的一些关键字
M-x mytest-mode
因为对regexp-opt
的调用在引用列表中,所以它不被视为函数调用。
您可以使用 list
等函数创建列表,也可以使用反引号,其中 ,
表示应评估下一个表单。
`(
(,(regexp-opt '("int" "string" "integer" "bool" "boolean" "float")) . 'font-lock-type-face)
)
(define-generic-mode 'mytest-mode
'("//") nil
`(
(,(regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
)
nil nil "mytest mode"
)