¿Cómo detectar si el punto está dentro de un área de comentarios?
15
Verifique el cuarto * valor en la lista devuelta por syntax-ppss
:
(nth 4 (syntax-ppss))
Es nil
si el punto está fuera de cualquier comentario, t
si está dentro de un comentario no anidable, o un número entero (la profundidad de anidación) si está dentro de un comentario anidable. Vea la cadena de documentación parse-partial-sexp
para más detalles.
* Basado en cero.
Tenga en cuenta que esto no funciona con el modo Org, debe usar esto:
(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
proporciona?parse-partial-sexp
.syntax-ppss
señalaráparse-partial-sexp
, el último de los cuales le dará una descripción de todas las cosas devueltas por estas funciones. Esperemos que eso ayude para empezar.usa la fuente, este es el truco que aprendí de flyspell.
Lo intenté hace
syntax-ppss
dos años, no funciona por dos razones:no funciona en el borde del comentario (límite de comentario), por ejemplo, para comentarios como
// this is comment
en el modo c ++, si coloca el cursor sobre el/
carácter, el resultado de(nth 4 (syntax-ppss))
es nulo.no funciona en absoluto en modo mayor como el modo web
Aquí está el código que copié de flyspell:
Tenga en cuenta que el código podría ampliarse para admitir nuevos modos principales mediante la coincidencia fuzz de la fuente.
He usado este truco durante unos tres años sin fallar. Además, teniendo en cuenta que el flyspell se usa ampliamente durante tanto tiempo, podría afirmar que este método es confiable.
Consulte Qué método abreviado de teclado usar para navegar fuera de una cadena para una pregunta similar.
fuente
POS
argumentos ni usospoint
. Mejor que tener dos de esas versiones es hacer que arg seaPOS
opcional y configurarlo(point)
cuandonil
.