Чому основні режими не оглядають обличчя?


10

Під час написання основного режиму часто корисно знати, "чи є точка в рядку?" 'є пункт у коментарі?'.

Здається, більшість основних режимів намагаються проаналізувати мову програмування. Наприклад:

  • python-syntax-content дзвінки syntax-ppss
  • haskell-fill-paragraphдзвінки syntax-ppssтаre-search-forward
  • c-in-comment-line-prefix-p рухається точка навколо і дзвонить looking-at
  • sp-point-in-commentдзвінки, syntax-ppssале також перевіряє, чи він знаходиться на калібрі

Однак у деяких випадках це не працює. У буферах в режимі org коментарі у вихідних блоках за допомогою цих підходів неправильно виявляються.

Це також здається безглуздим, оскільки в буфері вже видно виділені коментарі .

Натомість ви можете просто оглянути обличчя в точці:

(defun wh--get-faces (pos)
  "Get all the font faces at POS."
  (remq nil
        (list
         (get-char-property pos 'read-face-name)
         (get-char-property pos 'face)
         (plist-get (text-properties-at pos) 'face))))

(defun wh-string-p (pos)
  "Return non-nil if POS is inside a string."
  (memq 'font-lock-string-face (wh--get-faces pos)))

Чому основні режими цього не роблять? Буфер вже зафіксований, тому я б очікував, що це буде швидше, надійніше та потребує меншого коду.


1
Мені подобається це питання. Однак що робити, якщо ви не використовуєте font-lock-mode? (Не те, що я думаю, що слід.)
mbork

Відповіді:


12

Проблема в тому, що вона не є більш надійною.

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

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


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

  1. Для початку користувач міг відключити font-lock-mode(можливо, це величезний буфер), але навіть із font-lock-modeувімкненими обличчями дещо нестабільні.

  2. Також у користувача може бути мінорний режим, який додає деякі font-lock-keywords(наприклад, виділення TODOв коментарях). Або може бути мінорний режим, який динамічно застосовує деякі обличчя після того, як блокування шрифту fontificira буфер.

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


2

Я думаю, головна причина в тому, що використовується блокування шрифту syntax-ppss.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.