Ao escrever um modo principal, geralmente é útil saber 'é um ponto em uma string?' 'é ponto em um comentário?'.
A maioria dos principais modos parece tentar analisar a linguagem de programação. Por exemplo:
python-syntax-content
chamadassyntax-ppss
haskell-fill-paragraph
chamadassyntax-ppss
ere-search-forward
c-in-comment-line-prefix-p
move apontar e chamalooking-at
sp-point-in-comment
chama,syntax-ppss
mas também verifica se está em um delimitador de comentários
No entanto, isso não funciona em alguns casos. Nos buffers de modo organizacional, os comentários nos blocos de origem não são detectados corretamente por essas abordagens.
Também parece inútil, pois o buffer já está mostrando comentários destacados .
Em vez disso, você pode simplesmente inspecionar as faces no momento:
(defun wh--get-faces (pos)
"Get all the font faces at POS."
(remq nil
(list
(get-char-property pos 'read-face-name)
(get-char-property pos 'face)
(plist-get (text-properties-at pos) 'face))))
(defun wh-string-p (pos)
"Return non-nil if POS is inside a string."
(memq 'font-lock-string-face (wh--get-faces pos)))
Por que os principais modos não fazem isso? O buffer já está com fonte, então eu esperaria que isso fosse mais rápido, mais robusto e exigisse menos código.
major-mode
syntax-highlighting
Wilfred Hughes
fonte
fonte
font-lock-mode
? (Não que eu acho que você deveria.)Respostas:
O problema é que não é mais robusto.
Em primeiro lugar, os principais modos são precisamente os responsáveis por decidir o que é um comentário ou uma string. Se eles foram capazes de defini-los com êxito para fins de bloqueio de fonte, deveriam poder fazer o mesmo para outros fins.
Em segundo lugar, ler a sintaxe para determinar o contexto em que esse ponto está inserido é a maneira mais robusta de fazê-lo, se isso for feito corretamente. Se você encontrou casos em que isso falha, vale a pena enviar um relatório de bug ao autor do modo principal.
A razão pela qual a inspeção das faces é menos robusta é porque ela pode falhar em algumas situações.
Para iniciantes, o usuário poderia ter desativado
font-lock-mode
(talvez seja um buffer enorme), mas mesmo comfont-lock-mode
ativado, os rostos são um pouco instáveis.Além disso, o usuário pode ter um modo menor que adicione alguns
font-lock-keywords
(como destaqueTODO
nos comentários). Ou pode haver um modo menor que aplique dinamicamente algumas faces após o bloqueio de fonte ter tipificado o buffer.Em resumo, o modo principal não garante que as faces definidas por ele sejam as faces atualmente aplicadas.
fonte
Eu acho que o principal motivo é porque o bloqueio de fonte usa
syntax-ppss
.fonte