Emacs定义通用模式为什么不能使用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 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

步骤,我真正做的是:

  1. *Scratch*缓冲区中执行define-generic-mode调用
  2. 切换到缓冲区,其中一些关键字正在测试
  3. 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"
  )

最新更新