Відповіді:
Перевірте четверте значення * у списку, поверненому 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
надається?