Como detectar se o ponto está dentro de uma área de comentários?
15
Verifique o quarto valor * na lista retornada por syntax-ppss
:
(nth 4 (syntax-ppss))
É nil
se point estiver fora de qualquer comentário, t
se estiver dentro de um comentário não aninhado ou um número inteiro (a profundidade do aninhamento) se estiver dentro de um comentário aninhado. Veja a documentação parse-partial-sexp
para mais detalhes.
* Baseado em zero.
Observe que isso não funciona no modo Org, você deve usar isto:
(defun in-comment-p ()
"Testy if cursor/point in a commented line?"
(save-excursion
(if (derived-mode-p 'org-mode)
(save-match-data (beginning-of-line) (looking-at "^[ \t]*#"))
(nth 4 (syntax-ppss)))))
syntax-ppss
fornecem?parse-partial-sexp
.syntax-ppss
o apontaráparse-partial-sexp
, o último dos quais fornecerá uma descrição de todas as coisas retornadas por essas funções. Espero que ajude para começar.use a fonte-face, este é o truque que aprendi com o flyspell.
Eu tentei
syntax-ppss
há dois anos, ele não funciona por dois motivos:não funciona na borda do comentário (limite de comentários), por exemplo, para comentários como
// this is comment
no modo c ++ -, se você colocar o cursor sobre o/
caractere, o resultado(nth 4 (syntax-ppss))
é nulo.não funciona no modo principal como no modo web
Aqui está o código que eu copiei do flyspell:
Observe que o código pode ser estendido para oferecer suporte aos novos modos principais, exibindo a fonte correspondente ao fuzz.
Eu usei esse truque por cerca de três anos sem falhas. Além disso, considerando que o flyspell é amplamente utilizado por tanto tempo, eu poderia afirmar que esse método é confiável.
Consulte Qual atalho de teclado usar para navegar fora de uma sequência de caracteres para obter uma pergunta semelhante.
fonte
POS
argumentos e usapoint
. Melhor do que ter duas dessas versões é tornar o argPOS
opcional e configurá-lo para(point)
quandonil
.