为响应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}}的语法高亮设置是什么时候?另外,如何让我的脚本按照应有的方式运行?
答案 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 javascript
,py
vs python
...)。
如果您希望代码执行您想要的操作,您可能需要一个文件名/文件类型列表或许多if/elseif
。
请参阅:h syntax-loading
。