No vim, como se faz para aplicar autocommands para um tipo de ficheiro para uma região de um arquivo?
-
02-01-2020 - |
Pergunta
Eu tenho uma espécie de poliglota tipo de arquivo que pode ter incorporado C, python, ruby, etc nele (pensar "a página wiki' se isso ajuda).Existe uma maneira de executar o autocommands para um conhecido filetype em uma região de um arquivo?
Por exemplo, eu poderia ter:
#!bash
if [ a = b ]; then
echo 'equal'
fi
#!python
if a = b:
print('equal')
E eu quero aplicar bash filetype autocommands para a primeira parte e python filetype autocommands para a última parte.
Eu consiga sintaxe hilighting definindo uma região usando este o método, mas eu não entendo autocommands o suficiente para ser capaz de aplicá-los de uma forma semelhante.
Solução
Fazendo isso automaticamente é um desafio, assim como o tipo de ficheiro de definições são de buffer-local;O Vim não tem noção de regiões, de modo :autocmds
precisa ser usado, como já foi escrito corretamente.
Rápido e fácil
Com um plug-in como NrrwRgn - Uma Região Estreita Plugin semelhante ao Emacs, você pode clonar regiões para separar zero buffers;o plugin automaticamente sincroniza-los a voltar a escrever.Cada buffer pode ser dado um separado por tipo de arquivo através de :setf
.
Uma abordagem ainda mais simples é definir alguns mapeamentos para alternar rapidamente tipos de arquivos:
:nnoremap <Leader>fp :setf python<CR>
:nnoremap <Leader>fs :setf sh<CR>
Realmente regiões separadas em um único buffer
O esboço deste é fácil:
:autocmd CursorMoved,CursorMovedI <buffer> if line('.') >= 6 | setf python | else | setf sh | endif
Isso depende de cada tipo de plugin para fazer a limpeza adequada (ou substituindo todas as opções).
Como determinar as regiões
Você certamente não deseja especificar os números de linha explicitamente como no desenho acima.Meu OnSyntaxChange plugin pode ajudar, no caso de você ter / pode definir a sintaxe adequada regiões para cada bloco.