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