如果文件有多个扩展名,则自动在`filetype`中设置多个文件类型

时间:2011-12-07 10:24:37

标签: vim

我经常在Ruby on Rails上开发。最近在RoR 3中包含了Tilt,我们有.scss.erb等文件扩展名。如何在这种情况下自动生成filetype = scss.erb,对于每个具有多个扩展名的文件都是如此?

修改:在这种情况下应为scss.eruby,因为erb扩展名默认为eruby文件类型。

编辑:如果不清楚,我正在寻找一种方法,使所有具有多个扩展名的文件动态地工作。例如,文件foo.js.html的文件类型应为js.html

再次编辑:Prince Goulash的答案不采用特定扩展名的默认文件类型。

1 个答案:

答案 0 :(得分:16)

在你的vimrc中:

autocmd BufRead,BufNewFile *.scss.erb setlocal filetype=scss.eruby

(见:help ftdetect,第2节)。

修改

要为多个扩展设置dyanamically文件类型,这似乎对我有用:

autocmd BufRead,BufNewFile *.*.*
    \ sil exe "setlocal filetype=" . substitute(expand("%"),"^[^.]*\.","",1)

substitute命令通过简单地从第一个.之前的文件名中删除所有文本来构建filtype。可能有更复杂的方式......

再次编辑

这是另一次尝试。 MultiExtensionFiletype()是一个函数,它使用扩展名最后一部分的默认文件类型,并在扩展名的第一部分(即夹在点之间的部分)作为前缀。

function MultiExtensionFiletype()
    let ft_default=&filetype
    let ft_prefix=substitute(matchstr(expand('%'),'\..\+\.'),'\.','','g')
    sil exe "set filetype=" . ft_prefix  . "." . ft_default
endfunction

必须在BufReadPost事件上调用该函数,以便通过忽略多个扩展来设置初始文件类型。

autocmd BufReadPost *.*.* call MultiExtensionFiletype()

希望这个答案正在收集有用的东西!