Deshabilite el resaltado de sintaxis según el tamaño y el tipo de archivo

16

A menudo tengo que editar varios archivos XML con vim, que varían enormemente de tamaño, desde archivos de configuración que contienen algunas líneas ocultas hasta archivos de datos de producción con tamaños de hasta 2 GB. Tener el resaltado de sintaxis habilitado es, por supuesto, una muy mala idea cuando se trata de archivos grandes, por lo que quiero desactivarlo si el archivo es más grande que un umbral.

No pude hacer que esto funcione autocommanddirectamente para deshabilitar el resaltado de sintaxis, ya que aparentemente el comando se ejecuta antes de habilitar la sintaxis al iniciar vim desde el shell:

" this autocmd has no effect except for the echo:
autocmd Filetype xml if getfsize(@%) > 1000000 | echom '!' | syntax off | endif

Encontré una solución alternativa en la que puedo deshabilitar el resaltado de sintaxis a nivel mundial, luego volver a activarlo para todos los otros tipos de archivo que no sean xml, y activarlo para el tipo de archivo xml si el archivo no es mayor que el umbral:

syntax off
autocmd Filetype * syntax off
autocmd Filetype * if &ft != 'xml' | syntax enable | endif
autocmd Filetype xml if getfsize(@%) < 1000000 | syntax enable | endif

Esto parece funcionar, pero se siente mal y se volverá inmanejable una vez que quiera hacer esto para obtener más tipos de archivos y condiciones. Además, influye en todos los tampones. ¿Cuál es la forma correcta de deshabilitar el resaltado de sintaxis en un búfer en condiciones específicas?

l4mpi
fuente
Aunque esta Q está bien escrita, parece cubrir ampliamente el mismo terreno (de hecho, un subconjunto) de esta: vi.stackexchange.com/questions/149/…
Andrew Ferrier
44
@ AndrewFerrier Yo argumentaría en contra de eso. La otra pregunta es sobre consejos generales para manejar archivos grandes. El mío se trata de implementar una pieza bastante específica del rompecabezas bajo un conjunto dado de restricciones. Simplemente compare las respuestas: las respuestas a la otra pregunta me dirán que apague la sintaxis, pero no cómo hacerlo dinámicamente en un solo búfer para un solo tipo de archivo. Por lo tanto, no resolverá mi problema mucho más específico. Están relacionados pero no duplicados, ya que piden cosas diferentes y conducen a respuestas diferentes.
l4mpi
l4mpi, ese es un punto justo, no había visto el tipo de archivo también. ¡Solo estoy probando las aguas de la nueva versión beta aquí parcialmente! Punto a favor. Retiraré mi voto duplicado.
Andrew Ferrier

Respuestas:

11

Este comentario de derobert me llevó a la solución:

autocmd Filetype xml if getfsize(@%) > 1000000 | setlocal syntax=OFF | endif

Esto parece deshabilitar de manera confiable el resaltado de sintaxis en un solo búfer.

El autocmd BufReadPreera un poco de arenque rojo. syntax off funciona en el BufReadPrecontexto pero no en el Filetypecontexto (y, por supuesto, desactiva la sintaxis globalmente); mientras que setlocal syntax=OFFlo hace no trabajo en el BufReadPrecontexto, pero que funciona en el Filetypecontexto.

l4mpi
fuente
1

Esto autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifes lo que necesitas.

Dhruva Sagar
fuente
2
Hmm, esto deshabilita el resaltado de sintaxis, pero en todos los buffers, no solo en el archivo grande. Además, &ftparece no estar configurado en este contexto, por lo que no sé cómo restringirlo solo a archivos xml. ¿Algunas ideas?
l4mpi
Creo que quieres en su set syntax=OFFlugar. (¿O debería ser setlocal?)
derobert
es posible que desee probar syntax clear, tal vez?
Dhruva Sagar
@derobert setlocal syntax=OFFfunciona, aunque no con BufReadPre *- Tuve que cambiar el comando automático nuevamente Filetype xmlpara esto. Parece que no es trivial qué comandos funcionan en qué contextos de
autocomando