Desativar realce de sintaxe, dependendo do tamanho e tipo do arquivo


16

Geralmente, tenho que editar vários arquivos XML com o vim, que variam muito em tamanho - de arquivos de configuração contendo algumas linhas hunded a arquivos de dados de produção com tamanhos de até 2 GB. Ter o destaque da sintaxe ativado é, obviamente, uma péssima idéia ao lidar com arquivos enormes, portanto, desejo desativá-lo se o arquivo for maior que um limite.

Eu não consegui fazer isso funcionar usando autocommanddiretamente para desativar o realce da sintaxe, pois aparentemente o comando é executado antes da sintaxe ser ativada ao iniciar o vim a partir do shell:

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

Encontrei uma solução alternativa em que posso desativar o realce de sintaxe globalmente, ativá-lo novamente para todos os outros tipos de arquivos que não xml e ativá-lo para o tipo de arquivo xml se o arquivo não for maior que o limite:

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

Isso parece funcionar, mas parece errado e se tornará incontrolável quando eu quiser fazer isso para mais tipos de arquivos e condições. Além disso, ele influencia todos os buffers. Qual é a maneira correta de desativar o destaque de sintaxe em um buffer em condições específicas?



Embora este Q seja bem escrito, ele parece cobrir amplamente o mesmo terreno (de fato, um subconjunto) deste: vi.stackexchange.com/questions/149/…
Andrew Ferrier

4
@AndrewFerrier Eu argumentaria contra isso. A outra pergunta é sobre dicas gerais para lidar com arquivos grandes. O meu é sobre a implementação de uma peça bastante específica do quebra-cabeça sob um determinado conjunto de restrições. Basta comparar as respostas - as respostas para a outra pergunta dizem para desativar a sintaxe, mas não como fazer isso dinamicamente em um único buffer para um único tipo de arquivo. Portanto, isso não resolverá meu problema muito mais específico. Eles estão relacionados, mas não são duplicados, pois pedem coisas diferentes e levam a respostas diferentes.
L4mpi

14mpi, esse é um ponto justo, eu também não tinha visto a coisa do tipo de arquivo. Apenas testando as águas do novo beta aqui parcialmente! Ponto tomado. Retirei meu voto duplicado.
Andrew Ferrier

Respostas:


11

Este comentário de derobert me levou à solução:

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

Isso parece desativar de maneira confiável o realce da sintaxe em apenas um buffer.

O autocmd BufReadPrefoi um pouco de um arenque vermelho. syntax off trabalha no BufReadPrecontexto, mas não no Filetypecontexto (e, é claro, desativa a sintaxe globalmente); enquanto setlocal syntax=OFFfaz não trabalho no BufReadPrecontexto, mas trabalha no Filetypecontexto.


1

Isto autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endifé o que você precisa.


2
Hmm, isso desativa o realce da sintaxe, mas em todos os buffers, não apenas no arquivo grande. Além disso, &ftparece não estar definido nesse contexto, portanto, não sei como restringi-lo apenas aos arquivos xml. Alguma ideia?
L4mpi

Eu acho que você quer, em set syntax=OFFvez disso. (Ou isso deve ser colocado em local?)
derobert 4/15/15

talvez você queira tentar syntax clear, talvez?
Dhruva Sagar

@derobert setlocal syntax=OFFfunciona, embora não com BufReadPre *- eu tive que mudar o autocommand de volta Filetype xmlpara isso. Parece que é não-trivial que comanda trabalho em que autocommand contextos ...
l4mpi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.