Por que os modos principais não apenas inspecionam os rostos?


10

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 chamadas syntax-ppss
  • haskell-fill-paragraphchamadas syntax-ppssere-search-forward
  • c-in-comment-line-prefix-p move apontar e chama looking-at
  • sp-point-in-commentchama, syntax-ppssmas 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.


11
Eu gosto dessa pergunta. No entanto, e se você não usar font-lock-mode? (Não que eu acho que você deveria.)
mbork

Respostas:


12

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.

  1. Para iniciantes, o usuário poderia ter desativado font-lock-mode(talvez seja um buffer enorme), mas mesmo com font-lock-modeativado, os rostos são um pouco instáveis.

  2. Além disso, o usuário pode ter um modo menor que adicione alguns font-lock-keywords(como destaque TODOnos 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.


2

Eu acho que o principal motivo é porque o bloqueio de fonte usa syntax-ppss.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.