首页 > 解决方案 > rust vim 插件文件类型检测不起作用

问题描述

我在 ~/.vim/pack/plugins/start 中安装了 rust.vim 插件。如果我打开一个名为 main.rs 的文件并输入 :scriptnames,则输出如下

`

 1: /usr/share/vim/vimrc
  2: /usr/share/vim/vim74/debian.vim
  3: /usr/share/vim/vim74/syntax/syntax.vim
  4: /usr/share/vim/vim74/syntax/synload.vim
  5: /usr/share/vim/vim74/syntax/syncolor.vim
  6: /usr/share/vim/vim74/filetype.vim
  7: /usr/share/vim/vim74/ftplugin.vim
  8: /usr/share/vim/vim74/indent.vim
  9: ~/.vim/plugin/ScrollColor.vim
 10: ~/.vim/plugin/color_sample_pack.vim
 11: ~/.vim/plugin/mimicpak.vim
 12: /usr/share/vim/vim74/plugin/getscriptPlugin.vim
 13: /usr/share/vim/vim74/plugin/gzip.vim
 14: /usr/share/vim/vim74/plugin/logiPat.vim
 15: /usr/share/vim/vim74/plugin/matchparen.vim
 16: /usr/share/vim/vim74/plugin/netrwPlugin.vim
 17: /usr/share/vim/vim74/plugin/rrhelper.vim
 18: /usr/share/vim/vim74/plugin/spellfile.vim
 19: /usr/share/vim/vim74/plugin/tarPlugin.vim
 20: /usr/share/vim/vim74/plugin/tohtml.vim
 21: /usr/share/vim/vim74/plugin/vimballPlugin.vim
 22: /usr/share/vim/vim74/plugin/zipPlugin.vim
 23: ~/.vim/pack/plugins/start/rust.vim/plugin/cargo.vim
 24: ~/.vim/pack/plugins/start/rust.vim/plugin/rust.vim
 25: ~/.vim/pack/plugins/start/rust.vim/ftdetect/rust.vim
 26: /usr/share/vim/vim74/syntax/hercules.vim

`

如果我输入 :set ft,输出如下:

filetype=hercules

与 hercules 相关的 :autocmd filetypedetect 的输出:

*.vc      setf hercules
*.ev      setf hercules
*.rs      setf hercules
*.sum     setf hercules
*.errsum  setf hercules

没有与生锈有关的线条

与大力神有关的:20verbose e main.rs 的输出:

Executing BufRead Auto commands for "*.rs"
autocommand setf hercules
line 0: setf hercules

接下来是一堆关于 Hercuels 格式的行。

Searching for "/.vim/ftplugin/hercules.vim"
Searching for "/.vim/ftplugin/hercules_*.vim"
Searching for "/.vim/ftplugin/hercules/*.vim"
Searching for "/.vim/pack/plugins/start/rust.vim/ftplugin/hercules.vim"
Searching for "/.vim/pack/plugins/start/rust.vim/ftplugin/hercules_*.vim"
Searching for "/.vim/pack/plugins/start/rust.vim/ftplugin/hercules/*.vim"
Searching for "/var/lib/vim/addons/ftplugin/hercules.vim"
Searching for "/var/lib/vim/addons/ftplugin/hercules_*.vim"
Searching for "/var/lib/vim/addons/ftplugin/hercules/*.vim"
Searching for "/usr/share/vim/vimfiles/ftplugin/hercules.vim"

这个搜索块稍后也会重复。在输出的最后是这样的:

 Executing BufRead Auto commands for "*.rs"
autocommand setf rust
line 0: setf rust
Executing BufEnter Auto commands for "*"
autocommand sil call s:LocalBrowse(expand("<amatch>"))
line 0: sil call s:LocalBrowse(expand("<amatch>"))

谁能告诉我如何让 vim 将文件类型读取为 rust 而不是 hercules?

标签: vim

解决方案


检查 的输出:autocmd filetypedetect。对我来说(Vim 8.1.744),以下模式适用于hercules/ rust。(我不知道 rust.vim 插件做了什么,但至少文件类型检测、插件和语法已经随 Vim 本身提供。)

*.vc      setf hercules
*.ev      setf hercules
*.sum     setf hercules
*.errsum  setf hercules
[...]
*.rs      setf rust

对你来说,输出大概是不同的。您需要找出错误模式的来源。一种方法是观察打开文件时执行的所有命令:

:20verbose e main.rs

如果 hercules 文件类型优先于 rust 文件类型(根据您的编辑似乎就是这种情况),您要么必须删除 hercules 文件类型(我想知道那个*.rsglob 是从哪里来的,即使我的旧 Vim 7.4 也没有它),或定义如下所述的覆盖:help new-filetypeA. 如果要覆盖所有默认文件类型检查。也就是说,创建一个文件~/.vim/ftdetect/rust.vim

au BufRead,BufNewFile *.rs      set filetype=rust

请注意区别::set filetype=是无条件设置,而:setf默认规则使用的设置仅在尚未定义的情况下设置(因此到目前为止,hercules 首先为您赢得了胜利)。


推荐阅读