我如何在vimscript中获取当前文件类型,例如在 .vimrc 或常规插件脚本中?
该行
echo &filetype
返回一个空字符串。
函数内:
let current_filetype = &filetype
:echo &filetype
&filetype
是文件类型。当没有文件类型时,&filetype
为空(显然)。如果在没有加载缓冲区的情况下尝试使用它,则不会得到任何结果。&filetype
才有用。仅当确定某个缓冲区属于某些文件类型时,才会设置&filetype
。执行脚本(vimrc、ftplugin等)时不经过文件类型检查,也不进行&filetype
检查。&filetype
没有意义,因为它将为空。&filetype
似乎是空的。(但是,在 Vim 中运行 :echo &filetype
会返回正确的文件类型。) - chtenb&filetype
在运行时起作用,而不是在您的脚本中。您可以在运行时执行的函数中使用 &filetype
。 - romainl*.vim
脚本时,没有&filetype
,因为此时它根本不相关。您可能想要知道缓冲区的文件类型的唯一情况是当您运行由autocmd
或:Command
或映射触发的函数时。在这种情况下,请使用我答案中的第一个代码片段。如果您想要更多帮助,则必须解释您想要什么并可能展示一些代码。 - romainl你需要考虑插件的时间。当Vim启动时,如果你的插件脚本在源码中,那么没有缓冲区被加载,因此&filetype
为空。因此,类似以下这样的代码:
let s:formatprgvarname = "g:formatprg_".&filetype
无法工作!(对于~/.vim/ftplugin/
中的文件类型插件,情况有所不同;只有在检测到文件类型时才会源化它们。但据我所知,您需要一个考虑当前文件类型的通用插件。)
相反,放弃脚本局部变量s:formatprgvarname
并在执行操作时解析&filetype
;即当您的自动格式化功能被触发时(通过映射或自定义命令)。如果没有这样的触发器,您可以连接到FileType
事件,然后设置一个(最好是缓冲区局部的)变量:
autocmd FileType * let b:formatprgvarname = "g:formatprg_".&filetype
.vimrc
中,还没有加载缓冲区,因此它是空的。 - Ingo Karkat.vim/bundles/vim-autoformat/plugin/autoformat.vim
中。 - chtenb.vimrc
一样,现在还为时过早)或函数/映射/命令内部?! - Ingo Karkatlet s:formatprgvarname = "g:formatprg_".&filetype
- chtenb