Cómo agregar guías / líneas de sangría

42

En Sublime Text 2, obtienes guías verticales donde está tu sangría, así:

Captura de pantalla de Sublime Text

pero en vim obviamente no:

captura de pantalla de vim

¿Hay alguna manera de mostrar líneas como esa en vim? Por cierto, mi sangría es de 2 espacios.

:set tabstop=2 softtabstop=2 shiftwidth=2 expandtab
aharris88
fuente

Respuestas:

39

Respuesta unificada:

Si estás usando pestañas

Intentaría usar listchars:

:set listchars=tab:\|\ 
:set list

nota: hay un espacio después del último \anterior.

Este método es bueno porque utiliza el soporte integrado de Vim para mostrar este tipo de cosas.

Salida de ejemplo:

|       if (1) {
|       |       func();
|       }

captura de pantalla de la muestra de texto anterior

Sin embargo, esto no funciona para espacios iniciales. Como señaló @Josh Petrie, hay un parche para trabajar para espacios , pero luego tendrías que recompilar Vim, que está más allá del alcance de esta respuesta.

Si usa espacios y no le importa usar un complemento

Vaibhav Sagar señala que el complemento indentLine realiza esta funcionalidad.

Instale de la manera normal (consulte la instalación de complementos ) y parece que mágicamente funciona sin más información. Si no le importan las barras ASCII, no necesita hacer nada con sus fuentes. Ejemplo de salida de su ejemplo después de establecer su configuración de sangría y ejecutar:IndentLinesReset

45   ¦ var move = function(direction) {
46   ¦ ¦ if(!initialized) { initialize(); }
47 
48   ¦ ¦ if(shiftBoard(direction)) {
49   ¦ ¦ ¦ setTimeout(addRandomPiece, 100);
50   ¦ ¦ }
51   ¦ };

captura de pantalla de ejemplo con espacios

El complemento requiere Vim 7.3 o posterior, y hace un uso inteligente de la función Ocultar de esa versión. En lugar de ocultar el texto, reemplaza el texto con barras en la vista, pero no el búfer real. El resultado es que ve las barras pero no se guardan en el archivo (ya que en realidad son espacios)

Advertencia

Ambos métodos suponen código sangrado "correctamente". No colocan las líneas de sangría en el nivel de sangría cuando se abre un "bloque" (lo que parece ser sublime), sino que colocan líneas a intervalos regulares según la configuración de sangría. Además, solo muestra las barras en las líneas donde realmente hay espacio (razón por la cual la línea en la salida vim debajo de la primera ifno tiene barras, haciendo un espacio visual)

John O'M.
fuente
En realidad, estoy usando espacios para sangrar en lugar de pestañas. He actualizado mi pregunta.
aharris88
Oh. Pues bien, eso requerirá más investigación.
John O'M.
1
Hay un parche para hacer que los listchars funcionen para espacios no finales, que puede desenterrar en la lista de correo. Sin embargo, no se ha aceptado en la distribución oficial :(
1
Respuesta actualizada para incluir información de Vaibhav Sagar y Josh Petrie. Probé el complemento que Vaibhav mencionó y mostré los resultados en la respuesta editada. Creo que voy a comenzar a usar este complemento yo mismo. No es fantástico, pero en general parece funcionar bastante bien.
John O'M.
1
indentLine funciona bien para python, json, viml, c, c ++, etc. Pero desafortunadamente no funciona con vim-javascript, así que en su lugar utilizo vim-indent-guides.
Sassan
19

Otra opción que uso, que no es exactamente lo que pediste, pero cumple el mismo propósito de hacer que sea más fácil ver lo que está en la misma columna, es establecer lo siguiente en tu vimrc:

set cursorcolumn
set cursorline

Ilustración de la columna de cursor

Esto tiene la desventaja de que debe mover el cursor a la columna que desea ver, pero obtiene menos desorden visual. Por lo general, cuando me importan los niveles de sangría, de todos modos mantengo mi lugar con el cursor. Mi camino tampoco es tan extraño en lenguajes como Python sin cerrar llaves.

Karl Bielefeldt
fuente
Los usuarios de Python vi morirán por esta característica
shuva
18

En aras de la exhaustividad, también está el complemento Indent Guides , que muestra los niveles de sangría alternando los colores de los espacios en blanco. Requiere la versión 7.2 o posterior. Como utiliza las variables tabstopy shiftwidth, probablemente funcionará para la configuración de sangría de inmediato.

Imgur

Una vez que se instala el complemento, simplemente puede usar :IndentGuidesEnableo :IndentGuidesDisable. Si está utilizando terminal vim, tenga en cuenta que, de acuerdo con el manual,

Por el momento, Terminal Vim solo tiene soporte básico. Esto significa que los colores no se calcularán automáticamente en función de su esquema de colores. En cambio, se usan algunos colores preestablecidos dependiendo de si el fondo está configurado en oscuro o claro.

Para cambiar los colores de las guías para la captura de pantalla, utilicé lo siguiente

let g:indent_guides_auto_colors=0

para que los colores no se vuelvan a calcular cuando se intercambian los búferes, y luego configure los colores usando

hi IndentGuidesEven ctermbg=238
hi IndentGuidesOdd ctermbg=236

Al igual que con las otras soluciones presentadas, solo muestra las guías de sangría en las líneas donde hay espacios.

guillem
fuente
agregue let g:indent_guides_enable_on_vim_startup=1a mi .vimrc para habilitar esto en el inicio.
inye
9

He encontrado que el complemento indentLine es el mejor para esto. Sin embargo, necesita una fuente con los símbolos apropiados, encuentro que Consolas en Windows y Menlo en Mac OS X funcionan bien. Como se señala en la respuesta unificada anterior, funciona (ab) utilizando la concealfunción de vim para colocar barras verticales (de la fuente utilizada) en el lugar correcto. Estoy bastante contento con esta solución, pero la desventaja es que mis barras verticales son parte de los glifos de dibujo de caja y están alineadas al centro en lugar de alinearse a la izquierda como en otros editores. Me he acostumbrado, pero se puede arreglar parcheando manualmente su fuente o usando una fuente como Fantasque Sans Mono (observe cómo las capturas de pantalla en el repositorio de github vinculado usan indentLine).

Vaibhav Sagar
fuente
44
Por favor, eche un vistazo a nuestra discusión sobre las respuestas de solo plugin-link y considere actualizar su respuesta con más información.
Mi error, he actualizado mi respuesta.
Vaibhav Sagar
¿Qué glifo es la línea vertical parcheada? ¿Puedes pegarlo aquí? Gracias.
Timtro
2

El plugin indentLine tiende a ser bastante lento en archivos no pequeños, observable al hacer clic en enter, ya que se retrasa un segundo más o menos.

He descubierto que vim-indentguides es un complemento más rápido y visualmente similar, que también distingue visualmente las sangrías de tabulación frente a las sangrías de espacio.

jaybay
fuente