Я пытаюсь добавить специальную разметку к строкам документации Python в emacs (режим python).
В настоящее время я могу извлечь одну строку с помощью:
(font-lock-add-keywords
'python-mode
'(("\\(\"\\{3\\}\\.+\"\\{3\\}\\)"
1 font-lock-doc-face prepend)))
Теперь это работает:
"""Foo"""
Но как только появляется новая строка вроде:
"""
Foo
"""
Больше не работает. Это логично, поскольку . не включает символы новой строки (\n).
Должен ли я использовать класс символов?
Как мне исправить это регулярное выражение, чтобы включить все, что находится между """ """?
Заранее спасибо!





"\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)"
Знак "*?" конструкция - это нежадная версия "*".
Новая строка в регулярных выражениях emacs вводится с помощью C-q C-j, поэтому просто вставьте группу, содержащую. и C-q C-j в ваше регулярное выражение. Поскольку я использую regexp-tool для их создания, мой не полностью цитируется, как ваш, но я надеюсь, что изменения очевидны.
\("\{3\}\(.\|C-qC-j\)+"\{3\}\)
Извините, я не могу отформатировать его лучше, stackoverflow со мной не согласен.
Также он, вероятно, будет отображаться как новая строка в emacs.
Это не так. Для строковых литералов в elisp вы действительно используете \n. При вводе интерактивности регулярного выражения, например, с помощью регулярного выражения isearch, только тогда \n не будет новой строкой, а вместо этого потребуется C-q C-j.
Это работает наполовину:
(font-lock-add-keywords
'python-mode
'(("\\(\"\\{3\\}\\(.\\|\n\\)*?\"\\{3\\}\\)"
1 font-lock-warning-face prepend)))
Но при добавлении RET разметка исчезает.
Предлагаемое регулярное выражение "\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" заставляет мои emacs зависать при открытии файла .py.
Может быть, пора посетить список рассылки emacs ..
@ JoelBorggrén-Franck ошибается, \n в строке Lisp представляет собой новую строку.
Самый лучший и простой способ:
font-lock-add-keywords
'python-mode
'(("\\(\"\\{3\\}\\[^|]*?\"\\{3\\}\\)"
1 font-lock-doc-face prepend)))
Вы можете использовать любой символ, который определенно не находится между "" "и" "" вместо |.
Но нет гарантии, что строка не содержит всех возможных символов ASCII. Поэтому разделитель состоит из трех одинаковых символов. Я полагаю, вы могли бы обойти это с помощью чего-то вроде \\([^\"]+\\(\"[^\"]\\|\"\"[^\"]\\)\\?\\)*
По какой-то странной причине мой emacs зависает при использовании этого регулярного выражения. Зависает на
Loading vc...done