2010-01-28 16 views
42

Soy un usuario de Vim desde hace mucho tiempo (3 o 4 años) que recientemente ha comenzado a tratar con un código profundamente anidado. Este código está sangrado con espacios, no pestañas. Me gustaría una indicación limpia y sin distracciones de la sangría para ayudarme a mantener el seguimiento del bloque de código en el que estoy cuando estoy buscando algo de muchos niveles profundos.¿Es posible mostrar guías de sangrado en Vim?

:set list 

Solo muestra la pestaña y los caracteres de la línea de fondo. He encontrado un complemento (parece que no puede desenterrarse en este momento) que resaltará cada nivel de sangría en colores progresivamente más oscuros, pero esto es visualmente poco atractivo. Idealmente, me gustaría ver líneas verticales delgadas en cada nivel de sangría. Muchos editores noveles tienen esta funcionalidad, pero aún no estoy dispuesto a renunciar a Vim.

¿Alguien sabe cómo se puede lograr esto?

+0

Eche un vistazo a https://github.com/nathanaelkane/vim-indent-guides –

Respuesta

1

Pruebe este complemento VIM BlockHL El color codifica la indentación de cada nivel sucesivo de forma diferente.

EDITAR: ¿Qué lanaguge estás usando? Este complemento es para lenguajes tipo C.

+1

Los dos idiomas en los que más necesitaría esto serían Perl y Xml. Me había topado con ese complemento antes y estaba buscando algo más limpio en apariencia que el resalte del bloque, como líneas verticales finas. – mjn12

25

puede utilizar pestañas para acceder a guías de sangrado y quitar las pestañas antes de guardar el archivo:

" use 4 spaces for tabs 
set tabstop=4 softtabstop=4 shiftwidth=4 

" display indentation guides 
set list listchars=tab:❘-,trail:·,extends:»,precedes:«,nbsp:× 

" convert spaces to tabs when reading file 
autocmd! bufreadpost * set noexpandtab | retab! 4 

" convert tabs to spaces before writing file 
autocmd! bufwritepre * set expandtab | retab! 4 

" convert spaces to tabs after writing file (to show guides again) 
autocmd! bufwritepost * set noexpandtab | retab! 4 
+0

De la respuesta de Nikolay> "mostrar guías de sangría> set list listchars = tab: |-, trail: ·, extends:», precedes: «, nbsp: × Usar gVim en XP tuve que escapar del carácter de pipa en mi vimrc como en > pestaña: \ | - O si no, recibí E474: argumento inválido: lcs = pestaña: –

+0

listchar = pestaña: | - no funciona con espacios –

+0

Esto es exactamente lo que he estado buscando, ¡gracias! – seagoj

15

Esto mostrará puntos para indicar su nivel de sangría mientras escribe. Los puntos desaparecen mágicamente al salir de la línea.

set list listchars=tab:»-,trail:·,extends:»,precedes:« 

por ejemplo:

def test(): 
....print('indentation level 1') 

eh Pretty cool?

+0

Esto es awesome – sunil

+0

No funciona para MacVim versión 8.0.502 (129), no desaparecen como líneas salientes –

15

Probablemente la solución más efectiva sería "dibujar" las guías de indentación usando el resaltado de coincidencia. Para entender cómo ayuda, mira en este ejemplo:

:match Search /\%(\_^\s*\)\@<=\%(\%1v\|\%5v\|\%9v\)\s/ 

Resalta (usando Buscar grupo que destaca, es posible utilizar cualquier otra, por supuesto) el primero, quinto, noveno (y puede ser continúa) columna virtual ocupada por un símbolo de espacio que no precede nada más que espacios en blanco desde al comienzo de la línea. Por lo tanto, esto produce una indentación de cuatro espacios que resalta para tres niveles en profundidad.

Para generalizar esta idea sólo queda para generar patrón como que mencionado anteriormente de acuerdo con del búfer en textwidth y shiftwidth (para manejar niveles de sangría y anchura guión adecuado más profundo). Esta tarea podría ser simplemente automatizada como se muestra en la función a continuación.

function! ToggleIndentGuides() 
    if exists('b:indent_guides') 
     call matchdelete(b:indent_guides) 
     unlet b:indent_guides 
    else 
     let pos = range(1, &l:textwidth, &l:shiftwidth) 
     call map(pos, '"\\%" . v:val . "v"') 
     let pat = '\%(\_^\s*\)\@<=\%(' . join(pos, '\|') . '\)\s' 
     let b:indent_guides = matchadd('CursorLine', pat) 
    endif 
endfunction 

Cada vez que necesite guías de sangría en una memoria intermedia, que se puede activar por :call ToggleIndentGuides(). Por supuesto, se puede cambiar el grupo destacando (o crear uno especial para su uso en sólo guías de sangría), configuración de un práctico mapeo para eso y/o llamarlo desde autocmd para algunos archivos tipos.


guías de sangría destacando la configuración de mi archivo .vimrc : https://gist.github.com/734422

+0

Esto funciona bien, pero ¿es posible mostrar como una línea vertical de estilo de texto sublime cada 4 espacios? – seagoj

+0

@seagoj: Desafortunadamente, no es posible dibujar líneas gráficas reales ni siquiera en GVim. La aproximación más aproximada es resaltar columnas de espacios en cada posición 'shiftwidth', que es exactamente lo que la solución propuesta aquí lo hace. –

+0

@ La solución de nikolay-fransev era básicamente lo que estaba buscando. – seagoj

65

NOTA: Esta respuesta es un poco tarde a la fiesta y también un enchufe descarado :)

Independientemente, intente mi Indent-Guides.vim plugin. Fue creado para rascar mi propio picor con respecto a la falta de guías de sangrado en vim. Me cansé de esperar a que alguien más viniera y lo construyera, así que lo hice yo mismo.

Características:

  • puede detectar tanto la ficha y el espacio estilos de sangría.
  • Inspecciona automáticamente el esquema de colores y selecciona los colores adecuados (solo gVim).
  • Destaca niveles de sangrado con colores alternos.
  • Soporte completo para gVim y soporte básico para Terminal Vim.
  • Parece que funciona en Windows gVim 7.3 (sin embargo, no se han realizado pruebas exhaustivas).
  • Tamaño personalizable para guiones de indentación, p. Ej. guías delgadas (solo pestañas suaves).
  • Nivel de sangría de inicio personalizable.

Aquí hay algunas capturas de pantalla del complemento en acción: put your mouse here and click.

+3

¿Alguien ha conseguido que esto funcione en una máquina que no está basada en Windows?No puedo cargarlo, ya sea a través de Patógeno o no, y si es vim o gvim. Incluso los archivos de ayuda no se están cargando – puk

+1

@puk: Funciona bien para mí usando MacVim (Vim 7.3) y Patógeno. –

+0

¿Todavía trabajas en eso? Personalmente, me gustan las guías de sangría de Notepad ++, y me gustaría ver que gVim también lo haga ... – polemon

22

Si aplica sangría al código con espacios, puede probar mi complemento: https://github.com/Yggdroot/indentLine, muestra líneas verticales delgadas, pero no gruesas líneas verticales como se menciona en las respuestas anteriores. Si aplica sangría a un código con tabulación, solo :set list lcs=tab:\|\ (here is a space)

+4

Debe revelar que es su proyecto. la respuesta fue solo un enlace y, por lo tanto, bastante inútil. – ThiefMaster

+0

Añadir resaltando las guías de sangrado de bloque activo!: D Me gusta en Sublime Text y en Notepad ++. – trusktr

+7

@ThiefMaster ¿A quién le importa si no divulgó su proyecto? Esta es una respuesta válida. Es posible tener sangrías (usando * su * complemento), pero es libre y de código abierto ... así que ¿a quién le importa si no revela que es suyo? Proporcionó una solución. – trusktr

0

utilice el complemento Indent-Guides.vim, y active el uso de ig siempre que lo necesite. A veces puede ser molesto :)

Cuestiones relacionadas