我该如何获取vim当前知道的文件类型名称列表? vim知道文件类型可能相似,并查看它们是否提供合理的语法高亮显示。我不确定,但是我不认为ftplugin目录中的vimscript文件是特殊的),所以我想问问vim知道什么文件类型,而不管它如何了解它们。 >

评论

当您尝试在:setfiletype上自动完成时(例如,在制表符后加上空格),可以查看列表。不知道这是完整的列表,还是不确定如何将其捕获到某些缓冲区/文件中。

使用而不是列出补全。

输入一个或几个字母以过滤列表并显示以这些字母开头的条目。

#1 楼

简单解决方案

键入:setfiletype(后跟一个空格),然后按Ctrl-d

有关vim命令行中自动完成的更多信息,请参见:help cmdline-completion

复杂的解决方案

此解决方案使用'runtimepath'选项获取所有可用的语法目录,然后获取这些目录中删除了扩展名的vimscript文件的列表。这可能不是最安全的方法,因此欢迎您进行改进:

function! GetFiletypes()
    " Get a list of all the runtime directories by taking the value of that
    " option and splitting it using a comma as the separator.
    let rtps = split(&runtimepath, ",")
    " This will be the list of filetypes that the function returns
    let filetypes = []

    " Loop through each individual item in the list of runtime paths
    for rtp in rtps
        let syntax_dir = rtp . "/syntax"
        " Check to see if there is a syntax directory in this runtimepath.
        if (isdirectory(syntax_dir))
            " Loop through each vimscript file in the syntax directory
            for syntax_file in split(glob(syntax_dir . "/*.vim"), "\n")
                " Add this file to the filetypes list with its everything
                " except its name removed.
                call add(filetypes, fnamemodify(syntax_file, ":t:r"))
            endfor
        endif
    endfor

    " This removes any duplicates and returns the resulting list.
    " NOTE: This might not be the best way to do this, suggestions are welcome.
    return uniq(sort(filetypes))
endfunction


然后,您可以按照需要的任何方式使用此功能,例如打印所有列表中的值。您可以这样完成:

for f in GetFiletypes() | echo f | endfor


请注意,这可能会压缩很多,就像为了可读性一样。我不会在此说明所有使用的功能和命令,但以下是所有针对它们的帮助页面:



:help 'runtimepath'
:help :let
:help :let-&
:help split()
:help :for
:help expr-.
:help :if
:help isdirectory()
:help glob()

评论


当我输入set filetype 时,它显示了一个列表,但html不在列表中。 Java不在列表中。如何以与语法格式配置相对应的文件类型来显示文件类型名称?

–约翰·迈耶
17年11月23日在13:57

@JohnMeyer:我犯了同样的错误。该命令实际上是:setfiletype,在“ set”和“ filetype”之间没有典型的空格。您可以通过:help:setfiletype和:help ftdetect找到更多信息。

– sanscore
17-12-27 19:40



我已经尝试过了,而且有效!顺便说一句,我可以使用:setfiletype ht 列出以ht开头的文件类型,从而过滤掉不需要的结果。 :)

– pimgeek
18-10-17在7:18

#2 楼

如果您的vim版本足够新(v7.4.2011 +),则可以使用我们现在可以用来帮助定义手动自动完成功能的函数来请求已知的文件类型:getcompletion() />如果要将列表限制为以'c'开头的文件类型,则可以调用

:echo getcompletion('', 'filetype')


依此类推。

注意:与解析$VIMRUNTIME/{syntax,filetype}/中的文件名和目录名的解决方案不同,此解决方案还分析'runtimepath'
据我了解,它没有在set ft=foobar或自动命令之后即时定义/注册的新文件类型。

#3 楼

您还可以通过运行以下2个命令在终端中打印所有文件类型:
cd $(vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIMRUNTIME|quit' | tr -d '5')


第一个命令只是导航到您的vim运行时路径(对我来说是/ usr / share / vim / vim80)。 vim存储文件类型定义的两个文件夹中的文件类型名称。 >
cat <(ls -1 ftplugin/*.vim) <(ls -1 syntax/*.vim) | tr '\n' '
cd "$(vim -Nesc '!echo $VIMRUNTIME' -c qa)"
find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
' | xargs -0 -n 1 basename | sort | uniq | cut -f 1 -d '.'


评论


这太过复杂了。使用tr将换行符转换为null只能将其转换回下一个命令,如果简单的命令分组就可以进行处理替换。我建议使用类似的方法:查找语法ftplugin -iname'* .vim'-exec基本名称-s .vim {} + |排序-u

–muru
18年1月26日在1:30

不错,方法更简洁。还有从终端查找VIMRUNTIME值的更好解决方案吗?

– Samir Alajmovic
18年1月26日在8:09

vim -Nesc'!echo $ VIMRUNTIME'-c qa,我想。

–muru
18年1月26日在8:18

kes。第二个命令令人恐惧。抱歉。我不是很好;)有趣的是,这是Buru替代muru的建议的建议,该建议仅使用一个外部命令(假设printf是内置命令):f =({ftplugin,syntax} / *。vim)&& f =($ {f [@]# #* /})&& printf“%s \ n”“ $ {f [@] %%。*}” | |排序-u。有关象形文字的说明,请参见Bash手册页中的“参数扩展”。

– B层
18-10-12在5:37

这将为您提供psuedo文件类型插件(如bash),“这不是真正的文件类型插件...并获得文件类型” sh”的效果”

–jeremysprofile
19年7月30日在18:07

#4 楼

尝试查看$ VIMRUNTIME /语法。使用:echo $ VIMRUNTIME知道它的值。在我的计算机中,$ VIMRUNTIME / syntax是/ usr / share / vim / vim81 / syntax。它具有所有语法文件。

如果具有gui的vim,还可以使用“语法”菜单来获取所有受支持的文件类型。