Eu escrevi um modo simples para lidar com JSON. Ele usa o mecanismo derivado para reutilizar a maior parte do código do modo json. No entanto, uma adição é que você pode inserir elisp no texto JSON que é avaliado no momento do envio do JSON. Por exemplo, um trecho do json se parece com isso:
{
"parameters": {
"IRC_USER": "stsquad",
"PUB_KEY": `(format "\"%s\"" (s-trim (shell-command-to-string "cat ~/.ssh/id_rsa.pub")))`
}
}
Atualmente, o realce da sintaxe deste texto é interrompido à medida que o hightlighter da sintaxe JSON é lançado pelo elisp. Gostaria de configurar uma tabela de sintaxe aninhada para que o elisp seja reconhecido corretamente como elisp quando estiver dentro dos caracteres de escape (eu escolhi `neste caso). Eu entendo que você pode associar char-tables (das quais são criadas tabelas de sintaxe) com algo como:
(defvar lava-mode-syntax-table
(let ((json-table (copy-syntax-table json-mode-syntax-table))
(elisp-table (copy-syntax-table lisp-mode-syntax-table)))
(set-char-table-parent elisp-table json-table)
(modify-syntax-entry ?` "(`" json-table)
(modify-syntax-entry ?` ")`" json-table)
json-table)
"LAVA Mode syntax table.
This is a combination of json-mode-syntax-table with an escape into
lisp-mode-syntax table for the embedded elisp.")
Mas não entendo como posso modificar a tabela de sintaxe para começar a usar a tabela de sintaxe filho (elisp) enquanto estiver entre os caracteres de escape?
fonte
Respostas:
Você não deseja aninhar uma tabela de sintaxe (que é uma estrutura vetorial) dentro de outra, deseja configurar um buffer no qual, dependendo da posição, uma tabela de sintaxe seria usada em vez da outra.
A outra resposta descreve como fazer isso usando a
syntax-table
propriedade text. Veja como fazer isso usando um dos pacotes "vários modos principais", mmm-mode . Ele usará tudo do modo primário no nível superior do buffer, e a tabela de sintaxe do submodo, regras de bloqueio de fonte, mapa de chaves etc. nas "sub-regiões".Isso pressupõe que seus arquivos de modo misto sejam nomeados
*.el.json
. Ajuste conforme apropriado.Agora, instale
mmm-mode
, avalie o acima e (somente então) abra um dos arquivos em questão.fonte
nxhtml-mode
é bastante desajeitado, sim.mmm-mode
menos, mas ainda é complexo. Não tenho certeza se você pode fazer algo assimweb-mode
; pergunte ao autor, talvez.syntax-ppss
cache faz.Ok, vamos esclarecer algumas noções básicas.
É possível aninhar tabelas de sintaxe
As tabelas de sintaxe não precisam ser globais para todo o buffer. Você pode aplicá-los como propriedades de texto a regiões específicas. Isso significa que você pode realmente aplicar a
elisp
tabela de sintaxe apenas às regiões cercadas por backticks.Como você faz isso?
Aqui está uma maneira de fazer isso. Esse método faz isso imediatamente antes do bloqueio de fonte ser executado no buffer, portanto, deve evitar especificamente os problemas de bloqueio de fonte.
Na sua definição de modo principal, você precisará adicionar:
As tabelas de sintaxe não são iguais ao destaque de sintaxe
O marcador de sintaxe (o sistema de bloqueio de fonte) usa Tabelas de sintaxe como parte de suas informações; portanto, a solução acima deve impedir o marcador de ficar louco.
No entanto, isso é apenas parte dos dados. Se você também quiser que o texto nos backticks seja colorido exatamente como veria em um buffer elisp, será necessário estender a função acima para fazer isso especificamente.
fonte
with-silent-modifications
(comofont-lock-default-fontify-region
faz), mas ainda melhor seria mudar esseadd-text-properties
negócio parasyntax-propertize-function
.