¿Cómo puedo agregar reglas de resaltado de sintaxis adicionales en mi vimrc local?

10

Instalé gvim en Fedora y Win7. Descubrí que tanto vim como gvim en Fedora no resaltaban el nombre de la función en el código c, mientras que gvim en win7 sí lo resaltaba.

Encontré que en win7, vim73/syntax/c.vimtiene las líneas adicionales al final:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

Si agrego estas líneas en c.vimFedora, gvim también puede resaltar el nombre de la función.

Para mantener la portabilidad, solo quiero modificar .vimrcpara resaltar el nombre de la función. Sin embargo, después de agregar estas líneas en el .vimrc, no funcionó.

Entonces, ¿alguien puede ayudarme? Hice una búsqueda y hay muchas soluciones para resaltar los nombres de las funciones en vim. Pero tengo curiosidad por saber cómo hacer que estas líneas funcionen .vimrc. ¡Muchas gracias!

Tamlok
fuente
55
Intenta agregarlo en su ~/.vim/after/syntax/c.vimlugar.
muru
@muru Sí, funciona. Pero, ¿qué hay de agregarlo a .vimrc?
tamlok
Probablemente tendrías que usar algo como autocmd BufEnter *.c hl ..., pero deberías guardarlo after/syntax/c.vim. Cualquier versión moderna de Vim entenderá el .vim/after/directorio. En Windows, la ruta sería vimfiles/after/..., por lo que la portabilidad no debería ser un gran problema (especialmente si usa complementos).
muru

Respuestas:

13

Sin embargo, después de agregar estas líneas al .vimrc, no funcionó.

La razón de esto es que Vim borra los elementos de sintaxis existentes al configurar la 'syntax'opción. Esto se hace porque mantener los elementos de sintaxis antiguos conduciría a situaciones extrañas; si tiene un búfer que tiene syntax=fooy usa set syntax=bar, terminará con un búfer que tiene resaltado de sintaxis para ambos foo y bar.

Cuando Vim se inicia, carga una vimrcvez (en el inicio), pero carga los archivos de tipo de archivo y sintaxis cada vez que se configuran las opciones filetypeo syntax, lo que restablecerá los valores que ha establecido en su vimrc.

Incluso si no lo restableciera, no sería una buena idea agregarlo a su vimrc, ya que se aplicaría a todos los buffers, y no solo a los buffers con syntax=c.


El texto a continuación asume Vim en un sistema Unix-y, pero también funcionará para los usuarios de Neovim y Windows:

  • Los usuarios de Neovim deben reemplazar ~/.vim/con ~/.config/nvim/.
  • Los usuarios de Windows deben reemplazar ~/.vim/con %USERPROFILE%\vimfiles\.

Anular un archivo completo

La forma más fácil de cambiar algo es simplemente anularlo . Para hacerlo, cree un archivo en ~/.vim/<file>.vim.

<file.vim>es la ruta relativa a $VIMRUNTIME(incluidos los subdirectorios). En su ejemplo, debería ser syntax/c.vim. Se cargará en lugar del archivo en $VIMRUNTIME.

El resultado de esto es que es más fácil hacer cambios: enmendar los archivos de sintaxis existentes puede ser un poco complicado a veces. La desventaja es que no recibirá actualizaciones futuras en el archivo de todo el sistema.

A menudo uso esto como punto de partida para experimentar con archivos de sintaxis, y luego extraigo mis cambios locales a una adición local usando uno de los métodos que se describen a continuación.

Adiciones locales

Hay dos formas de agregar adiciones locales a los archivos de sintaxis, son funcionalmente idénticas y puede usar el método que prefiera.

Syntax autocmd

Use el Syntaxautocmd:

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

Tenga en cuenta que encadenar varios comandos |es problemático aquí, ya que tienden a interpretarse como parte del :syncomando, por lo que he repetido autocmd Syntax cvarias veces. Una alternativa sería usar una función:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

La ventaja es que todos los cambios pueden estar contenidos en un solo archivo. La desventaja es que es un poco feo, especialmente si tiene muchos cambios.

después del directorio

Utilice el directorio de post-: ~/.vim/after/<file>.vim.

Esto se cargará después de <file>.vimhas, donde <file.vim>es la ruta relativa a $VIMRUNTIME(incluidos los subdirectorios). En su ejemplo, debería ser syntax/c.vim.

También vea :help after-directory.

La ventaja es que es un poco más legible que el autocmd, especialmente si tiene muchos cambios. La desventaja es que necesitará copiar un archivo adicional si desea duplicar su configuración de Vim en diferentes máquinas (esta es una razón importante por la que muchas personas mantienen sus archivos Vim en un repositorio de GitHub, por lo que puede reflejarse fácilmente en las máquinas )

Martin Tournoij
fuente