Vim 80 preocupaciones de diseño de columna

417

La forma en que hago indicación de 80 columnas en Vim parece incorrecto: set columns=80. A veces también set textwidth, pero quiero poder ver y anticipar el desbordamiento de línea con la set columnsalternativa.

Esto tiene algunos efectos secundarios desafortunados :

  1. No puedo set numberpor miedo a dividir entre archivos que tienen diferentes órdenes de números de línea; es decir, <100 archivos de línea y> = 100 archivos de línea requerirán dos set columnsvalores diferentes debido a la columna adicional utilizada para la visualización de dígitos adicionales.
  2. También comienzo nuevas sesiones (g) de Vim en lugar de dividir las ventanas verticalmente. Esto se debe a vsplitque me obliga a hacerlo set columnscada vez que abro o cierro un panel, por lo que comenzar una nueva sesión es menos complicado.

¿Cómo maneja la indicación de 80 caracteres cuando desea set numbersdividir verticalmente, etc.?

cdleary
fuente
6060
Se considera un buen estilo de código en muchos círculos; por ejemplo, la Guía de estilo de Python (PEP8) recomienda 79 líneas de caracteres: python.org/dev/peps/pep-0008
cdleary
44
No es un absoluto "debe tener 80 líneas de caracteres", pero hace que sea más agradable de leer en algunos sistemas, como por ejemplo cualquier aplicación basada en consola que no se ejecute dentro de una ventana de consola GUI que pueda redimensionarse.
Matthew Scharley
47
@davr: Primero, es más fácil de leer. Algunos estudios sugieren que una longitud de línea corta (76 caracteres por línea) es más agradable y más rápida de leer en línea. ¿Sabes esto: de repente tus ojos están en la línea equivocada cuando lees? Esto rara vez ocurre con 80 caracteres. En segundo lugar, a menudo edito o difiero visualmente con dos archivos uno al lado del otro en mi monitor de 1600 píxeles de ancho. Esto solo funciona bien si el archivo no tiene líneas de más de 80 caracteres. Por lo tanto, a menudo reformateo las líneas largas antes de poder trabajar de manera eficiente.
nalply
25
@davr es increíblemente útil para editar varios archivos uno al lado del otro.
aehlke
2
Hago mucho menos errores en el código C / C ++ y JS desde que adopté un ancho de línea de 80 caracteres (del estilo de codificación del núcleo). Ocasionalmente lo desbordo por una pareja, pero rara vez ...
Mark K Cowan

Respuestas:

586

Tengo esto configurado en mi .vimrc:

highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.\+/

Esto resalta el fondo en un rojo sutil para el texto que supera el límite de 80 columnas (sutil en modo GUI, de todos modos, en modo terminal es menos).

Simon Howard
fuente
3
¡Gran idea! Lo cambié a "ctermbg = darkred" y "guibg = # FFD9D9" para adaptarme mejor a mis necesidades (fondo claro en gvim y oscuro en modo cterm).
HS.
10
Creo que una corrección sutil es /\%81v.\+/; por alguna razón,. * Resalta los lugares donde los personajes no existen.
cdleary
14
Creo que esta línea es un poco mejor para la expresión regular de coincidencia: coincidencia OverLength /\%>80v.\+/ Esto no resalta el carácter de "final de línea" y también es más intuitivo ya que simplemente establece el número a lo que desea la longitud de la línea a ser, no +1.
David Terei
8
Por alguna razón, solo funciona en el primer búfer abierto para mí (primera ventana de la primera pestaña) en mi vim ...
lajarre
3
Consulte stackoverflow.com/a/10993757/9822 si esta solución solo funciona en su primer búfer.
Jesse Vogt
769

A partir de vim 7.3, puede usar set colorcolumn=80( set cc=80para abreviar).

Como las versiones anteriores no admiten esto, mis .vimrcusos en su lugar:

if exists('+colorcolumn')
  set colorcolumn=80
else
  au BufWinEnter * let w:m2=matchadd('ErrorMsg', '\%>80v.\+', -1)
endif

Consulte también la documentación en línea sobre la colorcolumnopción .

Jeremy W. Sherman
fuente
26
Incluso puede basar automáticamente el valor de 'colorcolumn' en 'textwidth' con algo como: set cc = + 1
graywh
1
has ("colorcolumn") no funcionó para mí. Tuve que usar existe ("& colorcolumn") en su lugar.
SpoonMeiser
55
Muy agradable, excepto que vim <7.1.40 no es compatible con matchadd.
Greg Jandl
19
También puede cambiar el color de la columna conhighlight ColorColumn ctermbg=7
null_radix
2
La documentación para esta opción está en vimdoc.sourceforge.net/htmldoc/options.html#%27colorcolumn%27
JohnTESlade
54

Camino más corto:

match ErrorMsg '\%>80v.\+'
Maksim Vi.
fuente
8
¡Realmente me gusta esto porque no contamina mi búfer con una línea vertical larga! (Y)
Ionică Bizău
ErrorMsges un highlight-group. Hay muchos grupos de resaltado predeterminados en Vim que puede usar según la codificación de color que desee para este caso.
crisron
49

Yo prefiero:

highlight ColorColumn ctermbg=gray
set colorcolumn=80
wieczorek1990
fuente
Me gusta este. Usé negro en lugar de gris y fue más sutil ya que mi fondo es casi negro pero no del todo.
Oscilación isopícnica
30

La respuesta de Simon Howard es genial. Pero /\%81v.\+/no resalta las pestañas que exceden la columna 81. Así que hice un pequeño ajuste, basado en las cosas que encontré en VIM wiki y la elección de colores de HS anterior:

highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%>80v.\+/

Y ahora VIM resaltará cualquier cosa que exceda la columna 80.

Z.Zen
fuente
2
Es posible que desee agregar guifg=whiteal final allí.
Dan Bechard
17

ingrese la descripción de la imagen aquí

Enfoque minimalista, no exagerado. Solo se resalta el carácter 79 de las líneas que son demasiado largas. Supera algunos problemas comunes: funciona en ventanas nuevas, las palabras que se desbordan se resaltan correctamente.

augroup collumnLimit
  autocmd!
  autocmd BufEnter,WinEnter,FileType scala,java
        \ highlight CollumnLimit ctermbg=DarkGrey guibg=DarkGrey
  let collumnLimit = 79 " feel free to customize
  let pattern =
        \ '\%<' . (collumnLimit+1) . 'v.\%>' . collumnLimit . 'v'
  autocmd BufEnter,WinEnter,FileType scala,java
        \ let w:m1=matchadd('CollumnLimit', pattern, -1)
augroup END

Nota: observe que FileType scala,javaesto limita esto a los archivos fuente de Scala y Java. Probablemente quieras personalizar esto. Si lo omitiera, funcionaría en todos los tipos de archivos.

Dominykas Mostauskis
fuente
¿Por qué agregaste un FileType scala,java? (no funciona para mí)
Dorian
1
@Dorian limita esto a los tipos de archivo Scala y Java, porque esos eran los tipos de archivo en los que estaba trabajando en ese momento. Olvidé mencionar eso. Actualizando respuesta.
Dominykas Mostauskis
¿Qué fuente estás usando en la captura de pantalla? Me resulta muy agradable a la vista.
Torre
@Idigas: De acuerdo, y siento que quizás Comic Sans pudo haber sido una mala elección cuando configuré originalmente PuTTY :)
Mark K Cowan
No pude obtener el fragmento en esta respuesta para trabajar en Vim 7.4. (También eliminé el filtro FileType.)
Mnebuerquo
13

También puede dibujar una línea para ver el límite 80:

let &colorcolumn=join(range(81,999),",")
let &colorcolumn="80,".join(range(400,999),",")

Resultado:

ingrese la descripción de la imagen aquí

0x8BADF00D
fuente
13

Una buena manera de marcar solo el primer carácter que sale de los límites especificados:

highlight ColorColumn ctermbg=magenta "set to whatever you like
call matchadd('ColorColumn', '\%81v', 100) "set column nr

De la charla de Damian Conway .

Shanded
fuente
7

Las versiones más recientes de vim permiten un :set numberwidth=xvalor, que establece el ancho de la visualización del número de línea. Realmente no uso el plegado, etc., así que no sabría sobre eso. Sin embargo, dibujar una línea vertical delgada está más allá de las capacidades de una aplicación de consola. GVim puede permitir esto (no lo uso, así que no puedo comentar allí).

Matthew Scharley
fuente
5

Me temo que has puesto restricciones en el conjunto de soluciones que, bueno, te dejan con el conjunto nulo.

El uso :set textwidth=80solucionará todos los problemas que mencionó, excepto que no puede ver fácilmente el límite de la línea. Si lo :set rulerhaces, habilitarás la visualización de la posición x, y en la barra de estado, que puedes usar para ver en qué columna estás.

Aparte de eso, no estoy seguro de qué decirte. Es una pena perder la columna numérica, doblar la columna y dividirla solo porque tiene que hacerlo :set columns=80.

Lucas Oman
fuente
Sí, tenía miedo de eso ... esperaba que hubiera una forma oculta de dibujar una delgada línea vertical como en los editores más orientados gráficamente.
cdleary
5

Puedes probar esto:

au BufWinEnter * if &textwidth > 8
\ | let w:m1=matchadd('MatchParen', printf('\%%<%dv.\%%>%dv', &textwidth+1, &textwidth-8), -1)
\ | let w:m2=matchadd('ErrorMsg', printf('\%%>%dv.\+', &textwidth), -1)
\ | endif

Eso configurará dos aspectos destacados en cada búfer, uno para los caracteres en las 8 columnas antes de lo que &textwidthesté configurado, y uno para los caracteres más allá de esa columna. De esa manera tienes cierta anticipación. Por supuesto, puede ajustarlo para usar un ancho diferente si desea más o menos anticipación (que paga en forma de pérdida de resaltado de sintaxis en esas columnas).

Aristóteles Pagaltzis
fuente
3

Bueno, mirando las columnas de ayuda, en realidad no está hecho para meterse.

En la consola, generalmente se determina por la configuración de la consola (es decir, se detecta automáticamente); en GUI, determina (y está determinado por) el ancho de las ventanas de gvim.

Así que normalmente solo dejas que las consolas y los administradores de ventanas hagan su trabajo comentando el set columns

No estoy seguro de lo que quiere decir con "ver y anticipar el desbordamiento de línea". Si desea que EOL se inserte aproximadamente en la columna 80, use uno set textwidtho set wrapmargin; si lo que desea envoltura suave (es decir, la línea se envuelve, pero sin EOL real), y luego jugar con set linebreaky set showbreak.

Ding-Yi Chen
fuente
2

este está fuera del campo izquierdo, pero es un pequeño mapa agradable para cambiar el tamaño de su división actual a 80 caracteres si tiene los números de línea en:

" make window 80 + some for numbers wide  
noremap <Leader>w :let @w=float2nr(log10(line("$")))+82\|:vertical resize <c-r>w<cr> 
ErichBSchulz
fuente
1

Puede intentar esto para establecer el tamaño de la ventana para permitir 80 caracteres de texto real. Sin embargo, esto todavía no funciona con divisiones verticales.

let &co=80 + &foldcolumn + (&number || &relativenumber ? &numberwidth : 0)

Esto requiere vim 7+, 7.3 para el número relativo.

Mike L
fuente