Estou usando spacemacs com o AUCTeX para edição em LaTeX e gostaria de fazer delimitadores de arco-íris e / ou blocos de arco-íris destacar as equações matemáticas de LaTeX. Infelizmente, isso funciona apenas parcialmente, ou seja, algumas equações são destacadas e outras não:
Na captura de tela de exemplo, a matemática em linha incluída $não é destacada, enquanto o restante - incluindo a matemática em linha incluída \(...\)- o faz.
Com rainbow-blocksisso, piora, pois às vezes funciona em um local do documento e às vezes não funciona, independentemente do escopo.
P: Alguém sabe por que isso acontece ou como começar a rainbow-blockstrabalhar com matemática em linha no LaTeX? Existem alternativas de trabalho?
— nemesit
O modo látex no auctex parece definir "$" para ter uma sintaxe especial na tabela de sintaxe, portanto, talvez a fonte sintática do bloqueio de fonte esteja substituindo qualquer fonte baseada em palavra-chave.
highlight-parenthesesusa sobreposições em vez de bloqueio de fonte e seria muito simples usar uma tabela de sintaxe temporária durante a função de sobreposição. github.com/nschum/highlight-parentheses.el A função que precisaria ser alterada nessa biblioteca é hl-paren-highlight: (let ((my-syntax-table (make-syntax-table))) (with-syntax-table my-syntax-table . . . Infelizmente, essa é outra biblioteca diferente daquela que você especificou - não sei como consertar rainbow-delimiters- talvez você possa abra um problema no Github com o mantenedor.
Usando (with-silent-modifications (remove-text-properties (region-beginning) (region-end) '(face nil font-lock-face nil)) (add-text-properties (region-beginning) (region-end) '(face rainbow-delimiters-depth-1-face)))é possível substituir o fontification dentro de uma fórmula incorporado. Mas isso não funciona em um conselho de cerca de rainbow-delimiters-propertize-delimiter. Isso indica que a fonte latex-modeocorre após a fonte passar rainbow-delimiters-mode.
Os delimitadores de arco-íris usam jit-lock diretamente. Talvez a fonte sintática não use jit-lock e tenhamos um problema de tempo por causa disso?
A seguir, mais parece um comentário, pois
resolve apenas uma pequena parte do problema ( rainbow-delimiters-mode)
não é completamente testado (apenas com um arquivo de látex)
Eu não entendo completamente por que funciona ( font-lock-modeé realmente uma máquina bastante complicada)
A princípio, a solução para rainbow-delimiters-mode:
Substituímos a propriedade text font-lock-facepor facein rainbow-delimiters-propertize-delimitere rainbow-delimiters-unpropertize-delimiter. Uma vez que defsubsté usado no pacote em vez de defunnão podemos empregar, defaliasmas devemos modificar as próprias funções (tanto quanto eu entendo - por favor, comente se eu estiver errado a esse respeito).
As funções modificadas são:
Agora o raciocínio:
As fórmulas incorporadas entre os delimitadores $ são sintaxe tipificada pelo modo de bloqueio de fonte (como Kirill já apontou). O registro dessa fonte parece normal (consulte variável font-lock-syntactic-face-functione função font-latex-syntactic-face-function). Mas, describe-charnos caracteres de uma fórmula incorporada, mostra que a fonte sintática usa a facepropriedade -propriedade em vez da font-lock-face-propriedade.
O que se segue é hipotético, pois não compreendo completamente o mecanismo de bloqueio de fonte que é bastante complexo.
Parece que faceé mais forte que font-lock-face. Usos delimitadores de arco-íris font-lock-faceque são dominados pela facefonte sintática. No entanto, temos a vantagem de que a fonte sintática vem primeiro antes da fonte (palavra-chave) baseada em pesquisa (palavra-chave) que, por sua vez, usa jit-lock (consulte as páginas de informações de font-lock-mode).
Isso me leva à conclusão de que o problema será resolvido se usarmos faceem rainbow-delimitersvez de font-lock-face. E aqui eu não conheço todas as consequências. Mas, como rainbow-delimiterstambém usa jit-lockdiretamente (e não completamente font-lock-mode), estamos em um piso instável de qualquer maneira.
Observe que eu já tive algum contato rainbow-delimiters(consulte /programming/19800243/highlight-first-mismatching-paren/20022030#20022030 ), mas não com rainbow-blocks. Porque tenho apenas um período limitado de tempo em que escolhi me concentrar rainbow-delimiters. Talvez você possa resolver o rainbow-blocksproblema-de maneira semelhante.