domingo, 12 de abril de 2009

Fazendo o vim reconhecer um novo tipo de arquivo pela extensão

Se você está usando um tipo de arquivo que não é reconhecido pelo Vim, isto é
como você faz ele ser reconhecido. Você precisa de um diretório runtime seu
próprio (~/.vim).

Crie um arquivo 'filetype.vim' que contém um autocomando para seu tipo de
arquivo:
augroup filetypedetect
au BufNewFile,BufRead *.xyz setf xyz
augroup END
Isto reconhecerá todos arquivos que terminem com '.xyz' como do tipo de arquivo
'xyz'.

Os comandos ':augroup' colocam este comando no grupo 'filetypedetect'. Isto
permite remover todos autocomandos para detecção de tipo de arquivo quando
fazendo ':filetype off'.

O comando 'setf' irá carregar a opção 'filetype' a menos que ela já carregada.
Isto assegura que 'filetype' não foi definida duas vezes.

Você pode usar muitos padrões diferentes para corresponder com o nome do seu
arquivo. Nomes de diretório podem ser incluídos.
Por exemplo, os arquivos debaixo de '/usr/share/scripts/' são todos arquivos
'ruby' mas não tem a extensão de nome de arquivo esperada. Adicione isto ao
exemplo:
augroup filetypedetect
au BufNewFile,BufRead *.xyz setf xyz
au BufNewFile,BufRead /usr/share/scripts/* setf ruby
augroup END
Todavia, se você editar agora um arquivo '/usr/share/scripts/README.txt', isto
não é um arquivo ruby.
O perigo de um padrão terminando em '*' é que ele rapidamente corresponde a
muitos arquivos.
Para evitar problemas como este, coloque o 'filetype.vim' em outro diretório, um
que está no final de 'runtimepath'. No Unix, po exemplo, você poderia usar
'~/.vim/after/filetype.vim'.
Você agora coloca a detecção de arquivos texto em '~/.vim/filetype.vim':
augroup filetypedetect
au BufNewFile,BufRead *.txt setf text
augroup END
Este arquivo é encontrado primeiro no 'runtimepath'. Então use isto no
'~/.vim/after/filetype.vim', o qual é encontra por último:
augroup filetypedetect
au BufNewFile,BufRead /usr/share/scripts/* setf ruby
augroup END
O que acontece agora é que o Vim procura pelo 'filetype.vim' em cada diretório
do 'runtimepath'.
Primeiro '~/.vim/filetype.vim' é localizado. o autocomando para pegar arquivos
'*.txt' está definido lá.
Então o Vim acha o 'filetype.vim' no '$VIMRUNTIME', o qual está no meio do
caminho no 'runtimepath'.
Finalmente, o '~/.vim/after/filetype.vim' é achado e o autocomando para detectar
arquivos ruby em '/usr/share/scripts' é adicionado.

Quando você editar agora '/usr/share/scripts/README.txt', os autocomandos são
verificados na ordem em que foram definidos. O padrão '*.txt' corresponde, então
'setf text' é executado para definir o tipo do arquivo como 'text'.
O padrão para o ruby corresponde também, e o 'setf ruby' é executado. Mas como o
'filetype' já foi definido como 'text', nada acontece aqui.

Quando você edita o arquivo '/usr/share/scripts/foobar' os mesmos autocomandos
são verificados. Somente aquele do 'ruby' corresponde e 'setf ruby' define
'filetype' para 'ruby'.

0 comentários:

Postar um comentário