Eu estive procurando uma maneira de detectar se o ponto está em um comentário, observando como o buffer atual é tipificado.
Smartparens define sp-point-in-comment
, em que se baseia syntax-ppss
. No entanto, parece que syntax-ppss
e parse-partial-sexp
pode ser usado para línguas arbitrárias, mesmo se eles não usam s-expressões.
Por exemplo, este Python:
x = 1
# I'm a comment
y = 2
O ponto de colocação dentro do comentário e a avaliação (if (nth 4 (syntax-ppss)) 'comment 'not-comment)
funcionam corretamente.
Funciona syntax-ppss
para qualquer modo de programação? Por que os documentos discutem expressões s?
syntax-highlighting
parsing
syntax
Wilfred Hughes
fonte
fonte
Respostas:
Bem, expressões-s são essencialmente “sintaxe abstrata”, no sentido de que são apenas uma sintaxe concreta para árvores de sintaxe abstrata e, portanto, qualquer linguagem pode ser representada como expressões-s e manipulada com comandos de expressão-s. Portanto,
syntax-ppss
falar em "Sexps" é simplesmente a maneira do Lisp de falar sobre árvores de sintaxe abstrata.Praticamente, no entanto,
syntax-ppss
geralmente não funciona em nenhum modo. É fundamentalmente direcionado para linguagens do tipo Lisp, e se a linguagem concreta de uma linguagem se desvia muito do Sexps, não faz muito sentido usar os comandos do Sexp para manipular a linguagem. Funcionaria, mas haveria uma lacuna muito grande entre a representação abstrata e a sintaxe concreta, o que tornaria a maioria dos comandos contra-intuitivos.No entanto, parte da infraestrutura subjacente
syntax-ppss
é bastante genérica. Os modos principais geralmente se esforçam para se conectar a ele, porque os fazem funcionar bem com muitos recursos internos do Emacs e fornecem uma interface genérica para outros pacotes de terceiros, como o Smartparens.Notavelmente,
syntax-ppss
conta com tabelas de sintaxe para seqüências de caracteres e comentários. As tabelas de sintaxe categorizam caracteres individuais por sua classe sintática. Existem classes para delimitadores emparelhados, delimitadores de cadeia e caracteres de comentário.A estrutura de strings e comentários é bastante semelhante em quase todas as linguagens de programação: Strings são normalmente incluídas em delimitadores especiais. Os comentários também podem ter delimitadores especiais ou começar com um determinado caractere e se estender até o final da linha. Essas estruturas podem ser facilmente capturadas em tabelas de sintaxe, e quase todos os principais modos definem tabelas de sintaxe apropriadas, apenas para lucrar com a fortificação sintática do Emacs.
Portanto,
syntax-ppss
funciona bem para strings e comentários em quase qualquer idioma, mas o suporte e a "utilidade" de outros recursos variam.fonte
Adicionando à resposta do @ lunaryorn, acho que o syntax-ppss depende apenas da robustez do sistema de tabelas de sintaxe do emacs, que funciona para comentários e strings na maioria dos idiomas. Mas se o idioma tiver sintaxe que a tabela de sintaxe não pode capturar e se o modo não construísse um analisador para adicionar propriedades de sintaxe aos locais certos,
syntax-ppss
falharia.Tente isso em
html-mode
:e chame o seguinte comando:
Somente aa é verdadeiro, mas bb também deve ser verdadeiro.
Quando está dentro
nxml-mode
, nada retorna true, mas pelo menos aa deve ser true.fonte