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 autocommand
diretamente 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?
fonte
Respostas:
Este comentário de derobert me levou à solução:
Isso parece desativar de maneira confiável o realce da sintaxe em apenas um buffer.
O
autocmd BufReadPre
foi um pouco de um arenque vermelho.syntax off
trabalha noBufReadPre
contexto, mas não noFiletype
contexto (e, é claro, desativa a sintaxe globalmente); enquantosetlocal syntax=OFF
faz não trabalho noBufReadPre
contexto, mas trabalha noFiletype
contexto.fonte
Isto
autocmd BufReadPre * if getfsize(expand("%")) > 10000000 | syntax off | endif
é o que você precisa.fonte
&ft
parece não estar definido nesse contexto, portanto, não sei como restringi-lo apenas aos arquivos xml. Alguma ideia?set syntax=OFF
vez disso. (Ou isso deve ser colocado em local?)syntax clear
, talvez?setlocal syntax=OFF
funciona, embora não comBufReadPre *
- eu tive que mudar o autocommand de voltaFiletype xml
para isso. Parece que é não-trivial que comanda trabalho em que autocommand contextos ...