Falten von Python-Docstrings

8

Laut WIKI können Skripte basierend auf der Syntax gefaltet werden. Hat jemand eine Lösung, um Python-Docstrings zu falten?

Grundsätzlich muss ich nur folden """ text between triple quotation marks """:

Geben Sie hier die Bildbeschreibung ein

Vielen Dank.

asv
quelle
1
Möchten Sie neben dem Falten von Python-Code nur Docstrings oder Docstrings falten?
Martin Tournoij
@ Carpetsmoker, nur Docstrings. Bisher war ich nicht in der Lage, eine zuverlässige Python-Faltung zu erzielen, ähnlich wie bei vollwertigen IDEs.
Asv

Antworten:

3

Es gibt ein paar funky Faktoren, die wir beim Spielen mit Falten berücksichtigen sollten (sie sind kompliziert und nicht leicht zu verstehen, ohne in die Dokumente zu graben.)

  • Die Einstellung foldmethodauf syntaxwar mein Problem, als ich gegen Fold kämpfte, aber schauen wir uns die Dokumente an, um weitere Informationen zu erhalten.

SYNTAX- Fold-Syntax

Eine Falte wird durch Syntaxelemente definiert, die das Argument "fold" haben. |: syn-fold |

Die Faltebene wird durch Verschachtelungsfalten definiert. Das Verschachteln von Falten ist mit 'foldnestmax' begrenzt.

Achten Sie darauf, die richtige Syntaxsynchronisierung anzugeben. Wenn dies nicht richtig gemacht wird, können die Falten von der angezeigten Hervorhebung abweichen. Dies ist besonders relevant, wenn Muster verwendet werden, die mehr als einer Zeile entsprechen. Versuchen Sie im Zweifelsfall die Brute-Force-Synchronisierung:

    :syn sync fromstart

Die Hauptsache ist, dass sync fromstartdies ein nützlicher Helfer ist, wenn Sie einen regulären Ausdruck haben, der in der gesamten Datei übereinstimmt und nur den Header abfangen möchte. In Ihrem Fall sollten Sie dies ignorieren können, aber nur etwas, das Sie beachten sollten.

  • Regex-Scannen von oben nach unten

Da das """ziemlich vorhersehbar ist, können wir das vereinfachen startund endso aussehen:

syn region foldImports start='"""' end='"""' fold keepend

Sowohl für die startund endwir versuchen , nur passen auf '"""'(oder regexp) für die Script - Tags. Ich habe den obigen Code nicht getestet, da ich kein großer Python-Typ bin, aber ich wette, Sie können ihn von hier aus herausfinden.

Dan Bradbury
quelle
Vielen Dank! Dies funktioniert nach dem Hinzufügen der Zeile zu ~ / .vim / after / syntax / python.vim und dem manuellen Einstellen foldingmethodauf syntaxin buffer.
ASV
... bricht aber Docstrings-Highlights. Das Leben ist hart.
ASV
verdammt .. Ich persönlich habe die Faltung in meiner Konfiguration mit einem profanen Kommentar zu meinen Gefühlen gegenüber der Funktion deaktiviert: | hoffentlich kann ein bisschen mehr Regex-Hacking die Dinge zum Laufen bringen (ID-Check-Plugins [grep fold keywords], wenn es fast da ist)
Dan Bradbury
Ich habe die Syntaxbereichsdefinitionen unter stackoverflow.com/a/16051080/455009 verwendet, um auf Dokumentzeichenfolgen abzuzielen, die als Kommentare hervorgehoben werden sollen, ohne die normalen Zeichenfolgen in dreifachen Anführungszeichen zu beeinflussen. Probieren Sie diejenigen aus, folddie zu den Optionen hinzugefügt wurden, und es funktioniert ziemlich gut für mich.
Ches
1

Hier ist eine bessere Methode, mit der alle Hervorhebungen in Zeichenfolgen in dreifachen Anführungszeichen beibehalten werden:

syn region  pythonString matchgroup=pythonTripleQuotes 
      \ start=+[uU]\=\z('''\|"""\)+ end="\z1" keepend fold
      \ contains=pythonEscape,pythonSpaceError,pythonDoctest,@Spell

Fügen Sie dies hinzu ~/.vim/after/syntax/python.vim.

Dieser Befehl stammt genau von /usr/share/vim/vim74/syntax/python.vimund hat nur das foldSchlüsselwort hinzugefügt. Warum bleibt die Hervorhebung erhalten, wenn Dans Antwort dies nicht tut? Der Schlüssel ist, dass dies hat:

contains=pythonEscape,pythonSpaceError,pythonDoctest

Normalerweise wendet Vim nur einen Syntaxbereich an, aber contains=Sie können damit feststellen, dass ein Syntaxbereich andere Syntaxbereiche enthalten kann .

Es wird auch als hervorgehoben, Stringweil es tut:

HiLink pythonString           String

Es reicht nicht aus, nur einen Syntaxbereich zu definieren. Sie müssen diesen mit einer Markierungsgruppe verknüpfen .

Martin Tournoij
quelle