Ajuste suave a 80 caracteres en Vim en una ventana de ancho arbitrario


126

Quiero usar la capacidad de ajuste suave de Vim ( :set wrap) para ajustar un código de 80 caracteres, independientemente del ancho real de mi ventana.

Todavía no he podido encontrar una manera de hacerlo: toda la envoltura suave parece estar vinculada al ancho de la ventana

  • textwidthy wrapmarginson ambos para envoltura rígida (insertan caracteres de nueva línea en el archivo)
  • división vertical en múltiples ventanas y uso :vertical resize 80(posiblemente :set breakat=para permitir saltos en cualquier carácter) en una de ellas (aunque sea un poco hack), pero se rompe cuando se usa :set numberya que los números de línea ocupan un número variable de columnas (dependiendo en la longitud del archivo) y estos son parte de los 80.

¿Hay alguna manera de hacer esto en vim? No parece prometedor, según otras fuentes .

En este momento, mi aproximación es solo tenerla /^.\{80}\zs.\+como mi búsqueda predeterminada, por lo que al menos está resaltada. Pensé en agregarle un :syntaxelemento, pero eso se rompió cuando se superpuso a otros elementos de sintaxis, así que dejé esa idea.


En realidad, ¿cómo configuraste una búsqueda predeterminada?
Thethinman

Respuestas:


37

Tú podrías

  • establecer un ancho mínimo grande para la columna de números de línea mediante :set numberwidth=6y
  • entonces puede cambiar el tamaño de su ventana con :set columns=86(o con el mouse) al tamaño adecuado.

Si edita un archivo con un millón de líneas, puede tener problemas, pero es poco probable. También está desperdiciando 6 columnas de bienes raíces de pantalla de esta manera. Entonces todavía hay todo tipo de problemas.

Puede resaltar más allá de la columna 80 utilizando :matchcomo dice aquí y aquí .

Más allá de eso, no veo ninguna manera de hacer esto. Sin embargo, parece que sería una buena característica.


Desafortunadamente, vim no mantiene las columnas configuradas si la ventana cambia de tamaño. Esto lleva a una situación desafortunada con los administradores de ventanas de mosaico donde no hay una buena manera de ajustar suavemente a 80 columnas si la ventana es demasiado ancha.
gravitación

Esto funciona, pero no es pegajoso. Supongo que el siguiente paso es configurar un autocmd para mantener las columnas en el nuevo tamaño deseado para los tipos de archivo que desee.
xer0x

1
Esta es la respuesta correcta, ya que confirma que no puede hacerlo. Y estoy seguro de que no soy el único que no quiere cambiar el tamaño de mi ventana de terminal solo por esto. Quiero mucho más ancho para usos que no sean vim.
Sridhar Sarnobat

20

Prueba esto:

set columns=80
autocmd VimResized * if (&columns > 80) | set columns=80 | endif
set wrap
set linebreak
set showbreak=+++

Puede eliminar el if (&columns > 80) |si siempre quiere 80 columnas.


En mi terminal iTerm, esto hace que la ventana sea más pequeña. No estoy seguro de si eso es un problema con mi entorno (veo que estás haciendo algo con el cambio de tamaño automático), pero de lo contrario, esto no es deseable. Gracias por la sugerencia sin embargo.
Sridhar Sarnobat

El autocmd funcionó perfectamente para mí (usando el terminal guake).
mzcarlos

Funciona como un encanto con Tmux + NeoVim en Alacritty.
meh

16

No tengo una solución para el ajuste suave, pero en cuanto a marcar una columna, a partir de Vim 7.3 (lanzado el 15-08-2010) :set colorcolumn=80resaltará la columna 80. El color dependerá de su archivo de sintaxis.

Ver Vim 80 Diseño de columna preocupaciones , :h colorcolumn.


Las citas no son URL válidas, por lo que tiene sentido. El nombre del delimitador no debe contener caracteres de URL no válidos, SO no debe corregir los errores de otros desarrolladores del sitio.
Shadow Wizard es Ear For You

1
Shadow Wizard se refiere a una revisión previa de mi respuesta en la que me pregunto cómo colocar comillas simples en las URL usando Markdown. Entonces ib sugirió usar% 27, que funcionó. Gracias ib.
ftvs

Recientemente descubrí cómo solo resaltar columnas más allá de 80 ~:let w:eighty_column_match = matchadd('ColorColumn', '\%81v.\+', 100)
rampion

La colorwidthcosa es útil por otras razones, así que me alegra que hayas publicado esto.
Sridhar Sarnobat

2

¿Lo has intentado 'linebreak'?

        *'linebreak'* *'lbr'* *'nolinebreak'* *'nolbr'*
  'linebreak' 'lbr' boolean (default off)
        local to window
        {not in Vi}
        {not available when compiled without the  |+linebreak|
        feature}
If on Vim will wrap long lines at a character in 'breakat' rather
than at the last character that fits on the screen.  Unlike
'wrapmargin' and 'textwidth', this does not insert <EOL>s in the file,
it only affects the way the file is displayed, not its contents.  The
value of 'showbreak' is used to put in front of wrapped lines.
This option is not used when the 'wrap' option is off or 'list' is on.
Note that <Tab> characters after an <EOL> are mostly not displayed
with the right amount of white space.

3
Hmm ... pero breakates solo un patrón (no una longitud), así que no veo cómo podría usar esto para forzar una envoltura suave a 80 ...
rampion

Hmmm, me pregunto si es posible hacer una expresión regular que coincida con palabras cuya longitud total (más el espacio en blanco entre ellas) sea menor o igual que n caracteres.
Shane Creighton-Young

@ ShaneCreighton-Young: ^.{,80}\blo haría para las personas que usan pestañas suaves / expandidas. Tenga en cuenta que es perl regex, no vim regex.
Mark K Cowan

0

No hay una buena manera de hacerlo. Podemos cortar una improvisada setlocal softwrapcon autocmdsi modificamos @eborisch respuesta. Si cambiamos el tamaño cada vez que ingresamos a un búfer, y cambiamos el tamaño a una longitud particular cuando la variable localsoftwrap , obtenemos el comportamiento deseado.

Supongamos que queremos ajustar suavemente a 80 columnas, podemos escribir lo siguiente en .vimrc.

augroup softwrap
    autocmd VimResized * if (exists('b:softwrap') && &columns > 80) | set columns=80 | endif
    autocmd BufEnter * set columns=999
augroup END

Para activar el modo para un búfer en particular, use los siguientes comandos:

let b:softwrap=1
set columns=80

Esto solo transforma mis archivos en galimatías.
Suuuehgi
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.