2016-08-22 3 views
0

J'essaye de faire le mode principal simple pour la coloration syntaxique en utilisant define-generic-mode. J'ai trouvé queemacs define-generic-mode pourquoi ne pas utiliser regexp-opt?

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

ne fonctionne pas. Mais si je remplace regexp-opt appel avec son résultat calculé manuellement, tous les travaux comme prévu:

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

Alors, pourquoi je ne peux pas mettre regexp-opt appel dans la définition du mode?

EDIT

Conseil sur l'évaluation forcée des éléments de la liste citée de la réponse de Lindidancer:

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

ne contribue pas: aucune erreur sur l'activation du mode, mais pas mise en évidence aussi

deuxième indice à propos de l'utilisation list fonction pour former des listes:

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

donne erreur sur le mode d'activation: (invalid-function (regexp-opt (quote ("int" "string" "bool"))))

même erreur lorsque vous essayez d'évaluer:

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

dans un tampon de zéro.

EDIT 1

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

ne vous aide pas aussi - aucune erreur, aucune mise en évidence.

EDIT 2

étapes, ce que je fais exactement, sont:

  1. Execute define-generic-mode appel dans la mémoire tampon *Scratch*
  2. Passer au tampon avec certains mots-clés à l'essai
  3. M-x mytest-mode

Répondre

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

Après une année de tourments, tu as ouvert les yeux, alors j'ai accepté la tienne, merci) – shibormot

2

C'est parce que l'appel à regexp-opt est dans une liste entre guillemets, donc il n'est pas vu comme un appel de fonction.

Vous pouvez soit créer la liste en utilisant des fonctions comme list ou utiliser des guillemets, où , signifie que le formulaire suivant doit être évalué.

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

Merci, votre syntaxe comma retour aucune erreur, mais ne met pas en évidence le texte. Quand j'essaie '(list ((regexp-opt '(" int "" chaîne "" bool "))' font-lock-nom-variable-face))' alors je reçois '(fonction-invalide (regexp-opt (citation .... ' – shibormot

+0

Il devrait probablement être' (liste (liste (regexp-opt ...) 'font-lock-type-face)) '. – Lindydancer

+0

' (liste (liste (... 'ne pas aide aussi. – shibormot