.vimrc如何设置自己的文件类型?

时间:2013-04-15 08:42:37

标签: syntax-highlighting vim vim-syntax-highlighting

为响应SuperUser上的this question,我写了一个小的vimscript,它将检测符号链接的文件类型并更改语法高亮显示:

  

au BufNewFile,BufRead * if& syntax ==''|无声! execute(':set filetype ='。matchstr(resolve(@%),'。[^。] * $')[1:])| ENDIF

因此,如果我打开没有扩展名的符号链接,它将查看它指向的文件的扩展名。

它有效,但意外的结果是现在我的.vimrc文件的语法高亮显示消失了。默认情况下,我的.vimrc文件具有vim语法高亮显示(:echo &syntax返回vim)。

但是当我添加上述行时,:echo &syntax会返回vimrc(无效类型)。

我不知道为什么会这样。 &syntax==''不应评估为false,从而保持&syntax==vim?我怀疑在语法突出显示设置为vim之前我的代码正在执行。但 <{1}}的{​​{1}}的语法高亮设置是什么时候?另外,如何让我的脚本按照应有的方式运行?

3 个答案:

答案 0 :(得分:1)

在Vim的运行时区域中查找filetype.vim。您可以使用以下内容将其提升到:

:e $VIMRUNTIME/filetype.vim

在我的版本中,看起来这行很有效:

" Vim script
au BufNewFile,BufRead *vimrc*           call s:StarSetf('vim')

也许您想将autocmd放入~/.vim/after/filetype.vim。我相信这会导致它在系统之后注册,然后&syntax应该正确设置。

答案 1 :(得分:1)

jszakmeister's answer准确诊断问题:filetype.vim设置vimrc的文件类型。

另一种解决方案是,保留.vimrc文件中包含的所有内容,使用:

  

au BufNewFile,BufReadPre * if&amp; syntax ==''|无声! execute(':set filetype ='。matchstr(resolve(@%),'。[^。] * $')[1:])| ENDIF

请注意从 BufRead 更改为 BufReadPre 。此更改导致此行在 filetype.vim之前执行。语法将更改为vimrc,但随后会更改为vim。结果是脚本按原样运行,但保留了vimrc的语法高亮。

答案 2 :(得分:0)

当前文件为~/.vimrc时,代码的这一部分

matchstr(resolve(@%),'.[^.]*$')

返回您的文件名:.vimrc

我不知道你怎么能想象/home/username/.vimrc会产生vim

对于你试图解决的问题,这显然是一个糟糕的方法,但没有错误:你得到了你所要求的。使用文件类型的文件名/扩展名无法可靠地运行(js vs javascriptpy vs python ...)。

如果您希望代码执行您想要的操作,您可能需要一个文件名/文件类型列表或许多if/elseif

请参阅:h syntax-loading