Jaki jest zalecany sposób używania zwijania Vima dla kodu Pythona


112

Jestem zainteresowany włączeniem zwijania kodu w Vimie dla kodu Python. Zauważyłem wiele sposobów, aby to zrobić.

Czy ktoś ma preferowany sposób na zwijanie kodu Pythona w Vimie? To znaczy,

  • Czy masz konkretną wtyczkę Vima, której używasz i lubisz?
  • Czy używasz ręcznego składania, czy umieszczasz znaczniki w komentarzach?
  • Jakieś inne zalecane sposoby zwijania kodu dla Pythona w Vimie?

Odpowiedzi:


117

Osobiście nie mogę się przekonać, żeby zaśmiecać swój kod markerami. Przyzwyczaiłem się (i wydajnie) do składania wcięć. Wraz z mapowaniem spacji (patrz poniżej) do otwierania / zamykania fałd oraz poleceń zR i zM, jestem w domu. Idealne dla Pythona!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf

81
: ustaw foldmethod = najpierw wcięcie. Właśnie to szukałem w Google i natknąłem się na twoją odpowiedź, bardzo ładnie! :)
tmadsen

47
Koledze też podobało się set foldnestmax=2, że w ten sposób metody klas są zawijane, ale wewnętrzne instrukcje nie.
Denilson Sá Maia

9
Nie jestem pewien, dlaczego drugie mapowanie znajduje się w tej odpowiedzi na zf. Nie jest używane, jeśli jest używane składanie wcięć. Jeśli jednak składasz ręcznie, mapowanie ma sens. za wydaje się być najlepszym sposobem na szybkie otwieranie / zamykanie fałd. Polecam również korzystanie z fold nawigacji (zk, zj).
Derek Litz

Vnoremap nadaje się do ręcznego mapowania. W swoim ftplugin dodaj set foldmethod = indent dla Pythona. Następnie w swoim .vimrc ustaw foldmethod = manual. Teraz możesz spasować zarówno w Pythonie, jak i nie-Pythonie z mapowaniem spacji
Lionel

26

Używam tego pliku składni dla Pythona. Ustawia metodę składania na składnię i składa wszystkie klasy i funkcje, ale nic więcej.


jak złożyć po rozłożeniu? Nie mogę znaleźć skrótu! tnx
Moj

Wypróbowałem ten plik składni i działał całkiem dobrze w przypadku podświetlania. Ale nie zrobiło to absolutnie nic w przypadku składania na zimno, kiedy używam 'zM', nic się nie dzieje, kiedy używam 'za' w klasie, otrzymuję E490 (nie znaleziono fold). Co się dzieje?
Dani Gehtdichnixan

+1. Na pierwszy rzut oka składanie kodu (klasy, metody) w Pythonie działa wspaniale. Zastosuj odpowiedzi Waltera ( stackoverflow.com/a/360634/605356 ), aby przypisać spację do poleceń zwijania, ale to rozwiązanie nie działa tak dobrze (dla mnie) jak to. Dzięki @Tomas za odniesienie.
Johnny Utahh

@DaniGehtdichnixan, być może potrzebujesz: AnsiEsc - spójrz na to i myślę, że znajdziesz rozwiązanie
serup

10

Kolejna wtyczka do składania kodu Pythona. Raczej proste, obsługa ciągów dokumentów i na GitHub:

SimpylFold

Cieszyć się!


To działa najlepiej. W ogóle przestałem myśleć o zwijaniu kodu, ponieważ nigdy nie powodowało to bólu głowy.
iankit

@iankit Czasami żałuję, że to również krotnie if, fora whilebloki, prawda?
iago-lito 'rozważa wyjazd

hmm myślę, że to może nie być zbyt pomocne. Jeśli złoży te bloki, nie jest jasne, jaka jest zawartość w stanie złożonym. Jednak w przypadku metod i innych nazwanych bloków nazwa mówi wszystko. Mogę się domyślić, co robi zwinięty klocek, patrząc na jego nazwę.
iankit

@iankit Nie wiem… Chciałbym spróbować. Dlaczego nie spróbować ? ^ ^
iago-lito 'rozważa opuszczenie

7

Python dobrze nadaje się do zawijania na wcięciu, trochę do pisania własnego kodu. Używam znaczników, ponieważ mogą one skrócić dokument tak, jak chcesz i mogą służyć jako rodzaj spisu treści. Mam to w moim vimrc, aby przełączać się między nimi, gdy przeglądam kod kogoś innego.

#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

Dla mnie idealnym składaniem jest składanie samych klocków classi def, jak na mój gust zbyt duże jest zaginanie wcięć. Myślę, że jednym eleganckim rozwiązaniem jest stosowanie systemu składni jak ten jeden wspomniany przez Tomas. Jednak ten ma na celu zastąpienie oryginalnego pliku składni i może skończyć się starszym niż oryginalny (tj. Ten skrypt nie wspomina o składni Pythona 3).

Moim rozwiązaniem jest umieszczenie w ~/.vim/syntaxfolderze pliku o nazwie python.vimzawierającej tylko ważne linie (wzięte z powyższego skryptu):

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

Następnie po prostu aktywuj składanie za pomocą :set foldmethod=syntax.


1
Podoba mi się to rozwiązanie. Ale nie pasuje do 'n fold classes i defs, jeśli stoją na początku linii. Ponieważ prawie nie potrafię odczytać wyrażenia, mam kłopoty z próbą dostosowania go, aby dopasować ^defi ^class. Jest to jednak ciekawe, ponieważ \s*powinno dobrze sobie z tym poradzić ..
iago-lito 'rozważa wyjazd

2

Źródło Pythona jest dostarczane z wtyczką składni vim wraz z niestandardowym plikiem vimrc. Sprawdź FAQ Pythona na vimie


2
Ten plik składni NIE zawiera również informacji zwijanych. Więc nie możesz użyć tego pliku składni ze składaniem składni.
KFL,

2

W twoim .vimrc:

set foldmethod=indent
set shiftwidth=4

Następnie zMzamaskuj wszystko, zRaby wszystko rozwinąć. Dodałem również:

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>

Więc możesz z1i z2stopniowo cofać się.


2

Bardzo podoba mi się ten mały skrypt vim, który napisałem dla .vimrc. Mapuje alt+1zawinięcie pierwszego poziomu wcięcia Pythona (definicje klas i funkcje), alt+2zawinięcie drugiego poziomu (metody klas) i alt+0rozwinięcie wszystkiego. Upewnia się, że składa tylko jeden poziom i nie pasuje do żadnego z zagnieżdżonych poziomów podrzędnych. Nadal możesz używać zado przełączania składania dla bieżącego bloku. Zauważ, że w ^[0programie ^[jest altdla mojego terminala. Nie masz dużego doświadczenia w skryptach vim, więc nie wahaj się sugerować funkcji :)

" 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

1
Aby używać klawiszy alt na komputerze Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
Mike Bannister
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.