Jak powiedzieć vimowi, że niektóre rozszerzenia plików są synonimami?

21

Kod C ++ edytuję w .cppplikach, a kod szablonów w .tccplikach. Kiedy otwieram taki plik, podświetlanie składni nie jest dostępne. Próbowałem set syntax=cppw tpp.vimpliku ~/.vim/ftplugin/, ale nic nie robi, podczas gdy w edytorze działa. Czy jest jakiś sposób, aby vim traktował określone rozszerzenia jako synonimy?

wiosłowa
źródło

Odpowiedzi:

19

Preferowanym podejściem jest utworzenie ~/.vim/filetype.vim, jak wspomniano :help 43.2i wyjaśniono w Vim FAQ 26.8 :

Lepszą alternatywą dla powyższego podejścia jest utworzenie pliku filetype.vim w katalogu ~ / .vim (lub w jednym z katalogów określonych w opcji „runtimepath”) i dodanie następujących wierszy:

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

Edytować:

Nie did_load_filetypespowinno to powodować żadnych problemów; wymagałoby to ponownego uruchomienia Vima dopiero po zmianie.

Jest to konieczne, aby uniknąć wielokrotnego i niepotrzebnego ładowania tego pliku, i jest dziedziczony z pliku podstawowego ($ 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

Aby uzyskać więcej informacji, sprawdź :help new-filetype.

mMontu
źródło
Dlaczego ifoświadczenie? Jeśli zostawię to, autocmds nie są dla mnie wykonywane.
wiosłowa
@oarfish, nawet jeśli uruchomisz ponownie Vima?
mMontu,
Ok, to dziwne. Mam au!oświadczenia w grupie, a mianowicie au! BufRead,BufNewFile *.py setfiletype pythonw wierszu poniżej au! BufRead,BufNewFile *.tpp setfiletype cpp. Ale tylko drugi faktycznie działa. Edycja .pyplików nie ustawia typu pliku na python. Nie jestem do końca vim-guru, więc pewnie czegoś mi brakuje.
wiosłowa
@oarfish, jeśli sprawdzisz plik, o którym wspomniałem w edycji, przekonasz się, że zawiera on już linię z au BufNewFile,BufRead *.py,*.pyw setf python, więc twój pierwszy wiersz jest nieistotny. Twój problem jest prawdopodobnie gdzie indziej.
mMontu,
"Editing .py files does not set the file type to python"- jaki jest wynik :set fttej sprawy? Jeśli nie jest to Python, spróbuj wykonać procedurę opisaną w Vim-FAQ 2.5 - Mam problem z
Ximem
14

Możesz zrobić (w swoim globalnym .vimrc):

autocmd BufEnter *.tpp :setlocal filetype=cpp
edi9999
źródło
autocmd BufEnter *.cuf :setlocal filetype=fortrantraktować pliki CUDA Fortran jak Fortran
khaverim
1

Można również mieć: au BufRead,BufNewFile *.tpp setlocal filetype=cppw .vimrctaki sposób, że po otwarciu pliku z .tpprozszerzeniem ustawiony jest typ pliku dla C ++

tallamjr
źródło
1
Wydaje się, że jest to w zasadzie identyczna z odpowiedzią @ edi9999. Czy możesz wyjaśnić, dlaczego używać BufRead,BufNewFilezamiast BufEnter?
Oarfish
@oarfish Myślę, że nie ma to większego znaczenia, ale wolę BufRead,BufNewFilewyprzedzić, BufEnterponieważ w docs ( :help BufEnter) napisano: „BufEnter: .... Wykonane również podczas rozpoczynania edycji bufora, po komendach automatycznych BufReadPost”. gdzie BufReadPost jest synonimem BufRead . Ponadto nie wierzę, że :jest to wymagane wcześniej, setlocalwięc w odpowiedzi na to pominąłem. (Mogłem zinterpretować to całkowicie błędnie, ciesząc się z dalszej dyskusji)
tallamjr