Vim插件脚本中如何获取文件类型

6

我如何在vimscript中获取当前文件类型,例如在 .vimrc 或常规插件脚本中?
该行

echo &filetype

返回一个空字符串。

展示你在哪里使用它。在.vimrc中,还没有加载缓冲区,因此它是空的。 - Ingo Karkat
我需要它在.vim/bundles/vim-autoformat/plugin/autoformat.vim中。 - chtenb
在引用(和.vimrc一样,现在还为时过早)或函数/映射/命令内部?! - Ingo Karkat
在使用Indeed进行资源获取时:let s:formatprgvarname = "g:formatprg_".&filetype - chtenb
2个回答

5

函数内:

let current_filetype = &filetype

在命令行上:
:echo &filetype
&filetype是文件类型。当没有文件类型时,&filetype为空(显然)。如果在没有加载缓冲区的情况下尝试使用它,则不会得到任何结果。
编辑:
只有在需要在运行时执行的函数中知道当前文件类型时,&filetype才有用。仅当确定某个缓冲区属于某些文件类型时,才会设置&filetype。执行脚本(vimrc、ftplugin等)时不经过文件类型检查,也不进行&filetype检查。
例如,函数根据文件类型在不同的外部应用程序中显示当前文件。在其他上下文中使用&filetype没有意义,因为它将为空。

在插件脚本中,对于所有文件类型(比如 Vim 和 Python),&filetype 似乎是空的。(但是,在 Vim 中运行 :echo &filetype 会返回正确的文件类型。) - chtenb
&filetype 在运行时起作用,而不是在您的脚本中。您可以在运行时执行的函数中使用 &filetype - romainl
谢谢您的解释。有没有办法在我的脚本中获取它?如果没有,我将不得不更改设计。 - chtenb
你看了我的回答吗?当评估*.vim脚本时,没有&filetype,因为此时它根本不相关。您可能想要知道缓冲区的文件类型的唯一情况是当您运行由autocmd:Command或映射触发的函数时。在这种情况下,请使用我答案中的第一个代码片段。如果您想要更多帮助,则必须解释您想要什么并可能展示一些代码。 - romainl

2

你需要考虑插件的时间。当Vim启动时,如果你的插件脚本在源码中,那么没有缓冲区被加载,因此&filetype为空。因此,类似以下这样的代码:

let s:formatprgvarname = "g:formatprg_".&filetype

无法工作!(对于~/.vim/ftplugin/中的文件类型插件,情况有所不同;只有在检测到文件类型时才会源化它们。但据我所知,您需要一个考虑当前文件类型的通用插件。)

相反,放弃脚本局部变量s:formatprgvarname并在执行操作时解析&filetype ;即当您的自动格式化功能被触发时(通过映射或自定义命令)。如果没有这样的触发器,您可以连接到FileType事件,然后设置一个(最好是缓冲区局部的)变量:

autocmd FileType * let b:formatprgvarname = "g:formatprg_".&filetype

切换到具有不同文件类型的缓冲区时,FileType事件是否也会被触发? - chtenb
1
不,只有在最初检测到时才会执行。 - Ingo Karkat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接