Ajuste de palabras en Vim (conservando la sangría)


92

Estaba viendo esta publicación que describe cómo envolver palabras completas en vim. La solución aceptada fue esta:

:set formatoptions=l
:set lbr

Lo que toma este texto (las pestañas se muestran como \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will wr|ap here                            
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Esto logra un comportamiento como este (las pestañas se muestran como \ t):

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|wrap here                              |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Sin embargo, me gustaría redefinir esta función. Me gustaría que la línea envuelta tenga el mismo número de pestañas delante que la línea de arriba tiene más uno. Es decir:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|\t\t\twrap here                        |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

¿Algunas ideas?


34
+1 por el esfuerzo realizado para que la pregunta sea lo más clara posible.
Jeffrey Jose

¿Desea que el texto se ajuste suavemente en el borde de la ventana o se ajuste duro cuando la línea alcance una cierta longitud? Creo que desea un ajuste rígido (donde se inserta una nueva línea en su texto después de la palabra "will"), pero es difícil saberlo a partir de sus ejemplos.
Bill Odom

@ Bill, lo que más me interesa es el envoltorio de software, pero una solución de envoltorio rígido también sería aceptable.
sixtyfootersdude

1
La funcionalidad que desea no está integrada actualmente en Vim. Sin embargo, hay un parche que se acerca: groups.google.com/group/vim_dev/web/vim-patches (es el # 15, "Líneas ajustadas con sangría correcta").
Bill Odom

Relacionado: VimCasts tuvo un buen episodio sobre el uso de utilidades externas de Unix para manejar este problema: vimcasts.org/e/18
Damien Wilson

Respuestas:


18

El parche breakindent tiene lo que estás buscando. Lo apliqué con éxito usando las instrucciones que se encuentran en este hilo:

Patch Vim con el parche breakindent en OS X con Homebrew

Específicamente, la fórmula Homebrew de echristopherson.

Sé que este hilo es antiguo, pero es popular en Google y lo encontré varias veces al intentar encontrar una solución.

EDITAR: Este parche ahora se incluye con vim como parche 7.4.338. Ver: https://retracile.net/blog/2014/07/18/18.00

En Yosemite (Mac OS X), usé el comando de snowbound con hombrew:

brew install macvim --with-features=huge --override-system-vim --HEAD 

el parche no parece funcionar con el último macvim en homebrew? @ Exit42 ¿cómo conseguiste que funcionara?
nevado

nvm. Compilé macvim con la vanguardia de la cerveza caserabrew install macvim --with-features=huge --override-system-vim --HEAD
nevado

1
Vea mi respuesta a continuación: stackoverflow.com/questions/2828174/… No es necesario un parche en las versiones más recientes de vim.
JoshuaD

26

Esto no funcionó cuando se hizo la pregunta originalmente, pero a partir del 25 de junio de 2014, funcionará. (Suponiendo que actualice su vim a una versión más reciente que esa fecha)

Agregue a su .vimrc:

" Indents word-wrapped lines as much as the 'parent' line
set breakindent
" Ensures word-wrap does not split words
set formatoptions=l
set lbr

¡Y eso es!

-

Algunas personas (incluido yo mismo) comparten un solo .vimrc en varias computadoras. En ese caso, es importante que esta línea sea sólida (para evitar molestos mensajes de error). Esto es un poco mejor:

if has("patch-7.4.354")
    " Indents word-wrapped lines as much as the 'parent' line
    set breakindent
    " Ensures word-wrap does not split words
    set formatoptions=l
    set lbr
endif

De esta manera, si tiene una versión anterior de vim, no recibirá un mensaje de error.


Curiosamente, esto funciona en el vim 7.4 de mi cygwin pero no en el vim 7.4 de mi unbuntu. Supongo que debe generalizarse un poco más, pero pronto verá la adopción universal.
JoshuaD

1
Funciona en Vim 7.4 @ ArchLinux.
Andy Mikhaylenko

1
Puede utilizar esta prueba en su lugar:if has("patch-7.4.354")
Lawrence Kesteloot

Esto no responde a la pregunta sobre el comentario de OP: la misma cantidad de pestañas (...) más una . Por cierto, en mi opinión también es muy importante, a menudo es posible que desee mantener una sangría adicional y desplazar ópticamente los segmentos envueltos hacia la derecha (listados, notas, etc.);
sangriento

8

Lo mejor que obtendrá es la showbreakopción que pondrá una cadena fija delante de cada línea envuelta (yo uso set showbreak=...).


@AlexanderBird Según :help 'showbreak', no, no puedes, showbreakes solo una cadena.
Rory O'Kane

4

Estoy de acuerdo con la respuesta que dice que 'showbreak' es la mejor opción. Por lo general, Showbreak no le permite poner caracteres no imprimibles (por ejemplo, espacios o tabulaciones) en la cadena de showbreak, por lo que, como se usa normalmente, solo le dará un indicador a lo largo del margen izquierdo, es decir, sin sangría real. Esto no es genial, ya que el objetivo principal de OP, creo, es darle a las líneas envueltas una sangría para evitar que abarroten el área del margen izquierdo y parezcan líneas propias.

Entonces, una forma de agregar una sangría (fea) usando showbreak es simplemente usar muchos caracteres, .eg, ": set showbreak => --------------->". Esto da como resultado algo parecido a esto:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|>--------------->wrap here             |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Una mejor alternativa podría ser utilizar caracteres de espacio que no se rompan (suponiendo que su instancia de Vim esté habilitada para Unicode), cada uno de los cuales se puede ingresar en la cadena showbreak usando la secuencia de teclas ctrl-v, 160. De esa manera, puede ingresar una cadena de showbreak que está en blanco en el lado izquierdo y parece ser una sangría verdadera. Por ejemplo, ": establece showbreak =........... >>" donde cada '.' en el comando es en realidad un carácter de espacio no separable que se ingresa presionando ctrl-V, 160. De esa manera, terminará con una envoltura que tiene una buena sangría, como esta:

 *Inside of window                        *Outside of window
|---------------------------------------|    
|\t\tthis is a like of text that will   |
|            >>wrap here                |
|\t\tcan you see the wrap               |
|                                       |
|---------------------------------------|

Aún no tiene la capacidad de variar el nivel de sangría de acuerdo con la sangría de la línea anterior, pero al menos obtiene una sangría limpia de las líneas envueltas sin mucho desorden visual a lo largo del margen izquierdo de la ventana. Aún podría haber confusión si la sangría de una línea ajustada es menor que la del comienzo de una línea real, pero esto quizás podría evitarse haciendo que la "sangría" de showbreak sea bastante grande (es decir, mayor que cualquier sangría que se encuentre comúnmente en su código ) pero lo suficientemente pequeño como para proporcionar suficiente espacio para un ajuste legible del texto. Para muchos usos, creo que una sangría de 40 o 50 espacios haría esto bastante bien.


7
Se puede poner espacios en showbreak por escapar de ellos: :set showbreak=\ \ \ \ . Sin embargo, todavía no funciona con pestañas.
Bill Odom
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.