Was ist die empfohlene Methode zur Verwendung der Vim-Faltung für Python-Code?


111

Ich bin daran interessiert, das Falten von Code in Vim für Python-Code zu aktivieren. Ich habe mehrere Möglichkeiten bemerkt, dies zu tun.

Hat jemand eine bevorzugte Methode zum Falten von Python-Code in Vim? Dh

  • Haben Sie ein bestimmtes Vim-Plugin, das Sie verwenden und mögen?
  • Verwenden Sie manuelles Falten oder platzieren Sie Markierungen in Kommentaren?
  • Gibt es noch andere empfohlene Methoden zum Falten von Code für Python in Vim?

Antworten:


117

Persönlich kann ich mich nicht davon überzeugen, meinen Code mit den Markierungen zu verunreinigen. Ich habe mich ziemlich daran gewöhnt (und effizient), Einrückungsfalten zu verwenden. Zusammen mit meiner Zuordnung der Leertaste (siehe unten) zum Öffnen / Schließen von Falten und den Befehlen zR und zM bin ich zu Hause. Perfekt für Python!

nnoremap <space> za

vnoremap <space> zf


81
: setze zuerst foldmethod = indent. Ich habe nur dafür gegoogelt und bin auf deine Antwort gestoßen, sehr nett! :)
tmadsen

47
Meinem Freund hat es auch gefallen set foldnestmax=2, auf diese Weise werden die Methoden der Klassen gefaltet, interne Anweisungen jedoch nicht.
Denilson Sá Maia

9
Ich bin nicht sicher, warum die zweite Zuordnung in dieser Antwort auf zf ist. Es wird nicht verwendet, wenn ein Einrückungsfalten verwendet wird. Wenn Sie jedoch manuell falten, ist das Mapping absolut sinnvoll. za scheint jedoch der beste Weg zu sein, um Falten schnell zu öffnen / schließen. Ich empfehle auch die Verwendung der Faltnavigation (zk, zj).
Derek Litz

Die vnoremap eignet sich für die manuelle Zuordnung. Fügen Sie in Ihrem ftplugin set foldmethod = indent für Python hinzu. Setzen Sie dann in Ihrer .vimrc foldmethod = manual. Jetzt können Sie sowohl Python als auch Nicht-Python mit Spacebar-Mapping
Lionel

26

Ich benutze diese Syntaxdatei für Python. Es setzt die Faltmethode auf Syntax und faltet alle Klassen und Funktionen, aber sonst nichts.


Wie falten Sie nach dem Entfalten? Ich kann die Verknüpfung nicht finden! tnx
Moj

Versuchte diese Syntaxdatei und es funktionierte ziemlich gut für die Hervorhebung. Aber es hat absolut nichts für das Kaltfalten getan, wenn ich 'zM' benutze, passiert nichts, wenn ich 'za' in einer Klasse benutze, bekomme ich das E490 (No Fold found). Was läuft falsch?
Dani Gehtdichnixan

+1. Beim ersten Versuch funktioniert das Falten von Python-Code (Klasse, Methode) wunderbar für mich. Verwenden Sie die Antworten von Walter ( stackoverflow.com/a/360634/605356 ), um die Leertaste zuzuordnen, um Befehle zu falten, aber diese Lösung funktioniert bei weitem nicht so gut (für mich) wie diese. Danke @Tomas für den Hinweis.
Johnny Utahh

@DaniGehtdichnixan, vielleicht brauchen Sie: AnsiEsc - schauen Sie sich das an und ich denke, Sie werden eine Lösung finden
serup

10

Noch ein Plugin zum Falten von Python-Code. Eher einfach, mit Docstrings umzugehen und auf dem GitHub:

SimpylFold

Genießen!


Das funktioniert am besten. Ich habe aufgehört, über das Falten von Code nachzudenken, da es nie Kopfschmerzen verursacht hat.
Iankit

@iankit ich es manchmal wünschen würde auch falten if, forund whileBlöcke, nicht wahr?
iago-lito 'erwägt, den

hmm das ist vielleicht nicht sehr hilfreich ich denke. Wenn er diese Blöcke faltet, ist nicht sehr klar, was der Inhalt im gefalteten Zustand ist. Bei Methoden und anderen benannten Blöcken sagt der Name jedoch alles. Ich kann mir vorstellen, was der gefaltete Block tut, indem ich seinen Namen betrachte.
Iankit

@iankit Ich weiß nicht .. Ich würde es gerne versuchen. Warum nicht versuchen ? ^ ^
verlassen Berücksichtigung iago-lito‘

7

Python eignet sich gut zum Falten auf Einrückungen, zum Schreiben meines eigenen Codes. Ich verwende Markierungen, da sie ein Dokument so zerkleinern können, wie Sie es möchten, und als eine Art Inhaltsverzeichnis dienen können. Ich habe dies in meinem vimrc, um zwischen den beiden zu wechseln, wenn ich jemand anderen Code ansehe.

#Toggle fold methods \fo
let g:FoldMethod = 0
map <leader>fo :call ToggleFold()<cr>
fun! ToggleFold()
    if g:FoldMethod == 0
        exe 'set foldmethod=indent'
        let g:FoldMethod = 1
    else
        exe 'set foldmethod=marker'
        let g:FoldMethod = 0
    endif
endfun
#Add markers (trigger on class Foo line)
nnoremap ,f2 ^wywO#<c-r>0 {{{2<esc>
nnoremap ,f3 ^wywO#<c-r>0 {{{3<esc> 
nnoremap ,f4 ^wywO#<c-r>0 {{{4<esc>
nnoremap ,f1 ^wywO#<c-r>0 {{{1<esc>




3

Für mich ist das ideale Falten, nur die classund defBlöcke zu falten. Einrückungsfalten ist zu viel für meinen Geschmack. Ich denke, eine elegante Lösung besteht darin, das von Tomas erwähnte Syntaxsystem wie dieses zu verwenden . Diese soll jedoch die ursprüngliche Syntaxdatei ersetzen und ist möglicherweise älter als das Original (dh das Skript erwähnt die Python 3-Syntax nicht).

Meine Lösung besteht darin, ~/.vim/syntaxeine Datei python.vimmit nur den wichtigen Zeilen (aus dem obigen Skript) in den Ordner zu legen :

syn match   pythonDefStatement  /^\s*\%(def\|class\)/
       \ nextgroup=pythonFunction skipwhite
syn region  pythonFunctionFold  start="^\z(\s*\)\%(def\|class\)\>"
       \ end="\ze\%(\s*\n\)\+\%(\z1\s\)\@!." fold transparent

hi link pythonDefStatement Statement

Dann einfach die Faltung mit aktivieren :set foldmethod=syntax.


1
Ich mag diese Lösung. Aber es passt nicht zu 'n falten classes und defs, wenn sie am Anfang einer Zeile stehen. Da ich den Ausdruck kaum lesen kann, habe ich Probleme, ihn zu optimieren, um ihn anzupassen ^defund ^class. Dies ist jedoch merkwürdig, da \s*es gut damit umgehen sollte.
iago-lito 'erwägt, den

2

Die Python-Quelle enthält ein Vim-Syntax-Plugin sowie eine benutzerdefinierte Vimrc-Datei. Überprüfen Sie die Python-FAQ auf vim


2
Diese Syntaxdatei enthält auch KEINE Faltinformationen. Sie können diese Syntaxdatei also nicht mit Syntaxfaltung verwenden.
KFL

2

In Ihrem .vimrc:

set foldmethod=indent
set shiftwidth=4

Dann zMalle maskieren, um alle zRzu erweitern. Ich fügte hinzu:

nnoremap <space> za
vnoremap <space> zf
map z1  :set foldlevel=0<CR><Esc>
map z2  :set foldlevel=1<CR><Esc>
map z3  :set foldlevel=2<CR><Esc>
map z4  :set foldlevel=3<CR><Esc>
map z5  :set foldlevel=4<CR><Esc>
map z6  :set foldlevel=5<CR><Esc>
map z7  :set foldlevel=6<CR><Esc>
map z8  :set foldlevel=7<CR><Esc>
map z9  :set foldlevel=8<CR><Esc>

So können Sie z1und z2nach und nach unaufmerksam.


2

Ich mag dieses kleine Vim-Skript, das ich für .vimrc geschrieben habe, sehr. Es wird abgebildet alt+1, um die erste Python-Einzugsebene (Klassendefinitionen und -funktionen) alt+2zu falten, die zweite Ebene (Klassenmethoden) zu falten und alt+0alles zu entfalten. Es stellt sicher, dass nur eine Ebene gefaltet wird und keine der verschachtelten Unterebenen gefaltet wird. Sie können weiterhin die zaFaltung für den aktuellen Block umschalten. Beachten Sie, dass in ^[0die ^[ist altfür meinen Terminal. Sie haben nicht viel Erfahrung mit VIM-Skripten. Sie können also gerne Vorschläge zur Funktion machen :)

" Python folding
nnoremap ^[0 zR<CR>
nnoremap ^[1 :call Fold(0)<CR>
nnoremap ^[2 :call Fold(1)<CR>
function Fold(level)
    :let b:max = a:level + 1
    :set foldmethod=indent
    :execute 'set foldnestmax='.b:max
    :execute 'set foldlevel='.a:level
endfunction

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.