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

#1 楼

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


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

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




编辑:

did_load_filetypes应该不会给您带来任何问题;

为了避免多次不必要地加载此文件,这是必要的,并且它是从基础文件继承的($ 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。

– ar鱼
2015年11月10日14:28

@oarfish即使重新启动Vim?

–mMontu
2015年11月10日15:05

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

– ar鱼
2015年11月10日15:11

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

–mMontu
2015年11月10日15:16

“编辑.py文件不会将文件类型设置为python”-在这种情况下:set ft的输出是什么?如果不是python,请尝试按照Vim-FAQ 2.5中的步骤进行操作-Vim存在“ xyz”(某些)问题

–mMontu
2015年11月10日15:20



#2 楼

您可以这样做(在您的全局.vimrc中):

autocmd BufEnter *.tpp :setlocal filetype=cpp


评论


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

– khaverim
18年1月27日在18:38

如果您要与一种语言关联多个文件,请用逗号分隔模式,并在逗号之间没有空格:autocmd BufEnter * .tsx,*。jsx,*。ts:setlocal filetype = javascript

–ggorlen
20年1月9日在23:20

#3 楼

还可能有:au BufRead,BufNewFile *.tpp setlocal filetype=cpp,位于它们的.vimrc中,这样一来,打开带有.tpp扩展名的文件时,文件类型就设置为C ++

评论


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

– ar鱼
'18 Sep 5'在10:02

@oarfish我认为这没什么大不了,但我更喜欢BufEnter之前的BufRead,BufNewFile,因为在文档(:help BufEnter)中它指出:“ BufEnter:...。在开始编辑缓冲区时也会执行,之后BufReadPost自动命令。”其中BufReadPost是BufRead的同义词。另外,我不认为:在setlocal之前是必需的,因此我在回答中也省略了它。 (我可能认为这是完全错误的,很高兴听到进一步的讨论)

–tallamjr
18/09/5在10:50