0

を使用して構文強調表示用の単純なメジャー モードを作成しようとしていますdefine-generic-mode。見つけた

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

動かない。regexp-optしかし、 call を手動で計算された結果に置き換えると、すべてが期待どおりに機能します。

(define-generic-mode 'mytest-mode
  '("//") nil
  '(
    ("\\(?:bool\\|int\\|string\\)" . 'font-lock-type-face)
    )
  nil nil "mytest mode"
  )

では、なぜregexp-optcall をモード定義に入れることができないのでしょうか?

編集

Lindidancer の回答からの引用されたリスト内の項目の強制評価に関するヒント:

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

役に立たない: モードの起動時にエラーは発生しませんが、強調表示もありません

list関数を使用してリストを形成することに関する 2 つ目のヒント:

(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内で呼び出しを実行*Scratch*
  2. テスト中のいくつかのキーワードでバッファに切り替えます
  3. M-x mytest-mode
4

2 に答える 2