Як визначити, чи точка в межах коментаря?


15

Як визначити, чи точка в межах коментаря?

Відповіді:


19

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

2
Так, це в docstring для parse-partial-sexp.
legoscia

2
@Name: docstring for syntax-ppssвкаже на вас parse-partial-sexp, останній з яких дасть вам опис усіх речей, повернених цими функціями. Сподіваємось, це допомагає для початку.
Дан

1
Дивіться також розділ 34.6 "Розбір виразів" у посібнику Emacs Lisp.
Сью Д. Німма

7

скористайтеся шрифтом, це фокус, який я навчився з 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))))

Зверніть увагу, що код може бути розширений, щоб підтримувати нові основні режими шляхом нечітких граней шрифту

Я використовував цю хитрість близько трьох років безвідмовно. Крім того, враховуючи, що маховик широко використовується так довго, я можу стверджувати, що цей метод є надійним.

Дивіться, яку комбінацію клавіш використовувати для навігації з рядка для подібного питання.


1
Для редагування запропонована інша версія, яка не POSмістить аргументів і не використовує point. Краще, ніж мати дві такі версії, - зробити аргумент POSнеобов’язковим і встановити його(point) коли nil.
Дрю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.