Quelle est la manière recommandée d'utiliser le pliage Vim pour le code Python

112

Je suis intéressé par l'activation du pliage de code dans Vim pour le code Python. J'ai remarqué plusieurs façons de le faire.

Quelqu'un a-t-il un moyen préféré de plier du code Python dans Vim? C'est à dire,

  • Avez-vous un plugin Vim particulier que vous utilisez et aimez?
  • Utilisez-vous le pliage manuel ou placez-vous des marqueurs dans les commentaires?
  • Y a-t-il d'autres moyens recommandés pour faire le pliage de code pour Python dans Vim?
Paul D. Eden
la source

Réponses:

117

Personnellement, je ne peux pas me convaincre de jeter mon code avec les marqueurs. Je suis devenu assez habitué (et efficace) à l'utilisation du pliage par retrait. Avec mon mappage de la barre d'espace (voir ci-dessous) pour ouvrir / fermer les plis et les commandes zR et zM, je suis chez moi. Parfait pour Python!

set foldmethod=indent
nnoremap <space> za
vnoremap <space> zf
Walter
la source
81
: set foldmethod = indenté en premier. Je cherchais justement cela sur Google et je suis tombé sur votre réponse, très gentil! :)
tmadsen
47
Mon ami a également aimé set foldnestmax=2, de cette façon les méthodes des classes sont repliées, mais les déclarations internes ne le sont pas.
Denilson Sá Maia
9
Je ne sais pas pourquoi le deuxième mappage se trouve dans cette réponse à zf. Il n'est pas utilisé si le pliage par retrait est utilisé. Cependant, si vous effectuez un pliage manuel, le mappage est parfaitement logique. za, cependant, semble être le meilleur moyen d'ouvrir / fermer rapidement les plis. Je recommande également d'utiliser la navigation dans les plis (zk, zj).
Derek Litz
Le vnoremap est bon pour la cartographie manuelle. Dans votre ftplugin, ajoutez set foldmethod = indent pour Python. Ensuite, dans votre .vimrc, définissez foldmethod = manual. Maintenant, vous pouvez vous plier en Python et non-Python avec le mappage de la barre d'espace
Lionel
26

J'utilise ce fichier de syntaxe pour Python. Il définit la méthode de pliage sur la syntaxe et replie toutes les classes et fonctions, mais rien d'autre.


la source
comment plier après le dépliage? Je ne trouve pas le raccourci! tnx
Moj
J'ai essayé ce fichier de syntaxe et cela a fonctionné raisonnablement bien pour la mise en évidence. Mais cela n'a absolument rien fait pour le pliage à froid, quand j'utilise 'zM' rien ne se passe, quand j'utilise 'za' dans une classe j'obtiens le E490 (aucun pli trouvé). Qu'est-ce qui ne va pas?
Dani Gehtdichnixan
+1. Au premier essai, le pliage de code Python (classe, méthode) fonctionne à merveille pour moi. Employez les réponses de Walter ( stackoverflow.com/a/360634/605356 ) à la barre d'espace de carte pour plier les commandes, mais cette solution ne fonctionne pas aussi bien (pour moi) que celle-ci. Merci @Tomas pour la référence.
Johnny Utahh
@DaniGehtdichnixan, vous avez peut-être besoin de: AnsiEsc - regardez cela et je pense que vous trouverez une solution
serup
10

Encore un autre plugin pour plier le code Python. Plutôt simple, gestion des docstrings, et sur le GitHub:

SimpylFold

Prendre plaisir!

iago-lito 'envisage de partir
la source
Cela fonctionne mieux. J'ai arrêté de penser du tout au pliage de code car cela n'a jamais causé de maux de tête.
iankit
@iankit Je souhaite parfois qu'il se plie aussi if, foret whilebloque, n'est-ce pas?
iago-lito 'envisage de quitter
hmm cela pourrait ne pas être très utile je pense. S'il plie ces blocs, on ne sait pas très bien quel est le contenu dans un état plié. Cependant, avec les méthodes et autres blocs nommés, le nom dit tout. Je peux en quelque sorte deviner ce que fait le bloc plié en regardant son nom.
iankit
@iankit je ne sais pas .. j'aimerais essayer. Pourquoi ne pas essayer ? ^ ^
iago-lito 'envisage de quitter
7

Python est bien adapté pour le pliage sur indent, peu pour écrire mon propre code, j'utilise des marqueurs car ils peuvent réduire un document comme vous le souhaitez et peuvent servir de sorte de table des matières. J'ai ceci dans mon vimrc pour basculer entre les deux lorsque je regarde le code de quelqu'un d'autre.

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

la source
5

J'aime vraiment le python_ifoldplugin .

Nick Presta
la source
1
Malheureusement, ce plugin utilise plus de temps processeur que je ne le préférerais (même avec la version a) car j'aime garder mon vim rapide. D'autres suggestions?
Paul
11
Cette réponse a vraiment besoin d'une description.
sixtyfootersdude
3

Pour moi, le pliage idéal est de ne plier que les blocs classet def, le pliage en retrait est trop à mon goût. Je pense qu'une solution élégante est d'utiliser le système de syntaxe comme celui mentionné par Tomas. Cependant, celui-ci est destiné à remplacer le fichier de syntaxe d'origine et il peut finir par être plus ancien que l'original (c'est-à-dire que le script ne mentionne pas la syntaxe Python 3).

Ma solution est de placer dans le ~/.vim/syntaxdossier un fichier nommé python.vimavec juste les lignes importantes (tirées du script ci-dessus):

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

Ensuite, activez simplement le pliage avec :set foldmethod=syntax.

Genma
la source
1
J'aime cette solution. Mais cela ne correspond pas aux «n plis classet defs» s'ils se trouvent au début d'une ligne. Comme je peux à peine lire l'expression, j'ai du mal à la modifier pour qu'elle corresponde à ^defet ^class. C'est curieux car cela \s*devrait bien gérer cela ..
iago-lito 'envisage de quitter
2

La source Python est fournie avec un plugin de syntaxe vim avec un fichier vimrc personnalisé. Consultez la FAQ python sur vim

ONODEVO
la source
2
Ce fichier de syntaxe ne contient PAS non plus d'informations de pliage. Vous ne pouvez donc pas utiliser ce fichier de syntaxe avec un pliage de syntaxe.
KFL
2

Dans votre .vimrc:

set foldmethod=indent
set shiftwidth=4

Puis zMtout masquer zRpour tout développer. J'ai également ajouté:

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>

Vous pouvez donc z1et z2vous désindenter petit à petit.

Tinmarino
la source
2

J'aime vraiment ce petit script vim que j'ai écrit pour .vimrc. Il mappe alt+1pour plier le premier niveau d'indentation python (définitions de classe et fonctions), alt+2pour plier le deuxième niveau (méthodes de classe) et alt+0pour tout déplier. Il s'assure qu'il ne plie qu'un seul niveau et ne plie aucun des sous-niveaux imbriqués. Vous pouvez toujours utiliser zapour basculer le pliage pour le bloc actuel. Notez que dans ^[0, le ^[est altpour mon terminal. Vous n'avez pas beaucoup d'expérience dans le script vim, alors n'hésitez pas à faire des suggestions sur la fonction :)

" 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
la source
1
Pour utiliser les touches alt sur un Mac: stackoverflow.com/questions/7501092/can-i-map-alt-key-in-vim
Mike Bannister