我正在尝试使用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
步骤,我到底做了什么,是:
define-generic-mode
缓冲区*Scratch*
调用
M-x mytest-mode
答案 0 :(得分:2)
这是因为对regexp-opt
的调用是在引用列表中,所以它不被视为函数调用。
您可以使用list
等函数创建列表,也可以使用反引号,其中,
表示应评估下一个表单。
`(
(,(regexp-opt '("int" "string" "integer" "bool" "boolean" "float")) . 'font-lock-type-face)
)
答案 1 :(得分:1)
(define-generic-mode 'mytest-mode
'("//") nil
`(
(,(regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
)
nil nil "mytest mode"
)