Aventuras en Vim: Lee y Jim descubren cómo cambiar los colores de los comentarios

0
11
Acercarse / ¿A quién no le gustan los comentarios cian en su editor de texto? Lee Hutchinson, eso es quién.

Jim Salter

Un buen lunes por la mañana, Lee Hutchinson, editor senior de tecnología en Ars Technica, vino a verme con un problema: los colores en su editor de texto, en su humilde opinión, habían comenzado a apestar.

En los aproximadamente 20 años de uso de Vim, Lee se había acostumbrado a escribir líneas de comentarios en su código y archivos de configuración en azul oscuro. Pero después de actualizar una máquina a Ubuntu 20.04, Vim comenzó a mostrar comentarios en cian y dado que la categoría de sintaxis «Identificador» también se presentó en cian, no estaba lo suficientemente contento como para decidir cambiar la configuración predeterminada.

A primera vista, Vim parece adherirse aproximadamente al mismo estándar de configuración que muchos, si no la mayoría de los sistemas y aplicaciones similares a Unix: hay una serie de configuraciones en todo el sistema en /etc, que se puede sobrescribir individualmente por usuario mediante los cambios realizados en un archivo de configuración opcional en el directorio de inicio del usuario. En el caso de Vim, esto es ~/.vimrc—Al igual que las configuraciones de Bash se pueden sobrescribir en ~/.bashrc.

Pero cuando Lee trató de hacer un cambio simple en el resaltado de sintaxis de Vim, cambiando los comentarios del nuevo cian a azul oscuro, que él prefería, las cosas se pusieron interesantes.

La forma de Hutchinson de configurar el resaltado de comentarios

Después de una pequeña búsqueda en Google, el comando que Lee encontró para cambiar el color del comentario pareció ser bastante simple: highlight comment ctermcfg=19, donde 19 es el código de color que utiliza Vim para el azul oscuro. El problema es hacer el cambio en ~/.vimrc en realidad no funcionó.

Para ser más precisos, hecho trabajo – brevemente – pero casi inmediatamente después de abrir el archivo, los comentarios cambiaron de azul oscuro a cian. En una máquina local rápida, el cambio ocurrió demasiado rápido para notarlo; pero Lee estaba usando una máquina remota, y esto le dio suficiente retraso para ver su preferencia de color aplicada inicialmente pero rápidamente restaurada.

Después de buscar en Google, Lee descubrió una desagradable solución. Hay una vieja broma acerca de que Vim no es un editor de texto: es un sistema operativo por derecho propio, disfrazado de editor de texto. Como la mayoría de los buenos chistes, este es un poco exagerado pero tiene una pizca de verdad: los archivos de configuración de Vim no solo asignan valores a las variables de configuración; de hecho, pueden ejecutar el código por sí mismos.

En el caso de Lee, decidió que, dado que había un retraso de alrededor de 100 ms entre sus comentarios azul oscuro aplicados y Vim cambiándolos, podía esperar a que el programa esperara 100 ms para aplicar el cambio en primer lugar:






function DelayedSetVariables(timer)
    highlight comment ctermfg=19
endfunction

let timer=timer_start(16,'DelayedSetVariables')

Efectivamente, el truco feo funcionó: ahora, en lugar de ver inicialmente comentarios azul oscuro que luego volvieron al odiado cian, Hutchinson vio comentarios cian que luego parpadearon en su azul oscuro favorito.

Esto ha funcionado bastante bien para sus propósitos … pero ¿cuál es el punto de ser un editor de tecnología senior si no puede manejar un problema frente a un reportero de tecnología que le informa?

La forma incorrecta … en realidad, muchas formas incorrectas

Cuando Lee me trajo su problema algo solucionado, ciertamente sonó como un error: puede que no sea un usuario de Vim, pero con más de 20 años de experiencia en Unix OS en mi haber, esperaba que un archivo de configuración de perfil de usuario también funcionara limpiamente sobrescribir una configuración de todo el sistema. los desvaríos salvajes El informe coherente y enfocado sobre el problema que me ofreció Lee incluía una salvedad: en sus palabras, había «alrededor de 20 lugares diferentes donde se aplican cambios de configuración de Vim», por lo que rastrear el problema fue inusualmente difícil.

Yo mismo no soy un usuario de Vim, soy uno de esos paganos que nunca han visto ninguna razón en particular para aprender más sobre Vim que el :q! Necesitaba salir de eso, pero mi sospecha inmediata fue que un error estaba causando que los archivos de configuración de Vim se aplicaran incorrectamente. Así que busqué en Google cómo verificar qué configuraciones se habían aplicado a una instancia de Vim en ejecución; resulta que hay un comando especial :scriptnames que le proporcionará exactamente eso.
























  1: /usr/share/vim/vimrc
  2: /usr/share/vim/vim81/debian.vim
  3: /usr/share/vim/vim81/syntax/syntax.vim
  4: /usr/share/vim/vim81/syntax/synload.vim
  5: /usr/share/vim/vim81/syntax/syncolor.vim
  6: /usr/share/vim/vim81/filetype.vim
  7: ~/.vimrc
  8: /usr/share/vim/vim81/plugin/getscriptPlugin.vim
  9: /usr/share/vim/vim81/plugin/gzip.vim
 10: /usr/share/vim/vim81/plugin/logiPat.vim
 11: /usr/share/vim/vim81/plugin/manpager.vim
 12: /usr/share/vim/vim81/plugin/matchparen.vim
 13: /usr/share/vim/vim81/plugin/netrwPlugin.vim
 14: /usr/share/vim/vim81/plugin/rrhelper.vim
 15: /usr/share/vim/vim81/plugin/spellfile.vim
 16: /usr/share/vim/vim81/plugin/tarPlugin.vim
 17: /usr/share/vim/vim81/plugin/tohtml.vim
 18: /usr/share/vim/vim81/plugin/vimballPlugin.vim
 19: /usr/share/vim/vim81/plugin/zipPlugin.vim
 20: /usr/share/vim/vim81/scripts.vim
 21: /usr/share/vim/vim81/syntax/perl.vim
 22: /usr/share/vim/vim81/syntax/pod.vim
Press ENTER or type command to continue

Lee no bromeaba acerca de la gran variedad de archivos de configuración para escanear: mi sistema cargó 22 archivos de configuración separados, 15 de los cuales entraron en vigencia después .vimrc en mi directorio de inicio! Así comenzó el comienzo de un camino de prímula largo, sinuoso y finalmente infructuoso: quería encontrar casos en los que el color del comentario se cambiara en algún lugar después mi ~/.vimrc, y resultó que eso no estaba sucediendo.

El único lugar donde pude encontrar el color del comentario fue establecido Cyan Él estaba en /usr/share/vim/vim81/syncolor.vim, un par de espacios hacia adelante de mi personal .vimrc. En teoría, el cambio en ~/.vimrc debería haber sobrescrito el de syncolor.vim—Pero básicamente, sin el desagradable truco del temporizador de Lee, la única forma que pude encontrar para cambiar el color de los comentarios fue adentro syncolor.vim Si.








" Many terminals can only use six different colors (plus black and white).
" Therefore the number of colors used is kept low. It doesn't look nice with
" too many colors anyway.
" Careful with "cterm=bold", it changes the color to bright for some terminals.
" There are two sets of defaults: for a dark and a light background.
if &background == "dark"
  SynColor Comment      term=bold cterm=NONE ctermfg=Cyan ctermbg=NONE gui=NONE guifg=#80a0ff guibg=NONE

Cambiando ctermfg=Cyan dentro syncolor.vim por ctermfg=19O mejor aún, ctermfg=DarkBlue, que produjo un tono de azul más fácil de leer: funcionó como se esperaba y produjo la salida que Lee quería sin el terrible truco del temporizador. Pero aplicó el cambio a todo el sistema, no solo a la cuenta de usuario de Lee y, lo que es más importante, no explicó cómo ni por qué el cambio original. ~/.vimrc se negó a trabajar como se esperaba.

Todavía estaba sintiendo un error muerto, así que investigué más.








" Vim syntax support file
" Maintainer:   Bram Moolenaar 
" Last Change:  2001 Sep 12

" This file sets up the default methods for highlighting.
" It is loaded from "synload.vim" and from Vim for ":syntax reset".
" Also used from init_highlight().

Según los comentarios al inicio de syncolor.vim, los cambios dentro de ese archivo se aplicaron en tres casos: cuando synload.vim se analiza durante la inicialización de Vim, cuando el usuario emite el comando :syntax resety dentro de la función Vim init_highlight(). No sabía que Lee o estaba llamando :syntax reset, así que procedí a encontrar la invocación de syncolor.vim desde el interior synload.vim.







" Set the default highlighting colors.  Use a color scheme if specified.
if exists("colors_name")
  exe "colors " . colors_name
else
  runtime! syntax/syncolor.vim
endif

Si lo pongo simple highlight comment ctermfg=19 de vuelta en el mío ~/.vimrcy comentó en el archivo runtime! syntax/syncolor.vim en synload.vim, Pensé que todo debería funcionar bien; esto aún califica como un mal truco, por supuesto, pero reduciría la fuente del comportamiento del problema y me permitiría escribir un informe de error más exacto para archivar con el proyecto Vim.

Desafortunadamente, no funcionó de esa manera: incluso con runtime! syntax/syncolor.vim comentado, los comentarios cian que especifican el archivo anulan la configuración simple en mi ~/.vimrc. Esto significó que las configuraciones allí estaban siendo llamadas por Vim init_highlight() función después el analizo ~/.vimrc.

Por un lado, esto definitivamente todavía me olía a error: no podía anular una configuración simple de mi archivo rc de nivel de usuario. Por otro lado, ¿mencioné los más de 20 años de experiencia en código abierto? Necesitaba asegurarme de no perderme algo obvio que causaría que un informe de error con un archivo fuera rechazado #WONTFIX porque me había perdido alguna idiosincrasia deliberada de Vim.

Encuentra el camino correcto

Dado que los archivos de configuración de Vim contenían comentarios auto-documentados, era hora de leerlos más detenidamente. Ya había aprendido que el contenido de syncolor.vim han sido aplicados por init_highlight() es synload.vim– Pero necesitaba investigar.

No pude ir más allá con los comentarios de la documentación al comienzo de synload.vim o syncolor.vim, pero la siguiente pista provino del código en syncolor.vim Si:












if syntax_cmd == "enable"
    " ":syntax enable" keeps any existing colors
    command -nargs=* SynColor hi def 
    command -nargs=* SynLink hi def link 
  elseif syntax_cmd == "reset"
    " ":syntax reset" resets all colors to the default
    command -nargs=* SynColor hi 
    command -nargs=* SynLink hi! link 
  else
    " User defined syncolor file has already set the colors.
    finish
  endif

Claramente, hubo algunos forma correcta de establecer colores definidos por el usuario, ya que esto if block evitó específicamente establecerlos si ya tenía un «archivo syncolor definido por el usuario». Así que el siguiente paso fue buscar en Google «archivo syncolor definido por el usuario de vim». El primer resultado de búsqueda fue la fuente de syncolor.vim Lo mismo en Github, pero el segundo resultado me llevó a la documentación de Vim en SourceForge.

Al realizar un ctrl-F syncolor Examinar este documento de 5.128 líneas finalmente me llevó a la información que necesitaba, aproximadamente el 90 por ciento de la página:







If you want to use different colors for syntax highlighting, you can add a Vim
script file to set these colors.  Put this file in a directory in
'runtimepath' which comes after $VIMRUNTIME, so that your settings overrule
the default colors.  This way these colors will be used after the ":syntax
reset" command.

For Unix you can use the file ~/.vim/after/syntax/syncolor.vim.

Finalmente, encontré el archivo derecho respuesta a la pregunta aparentemente simple «¿Cómo cambio el color de los comentarios en Vim?»: después de la creación ~/.vim, ~/.vim/after, es ~.vim/after/syntax, finalmente puedes crear el ~/.vim/after/syntax/syncolor.vim—Y los cambios realizados en la sintaxis resaltan los colores Allí aplicado de la manera que Lee y yo esperábamos que lo hicieran.

Acariciar al perro peludo

Con suerte, has aprendido algo en el camino mientras lees esta terrible historia del perro peludo sobre la configuración de una aplicación de Linux. Tal vez usted también solo quería cambiar algunos colores en un editor de texto, en cuyo caso lo acompañé por un camino absurdamente largo solo para llegar a una respuesta relativamente corta.

Pero lo que es más importante, espero que el ejercicio completo pueda servir como un ejercicio más amplio de resolución de problemas. ¡Feliz Linux!

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí