Comment détecter si le point se trouve dans une zone de commentaire?
15
Vérifiez la quatrième valeur * dans la liste renvoyée par syntax-ppss
:
(nth 4 (syntax-ppss))
C'est nil
si le point est en dehors de tout commentaire, t
s'il est à l'intérieur d'un commentaire non imbriqué, ou un entier (la profondeur d'imbrication) s'il est à l'intérieur d'un commentaire emboîtable. Voir la docstring parse-partial-sexp
pour plus de détails.
* Basé sur zéro.
Notez que cela ne fonctionne pas avec le mode Org, vous devez utiliser ceci:
(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
fournies?parse-partial-sexp
.syntax-ppss
vous indiqueraparse-partial-sexp
, ce dernier vous donnera une description de toutes les choses retournées par ces fonctions. J'espère que cela vous aidera pour commencer.utiliser la police, c'est l'astuce que j'ai apprise de flyspell.
J'ai essayé
syntax-ppss
il y a deux ans, ça ne marche pas pour deux raisons:ne fonctionne pas sur le bord du commentaire (limite de commentaire), par exemple, pour un commentaire comme
// this is comment
en mode c ++ -, si vous placez le curseur sur le/
caractère, le résultat de(nth 4 (syntax-ppss))
est nul.ne fonctionne pas du tout en mode majeur comme le mode web
Voici le code que j'ai copié de flyspell:
Veuillez noter que le code pourrait être étendu pour prendre en charge de nouveaux modes principaux en faisant correspondre la face de la police.
J'utilise cette astuce depuis environ trois ans sans échec. De plus, étant donné que flyspell est largement utilisé depuis si longtemps, je pourrais affirmer que cette méthode est fiable.
Voir Quel raccourci clavier utiliser pour naviguer hors d'une chaîne pour une question similaire.
la source
POS
argument et utilisepoint
. Mieux que d'avoir deux de ces versions est de rendre argPOS
optionnel et de le mettre à(point)
quandnil
.