Como digo ao vim que algumas extensões de arquivo são sinônimos?

21

Eu edito o código C ++ nos .cpparquivos, enquanto o código do modelo entra nos .tccarquivos. Quando abro esse arquivo, nenhum destaque de sintaxe está disponível. Eu tentei set syntax=cppem um tpp.vimarquivo ~/.vim/ftplugin/, mas ele não faz nada, enquanto no editor ele funciona. Existe alguma maneira de o vim tratar extensões específicas como sinônimos de outras pessoas?

remo
fonte

Respostas:

19

A abordagem preferida é criar um ~/.vim/filetype.vim, conforme mencionado :help 43.2e explicado no Vim FAQ 26.8 :

Uma alternativa melhor à abordagem acima é criar um arquivo filetype.vim no diretório ~ / .vim (ou em um dos diretórios especificados na opção 'runtimepath') e adicionar as seguintes linhas:

" my filetype file
if exists("did_load_filetypes")
    finish
endif
augroup filetypedetect
    au! BufRead,BufNewFile *.x       setfiletype c
augroup END

Editar:

O did_load_filetypesnão deve lhe causar problemas; isso exigiria apenas uma reinicialização do Vim após a alteração.

É necessário para evitar o carregamento múltiplo e desnecessário deste arquivo e é herdado do arquivo base ($ VIMRUNTIME / filetype.vim):

" Vim support file to detect file types
"
" Maintainer:   Bram Moolenaar <[email protected]>
" Last Change:  2014 Jun 12

" Listen very carefully, I will say this only once
if exists("did_load_filetypes")
  finish
endif
let did_load_filetypes = 1

Para mais informações, consulte :help new-filetype.

mMontu
fonte
Por que a ifdeclaração? Se eu deixar, os autocmds não são executados para mim.
oarfish
@ararfish mesmo se você reiniciar o Vim?
MMontu
Ok, isso é estranho. Eu tenho que au!declarações no grupo, ou seja, au! BufRead,BufNewFile *.py setfiletype pythonna linha abaixo au! BufRead,BufNewFile *.tpp setfiletype cpp. Mas apenas o segundo realmente funciona. A edição de .pyarquivos não define o tipo de arquivo para python. Eu não sou exatamente um vim-guru, então provavelmente estou perdendo alguma coisa.
oarfish
@ararfish Se você verificar o arquivo que mencionei na edição, descobrirá que ele já contém uma linha com au BufNewFile,BufRead *.py,*.pyw setf python, portanto sua primeira linha é irrelevante. Seu problema provavelmente está em outro lugar.
MMontu
"Editing .py files does not set the file type to python"- qual é o resultado :set ftdesse caso? Se não for python, tente seguir o procedimento no Vim-FAQ 2.5 - Eu tenho um problema "xyz" (alguns) com o Vim
mMontu
14

Você poderia fazer (no seu mundo .vimrc):

autocmd BufEnter *.tpp :setlocal filetype=cpp
edi9999
fonte
autocmd BufEnter *.cuf :setlocal filetype=fortranpara deleite CUDA Fortran arquivos como Fortran
khaverim
1

Pode-se também: au BufRead,BufNewFile *.tpp setlocal filetype=cppem sua .vimrcforma que ao abrir um arquivo com .tppextensão, filetype está definido para C ++

tallamjr
fonte
11
Isso parece ser basicamente idêntico à resposta de @ edi9999. Você pode explicar por que usar em BufRead,BufNewFilevez de BufEnter?
Oarfish
@oarfish Acho que não importa muito, mas prefiro BufRead,BufNewFileantes, BufEnterporque nos documentos ( :help BufEnter) ele afirma: "BufEnter: .... Também é executado quando você começa a editar um buffer, após os comandos automáticos do BufReadPost." onde BufReadPost é sinônimo de BufRead . Além disso, não acredito que isso :seja necessário antes, setlocalpor isso também o omiti na minha resposta. (Eu poderia ter interpretado isso completamente errado, feliz ao ouvir uma discussão mais aprofundada)
tallamjr