列出已知的文件类型


54

如何获得vim当前知道的文件类型名称列表?

我希望能够做到这一点,以便在vim无法自动检测到文件类型时,我可以尝试一些vim知道的文件类型,这些文件类型可能相似,并查看它们是否提供合理的语法突出显示。

我知道处理文件类型的vimscript文件是按惯例放在ftplugin目录中的,但它们不一定是必需的(我不确定,但我不认为ftplugin目录中的vimscript文件是特殊的),所以我只想询问vim它知道什么文件类型,而不管它如何了解它们。


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

1
使用<c-d>而不是<tab>列出补全。
彼得·林克

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

Answers:


63

简单的解决方案

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

有关:help cmdline-completion更多信息,请参见vim的命令行。

复杂的解决方案

该解决方案使用该'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()
  • :help fnamemodify()
  • :help add()
  • :help uniq()
  • :help sort()

1
输入时set filetype<space><c d>,它会显示一个列表,但html不在列表中。Java不在列表中。如何以与语法格式配置相对应的文件类型来显示文件类型名称?
John Meyer

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

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

18

如果您的vim版本足够新(v7.4.2011 +),则可以使用我们现在可以用来帮助定义手动自动完成功能的功能来请求已知文件类型: getcompletion()

:echo getcompletion('', 'filetype')

如果您希望将列表限制为以开头的文件类型'c',请致电

:echo getcompletion('c', 'filetype')

等等。

注意:与解析中的文件名和目录名的$VIMRUNTIME/{syntax,filetype}/解决方案不同,此解决方案'runtimepath'也会进行分析。据我了解,它看不到使用set ft=foobar或在自动命令之后动态定义/注册的新文件类型。


3

您还可以通过运行以下2个命令在终端中打印所有文件类型:

1。

cd $(vim -e -T dumb --cmd 'exe "set t_cm=\<C-M>"|echo $VIMRUNTIME|quit' | tr -d '\015')

2。

cat <(ls -1 ftplugin/*.vim) <(ls -1 syntax/*.vim) | tr '\n' '\0' | xargs -0 -n 1 basename | sort | uniq | cut -f 1 -d '.'

第一个命令只是导航到您的vim运行时路径(对我来说是/ usr / share / vim / vim80)。

第二条命令列出了vim存储文件类型定义的两个文件夹中的所有文件类型名称。

更新资料

建议对muru的两个命令进行以下改进:

1。

cd $(vim -Nesc '!echo $VIMRUNTIME' -c qa)

2。

find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u

3
这太过复杂了。使用tr转换换行,只空将其转换回第二天命令,进程替换时,简单的命令分组会做。我建议使用类似以下内容:find syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
大师

不错,方法更简洁。还有从终端查找VIMRUNTIME值的更好解决方案吗?
萨米尔·阿拉杰莫维奇

1
vim -Nesc '!echo $VIMRUNTIME' -c qa, 我认为。
muru

kes。第二个命令令人恐惧。抱歉。我不是很好 ;)为了好玩,这里有一个Bash的替代穆鲁的建议,即只使用一个外部命令(假设printf是一个内置)f=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u。有关象形文字的说明,请参见Bash手册页中的“参数扩展”。
B层

这将为您提供psuedo文件类型插件,如bash,“不是真正的文件类型插件...并获得文件类型” sh”的效果”
jeremysprofile
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.