2008-11-26 4 views
7

Ich versuche, Python-Dokumentationszeichenfolgen in Emacs (Python-Modus) ein spezielles Markup hinzuzufügen.Regexps in Elisp, um Zeilenumbrüche zu enthalten

Derzeit ich bin in der Lage mit einer einzigen Zeile zu extrahieren:

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

Das funktioniert jetzt:

"""Foo""" 

Aber sobald es ist ein Newline wie:

""" 
Foo 

""" 

Es funktioniert nicht mehr. Dies ist logisch, da . keine Zeilenumbrüche enthält (\n). Sollte ich eine Zeichenklasse verwenden?

Wie kann ich diesen regulären Ausdruck korrigieren, um alles zwischen """ """ einzuschließen?

Vielen Dank im Voraus!

Antwort

2
"\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" 

Das "*?" Konstrukt ist die nicht-gierige Version von "*".

+0

Aus irgendeinem seltsamen Grund hängt meine Emacs, wenn Sie diese Regexp verwenden. Hängt bei 'Loading vc ... done' – wunki

0

Eine neue Zeile in Emacs regexps wird von C-q C-j eingegeben, also kleben Sie einfach eine Gruppe mit. und C-q C-j in deine Regexp. Da ich das regexp-tool nutze, um sie zu erstellen, wird meins nicht vollständig als deins zitiert, aber ich hoffe, dass die Änderungen offensichtlich sind.

\("\{3\}\(.\| C-QC-j \)+"\{3\}\)

Leider habe ich es nicht besser formatiert werden kann, ist nicht Stackoverflow mit mir übereinstimmen.

Auch wird es wahrscheinlich als Newline in Emacs angezeigt.

+0

Dies ist nicht korrekt. Für String-Literale in elisp verwenden Sie '\ n'. Wenn Sie eine Regex-Interaktivität eingeben, z. B. mit einer Regex-Suche, dann ist '\ n' keine neue Zeile, und stattdessen wird' C-q C-j' benötigt. – derekv

0

Das funktioniert Hälfte von:

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

Aber wenn RET ist das Hinzufügen der Markup ist weg.

Die vorgeschlagene Regexp "\\(\"\\{3\\}\\(.*\n?\\)*?\"\\{3\\}\\)" macht meine Emacs hängen beim Öffnen einer .py-Datei.

Vielleicht ist es Zeit, die Emacs-Mailingliste zu besuchen ..

+0

\ n ist nicht Newline in Emacs –

+0

@ JoelBorggren-Franck ist falsch, '\ n' in einer Lisp-Zeichenfolge repräsentiert eine Zeilenumbruch. – tripleee

0

Die beste und einfachste Weg ist diese:

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

Sie können jedes beliebige Zeichen verwenden, die auf jeden Fall nicht zwischen „““und‚‘ist "statt |.

+0

Es kann jedoch nicht garantiert werden, dass die Zeichenfolge nicht alle möglichen ASCII-Zeichen enthält. Deshalb besteht das Trennzeichen aus drei identischen Zeichen.Ich nehme an, Sie könnten es mit etwas wie '\\ ([^ \]] \\ (\ "[^ \"] \\ | \ "\" \ "\\" \\ \\) * ' – tripleee