Bagaimana saya memberi tahu vim bahwa beberapa ekstensi file adalah sama?

21

Saya mengedit kode C ++ di .cppfile, sedangkan kode template masuk ke .tccfile. Ketika saya membuka file seperti itu, tidak ada penyorotan sintaks yang tersedia. Saya mencoba set syntax=cppdalam tpp.vimfile dalam ~/.vim/ftplugin/, tetapi tidak melakukan apa-apa, sementara di editor berfungsi. Apakah ada cara agar vim memperlakukan ekstensi tertentu sebagai identik dengan yang lain?

oarfish
sumber

Jawaban:

19

Pendekatan yang disukai adalah membuat ~/.vim/filetype.vim, sebagaimana disebutkan dalam :help 43.2dan dijelaskan dalam Vim FAQ 26.8 :

Alternatif yang lebih baik untuk pendekatan di atas adalah membuat file filetype.vim di direktori ~ / .vim (atau di salah satu direktori yang ditentukan dalam opsi 'runtimepath') dan tambahkan baris berikut:

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

Edit:

The did_load_filetypesseharusnya tidak menyebabkan gangguan apa pun; itu hanya akan membutuhkan Vim restart setelah diubah.

Hal ini diperlukan untuk menghindari pemuatan file yang banyak dan tidak perlu, dan ini diwarisi dari file dasar ($ 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

Untuk informasi lebih lanjut, periksa :help new-filetype.

mMontu
sumber
Mengapa ifpernyataan itu? Jika saya membiarkannya, autocmds tidak dieksekusi untuk saya.
oarfish
@oarfish bahkan jika Anda me-restart Vim?
mMontu
Ok, ini aneh. Saya harus au!pernyataan dalam grup, yaitu au! BufRead,BufNewFile *.py setfiletype pythondan di baris di bawah ini au! BufRead,BufNewFile *.tpp setfiletype cpp. Tetapi hanya yang kedua yang benar-benar berfungsi. Mengedit .pyfile tidak mengatur jenis file menjadi python. Aku bukan vim-guru jadi aku mungkin melewatkan sesuatu.
oarfish
@ oarfish jika Anda memeriksa file yang saya sebutkan di edit Anda akan menemukan bahwa itu sudah berisi baris au BufNewFile,BufRead *.py,*.pyw setf python, jadi baris pertama Anda tidak relevan. Masalah Anda mungkin di tempat lain.
mMontu
"Editing .py files does not set the file type to python"- apa output dari :set ftkasus itu? Jika bukan python, coba ikuti prosedur di Vim-FAQ 2.5 - Saya punya masalah "xyz" (beberapa) dengan Vim
mMontu
14

Anda dapat melakukannya (di global Anda .vimrc):

autocmd BufEnter *.tpp :setlocal filetype=cpp
edi9999
sumber
autocmd BufEnter *.cuf :setlocal filetype=fortranuntuk memperlakukan file CUDA Fortran sebagai Fortran
khaverim
1

Satu juga bisa memiliki: au BufRead,BufNewFile *.tpp setlocal filetype=cppdi mereka .vimrcsehingga saat membuka file dengan .tppekstensi, filetype ditetapkan untuk C ++

tallamjr
sumber
1
Ini tampaknya pada dasarnya identik dengan jawaban @ edi9999. Bisakah Anda menguraikan mengapa menggunakan BufRead,BufNewFilebukan BufEnter?
oarfish
@oarfish Tidak masalah saya pikir terlalu banyak, tapi saya lebih suka BufRead,BufNewFilesebelumnya BufEnterkarena dalam dokumen ( :help BufEnter) menyatakan: "BufEnter: .... Juga dieksekusi ketika mulai mengedit buffer, setelah perintah otomatis BufReadPost." di mana BufReadPost identik dengan BufRead . Selain itu, saya tidak percaya :diperlukan sebelum setlocaljadi saya juga dihilangkan dalam jawaban saya. (Saya mungkin telah menafsirkan ini sepenuhnya salah, senang mendengar diskusi lebih lanjut)
tallamjr