Qual è il modo consigliato per utilizzare Vim Folding per il codice Python


112

Sono interessato ad abilitare la piegatura del codice in Vim per il codice Python. Ho notato diversi modi per farlo.

Qualcuno ha un modo preferito per piegare il codice Python in Vim? Vale a dire,

  • Hai un plugin Vim in particolare che usi e che ti piace?
  • Usi la piegatura manuale o metti dei pennarelli nei commenti?
  • Qualche altro modo consigliato per piegare il codice per Python in Vim?

Risposte:


117

Personalmente non riesco a convincermi a sporcare il mio codice con i pennarelli. Sono diventato abbastanza abituato (ed efficiente) all'uso della piegatura dei rientri. Insieme alla mia mappatura della barra spaziatrice (vedi sotto) per aprire / chiudere le pieghe e ai comandi zR e zM, sono a casa. Perfetto per Python!

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

81
: imposta prima foldmethod = indent. Stavo cercando su Google proprio questo e sono incappato nella tua risposta, molto gentile! :)
tmadsen

47
Anche al mio amico è piaciuto set foldnestmax=2, in questo modo i metodi delle classi sono piegati, ma le dichiarazioni interne no.
Denilson Sá Maia,

9
Non sono sicuro del motivo per cui la seconda mappatura è in questa risposta a zf. Non viene utilizzato se si utilizza la piegatura del rientro. Tuttavia, se stai facendo piegatura manuale, la mappatura ha perfettamente senso. za, tuttavia, sembra essere il modo migliore per aprire / chiudere rapidamente le pieghe. Consiglio anche di utilizzare la navigazione pieghevole (zk, zj).
Derek Litz

La vnoremap è utile per la mappatura manuale. Nel tuo ftplugin, aggiungi set foldmethod = indent per Python. Quindi, nel tuo .vimrc, imposta foldmethod = manual. Ora puoi piegare sia in Python che non in Python con la mappatura della barra spaziatrice
Lionel,

26

Uso questo file di sintassi per Python. Imposta il metodo di piegatura sulla sintassi e piega tutte le classi e le funzioni, ma nient'altro.


come piegare dopo l'apertura? Non riesco a trovare la scorciatoia! tnx
Moj

Ho provato questo file di sintassi e ha funzionato abbastanza bene per l'evidenziazione. Ma non ha fatto assolutamente nulla per il cold fold, quando uso 'zM' non succede nulla, quando uso 'za' in una classe ottengo l'E490 (No Fold found). Cosa sta andando storto?
Dani Gehtdichnixan

+1. Al primo tentativo, la piegatura del codice Python (classe, metodo) funziona meravigliosamente per me. Utilizza le risposte di Walter ( stackoverflow.com/a/360634/605356 ) per mappare la barra spaziatrice per piegare i comandi, ma quella soluzione non funziona così bene (per me) come questa. Grazie @Tomas per il riferimento.
Johnny Utahh

@DaniGehtdichnixan, forse hai bisogno di: AnsiEsc - esaminalo e penso che troverai una soluzione
serup

10

Ancora un altro plugin per piegare il codice Python. Piuttosto semplice, gestendo le docstring e su GitHub:

SimpylFold

Godere!


Funziona meglio. Ho smesso di pensare alla piegatura del codice poiché non ha mai causato mal di testa.
iankit

@iankit A volte vorrei che sarebbe anche piegare if, fore whileblocchi, non è vero?
iago-lito 'considerando di lasciare il

hmm che potrebbe non essere molto utile penso. Se piega questi blocchi, non è molto chiaro quale sia il contenuto mentre si trova in uno stato piegato. Tuttavia, con metodi e altri blocchi denominati il ​​nome dice tutto. Posso quasi indovinare cosa sta facendo il blocco piegato guardando il suo nome.
iankit

@iankit non lo so .. mi piacerebbe provare. Perché non provarci ? ^ ^
iago-lito 'considerando di lasciare il

7

Python è adatto per ripiegare sul rientro, un po 'per scrivere il mio codice Uso i marcatori in quanto possono scricchiolare un documento nel modo in cui lo desideri e possono servire come una sorta di sommario. Ho questo nel mio vimrc per passare da uno all'altro quando visualizzo il codice di qualcun altro.

#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>


5

Mi piace molto il python_ifoldplugin .


1
Sfortunatamente, questo plugin utilizza più tempo del processore di quanto preferirei (anche con la versione a) poiché mi piace mantenere il mio vim veloce. Qualche altro suggerimento?
Paul D.Eden,

11
Questa risposta ha davvero bisogno di una descrizione.
sixtyfootersdude


3

Per me la piegatura ideale è piegare solo i blocchi classe def, la piegatura del rientro è troppo per i miei gusti. Penso che una soluzione elegante è quella di utilizzare il sistema di sintassi come questo uno menzionata da Tomas. Tuttavia, questo ha lo scopo di sostituire il file di sintassi originale e potrebbe finire per essere più vecchio dell'originale (cioè quello script non menziona la sintassi di Python 3).

La mia soluzione è inserire nella ~/.vim/syntaxcartella un file denominato python.vimsolo con le righe importanti (prese dallo script sopra):

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

Quindi attivare semplicemente la piegatura con :set foldmethod=syntax.


1
Mi piace questa soluzione. Ma non corrisponde alle n pieghe classes defse si trovano all'inizio di una riga. Dal momento che riesco a malapena a leggere l'espressione, sono nei guai cercando di modificarla per abbinare ^defe ^class. Questo è curioso però visto che \s*dovrebbe affrontare bene questo ..
iago-lito 'considerando di lasciare il

2

Il sorgente Python viene fornito con un plug-in di sintassi vim insieme a un file vimrc personalizzato. Controlla le FAQ di python su vim


2
Anche questo file di sintassi NON contiene informazioni sulla piegatura. Quindi non puoi usare questo file di sintassi con la piegatura della sintassi.
KFL

2

Nel tuo .vimrc:

set foldmethod=indent
set shiftwidth=4

Quindi zMmascherare tutto zRper espandere tutto. Ho anche aggiunto:

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>

Quindi puoi z1e z2disindentarlo a poco a poco.


2

Mi piace molto questo piccolo script vim che ho scritto per .vimrc. Mappa alt+1per piegare il primo livello di rientro Python (definizioni di classe e funzioni), alt+2per piegare il secondo livello (metodi di classe) e alt+0per spiegare tutto. Si assicura che pieghi solo un livello e non pieghi nessuno dei sottolivelli annidati. È ancora possibile utilizzare zaper attivare / disattivare la piegatura per il blocco corrente. Nota che in ^[0, ^[è altper il mio terminale. Non ho molta esperienza con gli script vim, quindi sentiti libero di dare suggerimenti sulla funzione :)

" 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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.