Qual é a maneira recomendada de usar a dobragem do Vim para código Python

112

Estou interessado em habilitar o dobramento de código no Vim para código Python. Tenho notado várias maneiras de fazer isso.

Alguém tem uma maneira preferencial de dobrar código Python no Vim? Ou seja,

  • Você tem um plugin Vim específico que você usa e gosta?
  • Você usa dobra manual ou coloca marcadores nos comentários?
  • Alguma outra maneira recomendada de dobrar código para Python no Vim?
Paul D. Eden
fonte

Respostas:

117

Pessoalmente, não consigo me convencer a bagunçar meu código com os marcadores. Eu me acostumei (e eficiente) no uso de dobradura por recuo. Junto com meu mapeamento da barra de espaço (veja abaixo) para abrir / fechar dobras e os comandos zR e zM, estou em casa. Perfeito para Python!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf
Walter
fonte
81
: defina foldmethod = indent primeiro. Eu estava pesquisando exatamente por isso e tropecei na sua resposta, muito bom! :)
tmadsen
47
Meu amigo também gostou set foldnestmax=2, desta forma os métodos das classes são dobrados, mas os comandos internos não.
Denilson Sá Maia
9
Não tenho certeza de por que o segundo mapeamento está nesta resposta a zf. Não é usado se a dobra por indentação estiver sendo usada. No entanto, se você estiver fazendo dobra manual, o mapeamento faz todo o sentido. za, no entanto, parece ser a melhor maneira de abrir / fechar dobras rapidamente. Eu também recomendo o uso de navegação dobrável (zk, zj).
Derek Litz
O vnoremap é bom para mapeamento manual. Em seu ftplugin, adicione set foldmethod = indent para Python. Então, em seu .vimrc, defina foldmethod = manual. Agora, você pode dobrar em Python e não Python com mapeamento de barra de espaço
Lionel
26

Eu uso este arquivo de sintaxe para Python. Ele define o método de dobramento para a sintaxe e dobra todas as classes e funções, mas nada mais.


fonte
como dobrar após o desdobramento? Não consigo encontrar o atalho! tnx
Moj
Tentei este arquivo de sintaxe e funcionou razoavelmente bem para o realce. Mas não fez absolutamente nada para a dobra a frio, quando eu uso 'zM' nada acontece, quando eu uso 'za' em uma aula eu obtenho o E490 (nenhuma dobra encontrada). O que está errado?
Dani Gehtdichnixan
+1. Na primeira tentativa, a dobragem de código Python (classe, método) funciona maravilhosamente para mim. Empregue as respostas de Walter ( stackoverflow.com/a/360634/605356 ) para mapear a barra de espaço para comandos de dobra, mas essa solução não funciona tão bem (para mim) como esta. Obrigado @Tomas pela referência.
Johnny Utahh
@DaniGehtdichnixan, talvez você precise: AnsiEsc - analise isso e acho que você encontrará uma solução
serup
10

Mais um plugin para dobrar código Python. Bastante simples, manipulando docstrings e no GitHub:

SimpylFold

Aproveitar!

iago-lito 'pensando em sair
fonte
Isso funciona melhor. Parei de pensar em dobrar código, pois isso nunca causou dor de cabeça.
iankit
@iankit Às vezes eu desejo que também iria dobrar if, fore whileblocos, não é?
iago-lito 'considerando deixar
Hmm isso pode não ser muito útil, eu acho. Se ele dobrar esses blocos, não ficará muito claro qual é o conteúdo enquanto estiver dobrado. No entanto, com métodos e outros blocos nomeados, o nome diz tudo. Posso meio que adivinhar o que o bloco dobrado está fazendo olhando seu nome.
iankit
@iankit não sei .. gostaria de experimentar. Por que não tentar ? ^ ^
iago-lito 'considerando sair de
7

Python é bem adequado para dobrar em indentação, pouco para escrever meu próprio código. Eu uso marcadores, pois eles podem processar um documento da maneira que você quiser e podem servir como uma espécie de índice analítico. Eu tenho isso no meu vimrc para alternar entre os dois quando estou visualizando o código de outra pessoa.

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

fonte
5

Eu realmente gosto do python_ifoldplugin .

Nick Presta
fonte
1
Infelizmente, este plugin usa mais tempo de processador do que eu preferiria (mesmo com a versão a), pois gosto de manter meu vim rápido. Alguma outra sugestão?
Paul D. Eden
11
Essa resposta realmente precisa de uma descrição.
sixtyfootersdude
3

Para mim, a dobradura ideal é dobrar apenas os blocos classe def, dobrar recuado é demais para o meu gosto. Eu acho que uma solução elegante é usar o sistema de sintaxe como esta uma mencionado por Tomas. No entanto, este deve substituir o arquivo de sintaxe original e pode acabar sendo mais antigo que o original (ou seja, esse script não menciona a sintaxe do Python 3).

Minha solução é colocar na ~/.vim/syntaxpasta um arquivo nomeado python.vimapenas com as linhas importantes (retiradas do script acima):

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

Em seguida, basta ativar o dobramento com :set foldmethod=syntax.

Genma
fonte
1
Eu gosto dessa solução. Mas não corresponde a 'n dobras classe defs se eles estiverem no início de uma linha. Como mal consigo ler a expressão, estou com problemas para tentar ajustá-la para corresponder a ^defe ^class. Isso é curioso, já que \s*deve lidar bem com isso ..
iago-lito 'considerando deixar
2

A fonte Python vem com um plugin de sintaxe vim junto com um arquivo vimrc customizado. Verifique o FAQ do python no vim

ONODEVO
fonte
2
Este arquivo de sintaxe também NÃO contém informações de dobramento. Portanto, você não pode usar este arquivo de sintaxe com dobramento de sintaxe.
KFL
2

Em seu .vimrc:

set foldmethod=indent
set shiftwidth=4

Então, zMmascarar tudo zRpara expandir tudo. Eu também adicionei:

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>

Então você pode z1e z2desamarrar aos poucos.

Tinmarino
fonte
2

Eu realmente gosto deste pequeno script vim que escrevi para .vimrc. Ele mapeia alt+1para dobrar o primeiro nível de recuo python (definições e funções de classe), alt+2para dobrar o segundo nível (métodos de classe) e alt+0para desdobrar tudo. Isso garante que ele dobre apenas um nível e não dobre nenhum dos subníveis aninhados. Você ainda pode usar zapara alternar a dobra para o bloco atual. Observe que em ^[0, o ^[é altpara o meu terminal. Não tenho muita experiência em script vim, então fique à vontade para fazer sugestões sobre a função :)

" 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
Grant Buster
fonte
1
Para usar as teclas alt em um Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
Mike Bannister