Ответы:
Проверьте четвертое значение * в списке, возвращаемом syntax-ppss:
(nth 4 (syntax-ppss))
Это nilесли точка находится за пределами любого комментария, tесли он находится внутри нестабильного комментария, или целое число (глубина вложения), если он находится внутри нестабильного комментария. Смотрите документацию parse-partial-sexpдля более подробной информации.
* На основе нуля.
Обратите внимание, что это не работает с Org-режимом, вы должны использовать это:
(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вас укажет parse-partial-sexp, последняя из которых даст вам описание всего, что возвращается этими функциями. Надеюсь, это поможет для начала.
используйте font-face, это трюк, который я узнал из flyspell.
Я пробовал syntax-ppssдва года назад, это не работает по двум причинам:
не работает с краем комментария (предел комментария), например, для комментария, как // this is commentв режиме c ++ - если вы поместите курсор на /символ, результат будет (nth 4 (syntax-ppss))равен нулю.
вообще не работает в мажорном режиме, как в веб-режиме
Вот код, который я скопировал с 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))))
Обратите внимание, что код может быть расширен для поддержки новых основных режимов путем нечеткого соответствия шрифта.
Я использовал этот трюк около трех лет без сбоев. Кроме того, учитывая, что flyspell широко используется так долго, я могу утверждать, что этот метод является надежным.
Посмотрите, какое сочетание клавиш использовать для перехода из строки для аналогичного вопроса.
POSаргументов и использует point. Лучше, чем две такие версии, сделать arg POSнеобязательным и установить его (point)когда nil.
syntax-ppssпредоставляет?