2016-08-22 8 views
0

Я пытаюсь сделать простой основной режим подсветки синтаксиса, используя define-generic-mode. Я обнаружил, чтоemacs define-generic-mode Почему нельзя использовать regexp-opt?

(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 вызов в определении режима?

EDIT

Подсказка о принудительной оценки элементов в котировальный список из ответа 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) 
    ) 

в царапанию буфере.

EDIT 1

(list (list (regexp-opt '("int" "string" "bool")) 'font-lock-type-face)) 

не помогает также - нет ошибок, нет подсветки.

EDIT 2

шаги, что я точно делать, являются:

  1. Выполнить define-generic-mode вызов в *Scratch* буфере
  2. Переключитесь в буфер с некоторых ключевых слов испытуемой
  3. M-x mytest-mode

ответ

1
(define-generic-mode 'mytest-mode 
    '("//") nil 
    `(
    (,(regexp-opt '("int" "string" "bool")) . 'font-lock-type-face) 
    ) 
    nil nil "mytest mode" 
) 
+0

После года мучений вы открыли мне глаза, поэтому я принял ваш ответ, спасибо) – shibormot

2

Это потому, что вызов regexp-opt находится в списке, поэтому он не рассматривается как вызов функции.

Вы можете создать список с помощью таких функций, как list, или использовать обратные кавычки, где , означает, что следующая оценка должна быть оценена.

`(
    (,(regexp-opt '("int" "string" "integer" "bool" "boolean" "float")) . 'font-lock-type-face) 
) 
+0

Спасибо, ваш синтаксис запятая не возвращают ошибки, но не выделяет текст. Когда я пытаюсь '(list ((regexp-opt '(" int "" string "" bool "))' font-lock-variable-name-face))' then I recieve '(invalid-function (regexp-opt (quote .... ' – shibormot

+0

Вероятно, это будет' (list (list (regexp-opt ...) 'font-lock-type-face)) '. – Lindydancer

+0

' (list (list (... 'does not Помогите также. Обновленный вопрос. – shibormot