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=19
O 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 reset
y 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 ~/.vimrc
y 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!