我正在尝试使用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
call放在模式定义中呢?
编辑
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"
)