emacs define-generic-mode, почему нельзя использовать 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
Шаги, которые я делаю, это:
- казнить
define-generic-mode
позвонить в*Scratch*
буфер - Переключиться в буфер с некоторыми тестируемыми ключевыми словами
M-x mytest-mode
2 ответа
(define-generic-mode 'mytest-mode
'("//") nil
`(
(,(regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
)
nil nil "mytest mode"
)
Это потому, что призыв к regexp-opt
находится внутри списка в кавычках, поэтому он не рассматривается как вызов функции.
Вы можете создать список, используя такие функции, как list
или используйте обратные кавычки, где ,
означает, что следующая форма должна быть оценена.
`(
(,(regexp-opt '("int" "string" "integer" "bool" "boolean" "float")) . 'font-lock-type-face)
)