¿Cuál es la forma recomendada de usar el plegado de Vim para el código Python?


112

Estoy interesado en habilitar el plegado de código en Vim para el código Python. He notado varias formas de hacerlo.

¿Alguien tiene una forma preferida de plegar código Python en Vim? Es decir,

  • ¿Tiene un complemento de Vim en particular que usa y le gusta?
  • ¿Utiliza el plegado manual o coloca marcadores en los comentarios?
  • ¿Alguna otra forma recomendada de plegar código para Python en Vim?

Respuestas:


117

Personalmente, no puedo convencerme de ensuciar mi código con los marcadores. Me he acostumbrado bastante (y soy eficiente) a usar el pliegue de sangría. Junto con mi mapeo de la barra espaciadora (ver más abajo) para abrir / cerrar pliegues y los comandos zR y zM, estoy en casa. ¡Perfecto para Python!

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

81
: establezca foldmethod = sangría primero. Estaba buscando en Google solo esto y me topé con tu respuesta, ¡muy agradable! :)
tmadsen

47
A mi amigo también le gustó set foldnestmax=2, de esta manera los métodos de las clases se pliegan, pero las declaraciones internas no.
Denilson Sá Maia

9
No estoy seguro de por qué el segundo mapeo está en esta respuesta a zf. No se utiliza si se utiliza el pliegue de sangría. Sin embargo, si está haciendo un plegado manual, el mapeo tiene mucho sentido. za, sin embargo, parece ser la mejor manera de abrir / cerrar pliegues rápidamente. También recomiendo usar la navegación plegable (zk, zj).
Derek Litz

Vnoremap es bueno para el mapeo manual. En su ftplugin, agregue set foldmethod = indent para Python. Luego, en su .vimrc, configure foldmethod = manual. Ahora, puede plegar en Python y no Python con el mapeo de la barra espaciadora
Lionel

26

Utilizo este archivo de sintaxis para Python. Establece el método de plegado en sintaxis y plega todas las clases y funciones, pero nada más.


¿Cómo doblar después de desplegar? ¡No encuentro el atajo! tnx
Moj

Probé este archivo de sintaxis y funcionó razonablemente bien para el resaltado. Pero no hizo absolutamente nada para el plegado en frío, cuando uso 'zM' no pasa nada, cuando uso 'za' en una clase, obtengo el E490 (No se encontró ningún pliegue). ¿Qué va mal?
Dani Gehtdichnixan

+1. En el primer intento, el plegado de código Python (clase, método) funciona maravillosamente para mí. Emplee las respuestas de Walter ( stackoverflow.com/a/360634/605356 ) para asignar la barra espaciadora para plegar comandos, pero esa solución no funciona tan bien (para mí) como esta. Gracias @Tomas por la referencia.
Johnny Utahh

@DaniGehtdichnixan, quizás necesites: AnsiEsc - mira eso y creo que encontrarás una solución
serup

10

Otro complemento más para plegar código Python. Bastante simple, maneja cadenas de documentos y en GitHub:

SimpylFold

¡Disfrutar!


Esto funciona mejor. Dejé de pensar en el plegado de código, ya que nunca me ha causado ningún dolor de cabeza.
iankit

@iankit veces me gustaría que también se retiraría if, fory whilebloques, que no sé?
iago-lito 'considerando irse el

hmm, creo que eso podría no ser muy útil. Si dobla estos bloques, no está muy claro cuál es el contenido mientras está doblado. Sin embargo, con los métodos y otros bloques con nombre, el nombre lo dice todo. Puedo adivinar qué está haciendo el bloque plegado mirando su nombre.
iankit

@iankit No lo sé ... Me gustaría intentarlo. ¿Por qué no intentarlo ? ^ ^
iago-lito 'considerando dejar el

7

Python es muy adecuado para doblar la sangría, pero para escribir mi propio código, uso marcadores, ya que pueden procesar un documento de la forma que desee y pueden servir como una especie de tabla de contenido. Tengo esto en mi vimrc para alternar entre los dos cuando veo el código de otra persona.

#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

Para mí, el plegado ideal es doblar solo los bloques classy def, el doblado con sangría es demasiado para mi gusto. Creo que una solución elegante es utilizar el sistema de sintaxis como esta uno mencionado por Tomas. Sin embargo, este está destinado a reemplazar el archivo de sintaxis original y puede terminar siendo más antiguo que el original (es decir, ese script no menciona la sintaxis de Python 3).

Mi solución es colocar en la ~/.vim/syntaxcarpeta un archivo llamado python.vimsolo con las líneas importantes (tomadas del script anterior):

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

Entonces simplemente active el plegado con :set foldmethod=syntax.


1
Me gusta esta solucion Pero no coincide con n pliegues classy defs si están al principio de una línea. Como apenas puedo leer la expresión, tengo problemas al intentar modificarla para que coincida con ^defy ^class. Sin embargo, esto es curioso ya que \s*debería lidiar bien con esto ..
iago-lito 'considerando irse el

2

La fuente de Python viene con un complemento de sintaxis vim junto con un archivo vimrc personalizado. Consulte las preguntas frecuentes de Python en vim


2
Este archivo de sintaxis tampoco contiene información de plegado. Entonces no puede usar este archivo de sintaxis con el plegado de sintaxis.
KFL

2

En tu .vimrc:

set foldmethod=indent
set shiftwidth=4

Luego, zMenmascarar todo zRpara expandirlo todo. También agregué:

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>

Así puedes z1y z2desangrar poco a poco.


2

Realmente me gusta este pequeño script vim que escribí para .vimrc. Se asigna alt+1para doblar el primer nivel de sangría de Python (definiciones de clase y funciones), alt+2para doblar el segundo nivel (métodos de clase) y alt+0para desplegar todo. Se asegura de que solo se pliegue un nivel y no pliegue ninguno de los subniveles anidados. Todavía puede usar zapara alternar el plegado para el bloque actual. Tenga en cuenta que en ^[0, ^[es altpara mi terminal. No tengo mucha experiencia en el script vim, así que no dude en hacer sugerencias sobre la función :)

" 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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.