Ответы:
Проверьте четвертое значение * в списке, возвращаемом 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
предоставляет?