É possível extrair vários grupos de uma só vez ao digitar font-lock?

0

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!

    
por wvxvw 02.08.2014 / 18:55

1 resposta

1

Uma resposta parcial rápida sem olhar para o seu código (desculpe) - por isso, pode perder o barco.

  1. Se parte do que você está perguntando é como deixar algo realçado por uma entrada f-l-k , mesmo que ela também corresponda a uma entrada f-l-k posterior, a resposta para isso é usar keep . (Veja também o que t faz, o que é praticamente o oposto.)

  2. Se parte do que você está perguntando é como bloquear font sem usar regexps, ou sem usar apenas regexps, a resposta para isso é usar uma função.

Se você ainda não o fez, consulte o manual do Elisp, nó Search-based Fontification - procure por keep e FUNCTION .

    
por 03.08.2014 / 04:23