我该如何告诉vim某些文件扩展名是同义词?


21

我在.cpp文件中编辑C ++代码,而模板代码进入.tcc文件中。当我打开这样的文件时,没有语法突出显示可用。我set syntax=cpp在中的一个tpp.vim文件中尝试过~/.vim/ftplugin/,但是它什么也没做,而在编辑器中却可以。有什么办法可以使vim将特定扩展名与其他扩展名同义?

Answers:


19

首选的方法是创建一个~/.vim/filetype.vim,如Vim FAQ 26.8中所述:help 43.2并在其中解释:

更好的替代方法是在〜/ .vim目录(或在'runtimepath'选项指定的目录之一)中创建一个filetype.vim文件,并添加以下几行:

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

编辑:

did_load_filetypes不该你带来任何麻烦; 更改后只需要重启Vim。

为了避免多次不必要地加载此文件,这是必要的,它是从基本文件($ VIMRUNTIME / filetype.vim)继承的:

" Vim support file to detect file types
"
" Maintainer:   Bram Moolenaar <Bram@vim.org>
" 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

有关更多信息,请检查:help new-filetype


为什么要if声明?如果我将其保留,则不会为我执行autocmds。
oarfish

@oarfish即使重新启动Vim?
mMontu 2015年

好吧,这很奇怪。我必须au!在组中,即au! BufRead,BufNewFile *.py setfiletype python在下面的行中声明au! BufRead,BufNewFile *.tpp setfiletype cpp。但只有第二个实际上有效。编辑.py文件不会将文件类型设置为python。我不是vim专家,所以我可能会缺少一些东西。
oarfish 2015年

@oarfish如果您检查我在编辑中提到的文件,您会发现该文件已经包含带有的行au BufNewFile,BufRead *.py,*.pyw setf python,因此您的第一行是无关紧要的。您的问题可能在其他地方。
mMontu 2015年

"Editing .py files does not set the file type to python"- :set ft在这种情况下的输出是什么?如果不是python,请尝试按照Vim-FAQ 2.5中
-Vim

14

您可以(在您的全局范围内.vimrc)执行以下操作:

autocmd BufEnter *.tpp :setlocal filetype=cpp

autocmd BufEnter *.cuf :setlocal filetype=fortran将CUDA Fortran文件视为Fortran
khaverim

1

人们还可以有:au BufRead,BufNewFile *.tpp setlocal filetype=cpp在他们.vimrc这样在打开一个文件.tpp扩展名,文件类型设置为C ++


1
这似乎与@ edi9999的答案基本相同。您能否详细说明为什么要使用BufRead,BufNewFile而不是BufEnter
oarfish '18

@oarfish我认为这没什么大不了,但我更喜欢这样做BufRead,BufNewFileBufEnter因为在docs(:help BufEnter)中它指出:“ BufEnter:...。在BufReadPost自动命令之后开始编辑缓冲区时也会执行。” 其中BufReadPostBufRead的同义词。另外,我不认为:之前必须setlocal这样做,因此我在回答中也忽略了这一点。(我可能认为这是完全错误的,很高兴听到进一步的讨论)
tallamjr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.