Regexps в Elisp, чтобы включить новые строки - PullRequest
7 голосов
/ 26 ноября 2008

Я пытаюсь добавить специальную разметку в строки документации Python в emacs (python-mode).

В настоящее время я могу извлечь одну строку с:

(font-lock-add-keywords
 'python-mode
 '(("\\(\"\\{3\\}\\.+\"\\{3\\}\\)"
    1 font-lock-doc-face prepend)))

Это работает сейчас:

"""Foo"""

Но как только появляется новая строка вроде:

"""
Foo

"""

Это больше не работает. Это логично, поскольку . не включает переводы строки (\n). Должен ли я использовать класс символов?

Как я могу исправить это регулярное выражение, чтобы включить все между """ """?

Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 26 ноября 2008
"\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)"

"*?" Конструкция - это не жадная версия "*".

0 голосов
/ 29 августа 2013

Самый лучший и простой способ это:

font-lock-add-keywords
 'python-mode
 '(("\\(\"\\{3\\}\\[^|]*?\"\\{3\\}\\)"
    1 font-lock-doc-face prepend)))

Вместо | .

вы можете использовать любой символ, который явно не находится между "" "и" "".
0 голосов
/ 26 ноября 2008

Это работает наполовину:

(font-lock-add-keywords
     'python-mode
      '(("\\(\"\\{3\\}\\(.\\|\n\\)*?\"\\{3\\}\\)" 
         1 font-lock-warning-face prepend)))

Но при добавлении RET разметка исчезает.

Предлагаемое регулярное выражение "\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" заставляет мой emacs зависать при открытии .py файла.

Может быть, пришло время посетить список рассылки emacs ..

0 голосов
/ 26 ноября 2008

Новая строка в регулярных выражениях emacs вводится C-q C-j, поэтому просто добавьте группу, содержащую. и C-q C-j в ваше регулярное выражение. Поскольку я использую regexp-tool для их создания, мой не полностью указан как ваш, но я надеюсь, что изменения очевидны.

\("\{3\}\(.\| C-Qc-J \)+"\{3\}\)

Извините, я не могу отформатировать его лучше, stackoverflow не согласен со мной.

Также он, вероятно, будет отображаться как новая строка в emacs.

...