Réponses:
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)))))
parse-partial-sexp
.
syntax-ppss
vous indiquera parse-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:
(defun evilnc--in-comment-p (&optional pos)
"Test if character at POS is comment. If POS is nil, character at `(point)' is tested"
(interactive)
(unless pos (setq pos (point)))
(let* ((fontfaces (get-text-property pos 'face)))
(when (not (listp fontfaces))
(setf fontfaces (list fontfaces)))
(delq nil
(mapcar #'(lambda (f)
;; learn this trick from flyspell
(or (eq f 'font-lock-comment-face)
(eq f 'font-lock-comment-delimiter-face)))
fontfaces))))
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.
POS
argument et utilise point
. Mieux que d'avoir deux de ces versions est de rendre arg POS
optionnel et de le mettre à (point)
quand nil
.
syntax-ppss
fournies?