При написании основного режима часто полезно знать, «находится ли точка в строке?» 'это точка в комментарии?'
Большинство основных режимов, кажется, пытаются разобрать язык программирования. Например:
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)))
Почему основные режимы не делают это? Буфер уже определен, поэтому я ожидаю, что он будет быстрее, надежнее и потребует меньше кода.
major-mode
syntax-highlighting
Уилфред Хьюз
источник
источник
font-lock-mode
? (Не то, что я думаю, что вы должны.)Ответы:
Проблема в том, что он не более надежный.
Во-первых, основные режимы - это именно те, которые отвечают за решение, что такое комментарий или строка. Если они смогли успешно определить их для блокировки шрифтов, они должны сделать то же самое для других целей.
Во-вторых, чтение синтаксиса для определения контекста, внутри которого находится точка, является более надежным способом сделать это, если все сделано правильно. Если вы обнаружили случаи, когда это не помогло, стоит отправить отчет об ошибке автору основного режима.
Причина, по которой проверка лиц менее надежна, заключается в том, что в некоторых ситуациях она может потерпеть неудачу.
Для начала, пользователь мог отключить
font-lock-mode
(может быть, это огромный буфер), но даже сfont-lock-mode
включенным, лица несколько нестабильны.Кроме того, пользователь может иметь дополнительный режим, который добавляет некоторые
font-lock-keywords
(например, выделениеTODO
в комментариях). Или может быть второстепенный режим, который динамически применяет некоторые грани после того, как font-lock определит буфер.Таким образом, основной режим не гарантирует, что грани, определенные им, являются гранями, применяемыми в настоящее время.
источник
Я думаю, главная причина в том, что используется font-lock
syntax-ppss
.источник