emacs define-generic-mode为什么不能使用regexp-opt?

时间:2016-08-22 10:09:25

标签: emacs font-lock backquote

我正在尝试使用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

步骤,我到底做了什么,是:

  1. define-generic-mode缓冲区
  2. 中执行*Scratch*调用
  3. 切换到缓冲区,其中包含一些正在测试的关键字
  4. M-x mytest-mode

2 个答案:

答案 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"
  )