2016-08-22 24 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呼叫模式定義是什麼?

編輯

提示有關從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)) 

不還幫助 - 沒有錯誤,沒有高亮。

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

謝謝你,你的逗號語法不返回任何錯誤,但不突出顯示文本。當我嘗試'(列表(((regexp-opt'(「int」「string」「bool」))'font-lock-variable-name-face))''然後我收到'(invalid- function(regexp-opt引用....' – shibormot

+0

它應該可能是'(list(list(regexp-opt ...)'font-lock-type-face))'。 – Lindydancer

+0

'(list(list(...'not幫助也。更新的問題。 – shibormot