Estou tentando enrolar minha cabeça em torno de font-lock-keywords
format, particularmente MATCH-ANCHORED
variant, mas não vejo como reutilizarei as correspondências geradas de um regexp. Abaixo está minha configuração para ilustração:
(defvar fmt-font-lock-keywords
;; no-args
'(("~\(@:?\|:@?\)?[]>()}aswvcp;_]"
(0 font-lock-keyword-face))
;; numeric-arg
("~\([0-9]*\|#,?\)\(@:?\|:@?\)?[i*%&|~{[]"
(0 font-lock-keyword-face))
;; decimal
("~\([0-9]*\|#\(,[0-9]*\|#\)\{0,3\}\)?\(@:?\|:@?\)?[rdbox]"
(0 font-lock-keyword-face))
;; floating-point f
(,(concat
"~\(\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)\{3\}\(,'\w\)\{1,2\}\)\|"
"\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)\{0,3\}\)\)"
"?\(@:?\|:@?\)?f")
(0 font-lock-keyword-face))
;; floating-point e, g
(,(concat
"~\(\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)\{3\}\(,'\w\)\{1,3\}\)\|"
"\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)\{0,3\}\)\)"
"?\(@:?\|:@?\)?[eg]")
(0 font-lock-keyword-face))
;; currency
(,(concat
"~\(\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)\{2\}\(,'\w\)\)\|"
"\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)\{0,2\}\)\)"
"?\(@:?\|:@?\)?[$]")
(0 font-lock-keyword-face))
;; tabulation
("~\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)?\)?\(@:?\|:@?\)?t"
(0 font-lock-keyword-face))
;; escape
("~\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)\{0,2\}\)?\(@:?\|:@?\)?^"
(0 font-lock-keyword-face))
;; logical block
("~\(\([0-9]*\|#\)\(,\([0-9]*\|#\)\)\{0,3\}\)?\(@:?\|:@?\)?<"
(0 font-lock-keyword-face))
;; custom function
(,(concat
"~\(\([0-9]+\|'\w\|#\)\(,\([0-9]+\|'\w\|#\)+\)*\)?"
"\(@:?\|:@?\)?\/[^\s\n,#@]+\/")
(0 font-lock-keyword-face))))
E, ao inicializar este modo:
(define-derived-mode fmt-mode fundamental-mode
. . .
(set (make-local-variable 'font-lock-defaults)
'(fmt-font-lock-keywords)) . . .)
Desculpe, sei que parece cuneiforme, mas o que ele faz é realmente muito simples ... está analisando a mini-linguagem do formato Common Lisp.
O que ele faz agora: ele colore todas as subcordas especiais usando a face de palavra-chave, mas o que eu gostaria de fazer é colorir certas partes de forma diferente (argumentos numéricos seriam coloridos de forma diferente, a chamada de função personalizada seria colorida de e dois pontos - talvez de forma diferente, dados de caracteres - talvez de forma diferente também).
Eu poderia, tecnicamente, duplicar esses regexps para extrair um grupo diferente, mas é muito deselegante, além do mais, nos casos em que é possível passar um número variável de argumentos, o writeup irá se aproximar da explosão combinatória ...
Eu percebo que a análise pode ser muito mais facilmente resolvida quando não estou usando expressões regulares, mas não sei como combiná-la com o modo de bloqueio de fontes. Mas se você souber como fazê-lo sem regexps, enquanto ainda estiver usando a mecânica de bloqueio de fontes para colorir, essa também seria uma ótima resposta!