1

针对 SuperUser 上的这个问题,我编写了一个小的 vimscript,它将检测符号链接的文件类型并更改语法突出显示:

au BufNewFile,BufRead * if &syntax == '' | 沉默的!执行 (':set filetype='.matchstr(resolve(@%),'.[^.]*$')[1:]) | 万一

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

它可以工作,但一个意想不到的结果是,现在我的.vimrc文件的语法高亮已经消失了。默认情况下,我的 .vimrc 文件具有 vim 语法高亮显示(:echo &syntax返回vim)。

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

我不知道为什么会这样。不应该&syntax==''评估为假,从而保持&syntax==vim?我怀疑我的代码在语法高亮设置为vim. 但是,语法高亮究竟如何(以及何时)设置为vimfor 的.vimrc?此外,我怎样才能让我的脚本按照它应该的方式运行?

4

3 回答 3

1

在 Vim 的运行时区中查找filetype.vim. 你可以在 vim 中使用:

:e $VIMRUNTIME/filetype.vim

在我的版本中,这条线似乎可以解决问题:

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

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

于 2013-04-15T09:34:29.017 回答
1

jszakmeister 的回答准确地诊断了问题:filetype.vim为 vimrc 设置文件类型。

但是,为了将所有内容保留在 .vimrc 文件中,另一种解决方案是使用:

au BufNewFile,BufReadPre * if &syntax == '' | 沉默的!执行 (':set filetype='.matchstr(resolve(@%),'.[^.]*$')[1:]) | 万一

注意从BufReadBufReadPre的变化。该更改导致该行在filetype.vim之前执行。语法将更改为vimrc,但随后更改为vim。结果是脚本可以正常工作,但保留了 vimrc 的语法突出显示。

于 2013-04-16T01:32:10.583 回答
0

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

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

返回您的文件名:.vimrc.

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

对于您尝试解决的问题,这显然是一种不好的方法,但没有错误:您得到的正是您所要求的。使用文件类型的文件名/扩展名不能可靠地工作(jsvs javascriptpyvs python...)。

if/elseif如果你想让你的代码做你想做的事情,你可能需要一个文件名/文件类型列表或许多。

:h syntax-loading

于 2013-04-15T09:18:47.740 回答