2016-03-02 8 views
1

J'essaye d'écrire un mode majeur emacs très basique pour éditer des fichiers sources d'assembleur (pour un microcontrôleur spécifique). J'ai utilisé https://www.emacswiki.org/emacs-test/ModeTutorial comme point de départ. Cela fonctionne mais j'aimerais changer deux choses mais je ne trouve pas de solution. Et oui, je suis désireux de développer une compréhension plus approfondie d'eLisp avec le temps, mais j'essaie aussi de me frayer rapidement un chemin vers une définition de mode de travail parce que j'en ai besoin maintenant (sans vraiment comprendre les subtilités - je sais, RTFM ...).emacs définition de mode majeur

Quoi qu'il en soit, je l'espère, d'obtenir une réponse à deux questions:

1) Alors que la coloration syntaxique des œuvres, je ne suis pas d'être insensible à la casse. J'ai essayé d'ajouter (setq font-lock-keywords-case-fold-search t) à la fonction ci-dessous, mais il ne semble pas avoir l'effet désiré.

(defun xasm-mode() 
    (interactive) 
    (kill-all-local-variables) 
    (use-local-map xasm-mode-map)   
    (set-syntax-table xasm-mode-syntax-table) 
    ;; set up font-lock 
    (set (make-local-variable 'font-lock-defaults) '(xasm-font-lock-keywords)) 
    (setq font-lock-keywords-case-fold-search t) 
    (setq major-mode 'xasm-mode) 
    (setq mode-name "XASM")  
    (run-hooks 'xasm-mode-hook)) 

2) La deuxième question que démontre mon ignorance ... En fait, dans une expression avec la structure ci-dessous, je voudrais remplacer le « regexp » littéral (qui fonctionne) par une valeur dans une variable (ici: x, x étant (correctement) calculé par regexp-opt) ... Mais je ne sais pas comment insérer la valeur de x ici :-(

(setq x 'xyz) 
(defconst v2 
    (list 
    '("regexp" . foo) 
)) 

Merci pour vos conseils

+1

Indépendamment de vos questions actuelles, avez-vous regardé 'define-generic-mode'? https://www.gnu.org/software/emacs/manual/html_node/elisp/Generic-Modes.html – Thomas

+1

Pour votre deuxième question, ce que vous cherchez est "backquote", décrit dans [cette réponse] (http : //stackoverflow.com/a/11875822/113848), ainsi que [dans le manuel elisp] (https://www.gnu.org/software/emacs/manual/html_node/elisp/Backquote.html). – legoscia

Répondre

2

Consultez la documentation avec C-h v font-lock-defaults RET:

... par défaut doivent être de la forme:

(KEYWORDS [KEYWORDS-SEULEMENT [CAS-PLI [SYNTAX-ALIST ...]]]) ...

qui vous indique que vous pouvez définir la « case-fold » comportement là:

(set (make-local-variable 'font-lock-defaults) 
    '(xasm-font-lock-keywords nil t)) 

aussi, faites-vous une faveur et utiliser define-mode dérivé (et mise à jour selon doc que vous avez trouvé que vous avez souligné à defun+interactive+setqmode-name+... il se réfère à define-derived-mode aussi) .

+0

Merci, je suis passé en mode dérivé et ça marche – user52366

3

While coloration syntaxique fonctionne, je ne comprends pas à insensible à la casse. J'ai essayé d'ajouter (setq police-lock-keywords-case-fold-recherche t) à la fonction ci-dessous, mais il ne semble pas avoir l'effet désiré.

Peut-être parce que vous utilisez defun au lieu d'utiliser plus moderne define-derived-mode:

(define-derived-mode xasm-mode prog-mode "XASM" 
    ;; set up font-lock 
    (set (make-local-variable 'font-lock-defaults) '(xasm-font-lock-keywords)) 
    (set (make-local-variable 'font-lock-keywords-case-fold-search) t)) 

Si cela ne fonctionne pas, je suppose que vous aurez juste à le rendre insensible à la main, [a-z] ->[a-zA-Z], etc.

la deuxième question que démontre mon ignorance ... au fond, dans une expression avec la structure ci-dessous, je li ke pour remplacer le littéral "regexp" (qui fonctionne) par une valeur qui est dans une variable (ici: x, avec x étant (correctement) calculé par regexp-opt) ... Mais je ne sais pas pour insérer la valeur de x ici :-(

Utilisez l'opérateur de virgule comme legoscia souligné. Dans votre cas, il ressemblera à ceci:

(defconst v2 
    `(
    ("regexp" . ,foo) 
    )) 

Pour évaluer foo à l'intérieur du backtick, nous avons mis une virgule devant elle, ,foo.

+0

Je suis passé en mode dérivé, et ma correspondance insensible à la casse a fonctionné. J'ai commencé avec 'defun' à cause de cet exemple (https://www.emacswiki.org/emacs/ModeTutorial), qui n'était probablement pas la meilleure idée. – user52366