Відповіді:
Перевірте четверте значення * у списку, поверненому 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, останній з яких дасть вам опис усіх речей, повернених цими функціями. Сподіваємось, це допомагає для початку.
скористайтеся шрифтом, це фокус, який я навчився з 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))))
Зверніть увагу, що код може бути розширений, щоб підтримувати нові основні режими шляхом нечітких граней шрифту
Я використовував цю хитрість близько трьох років безвідмовно. Крім того, враховуючи, що маховик широко використовується так довго, я можу стверджувати, що цей метод є надійним.
Дивіться, яку комбінацію клавіш використовувати для навігації з рядка для подібного питання.
POSмістить аргументів і не використовує point. Краще, ніж мати дві такі версії, - зробити аргумент POSнеобов’язковим і встановити його(point) коли nil.
syntax-ppssнадається?