【问题标题】:How does .vimrc set its own filetype?.vimrc 如何设置自己的文件类型?
【发布时间】:2013-04-07 07:42:03
【问题描述】:

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

au BufNewFile,BufRead * if &syntax == '' |无声!执行 (':set filetype='.matchstr(resolve(@%),'.[^.]*$')[1:]) |结束

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    au BufNewFile,BufReadPre * if &syntax == '' |无声!执行 (':set filetype='.matchstr(resolve(@%),'.[^.]*$')[1:]) |结束

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

    【讨论】:

      【解决方案2】:

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

      :e $VIMRUNTIME/filetype.vim
      

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

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

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

      【讨论】:

      • 我只是在回答你的问题——如何设置 .vimrc 的文件类型。如果这不是你的问题,也许你应该编辑它或改写它。我怀疑你的 autocmd 先运行,所以是的,语法是 nil。
      • 啊,对不起,我误解了——这确实回答了我问题的第一部分。
      • 我更新了我的答案。我认为你需要将你的 autocmd 放在 ~/.vim/after/filetype.vim 中,这样它就会在 Vim 运行时中的那些之后被调用。
      • 谢谢——这可能有效(尚未尝试),但我想将我自己的所有代码保存在.vimrc 中。我找到了另一种解决方案,即使用BufReadPre 而不是BufRead
      • 是不是想着把BufReadPre里的语法设置好,然后让Vim的正常BufRead破坏呢?我想这可能行得通。 FWIW,如果你打算成为 Vim 的忠实用户,你会想要 .vim 区域。你会发现你会想要调整一些默认值,或者做一些额外的事情,after 机制确实是唯一的方法。 :-)
      【解决方案3】:

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

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

      返回您的文件名:.vimrc

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

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

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

      :h syntax-loading

      【讨论】:

      • 我认为你误读了我的问题。 没有我的 .vimrc 中的那一行,&syntax==vim。所以当我添加那行到我的.vimrc 时,为什么语法会变成vimrc?自 &syntax==vim 以来,if &syntax == '' 不应该评估为零吗?
      • @Jeff,它更改为 vimrc,因为您告诉它这样做。您的问题的答案在:h syntax-loading 中(此指针在我的答案中):syntax 设置在BufReadPost 上,但您的自动命令之前在BufRead 上触发。此时,syntax 尚未设置。
      猜你喜欢
      • 1970-01-01
      • 2014-04-21
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多