Почему основные режимы просто не проверяют лица?

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в комментариях). Или может быть второстепенный режим, который динамически применяет некоторые грани после того, как font-lock определит буфер.

Таким образом, основной режим не гарантирует, что грани, определенные им, являются гранями, применяемыми в настоящее время.

Malabarba
источник
2

Я думаю, главная причина в том, что используется font-lock syntax-ppss.

Стефан
источник