既知のファイルタイプをリストする


54

vimが現在知っているファイルタイプの名前のリストを取得するにはどうすればよいですか?

vimがファイルタイプを自動的に検出しない場合、vimがそれについて知っているファイルタイプのいくつかを試して、合理的な構文強調表示を提供するかどうかを確認できるように、これを行うことができます。

ファイルタイプを扱うvimscriptファイルはftplugin慣習的にディレクトリに置かれることを知っていますが、そうする必要はありません(確かではありませんが、ftpluginディレクトリ内のvimscriptファイルは特別ではないと思います)それらについてどのように学んだかに関係なく、vimが知っているファイルタイプをvimに尋ねてください。


1
オートコンプリート:setfiletype (つまりTab、スペースの後に)を試みると、リストを表示できます。完全なリストなのか、それをバッファ/ファイルにキャプチャする方法がわからない。
ヴァンレーザー

1
<c-d>代わりに使用して、<tab>補完をリストします。
ピーターリンカー

リストをフィルタリングし、これらの文字で始まるエントリを表示するには、文字を入力します。
シャマオケ

回答:


63

シンプルなソリューション

タイプ:setfiletype (後でスペース付き)、押しCtrl-d

:help cmdline-completionvimのコマンドラインでオートコンプリートの詳細を参照してください。

複雑なソリューション

このソリューションでは、'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はリストに含まれていません。構文フォーマット設定に対応するファイルタイプの意味でファイルタイプ名を表示するにはどうすればよいですか?
ジョンマイヤー

6
@JohnMeyer:同じ間違いを犯しました。コマンドには、実際:setfiletypeには「set」と「filetype」の間に典型的なスペースがありません。:help :setfiletypeおよびで詳細を確認できます:help ftdetect
サンスコア

私はこれを試しましたが、うまくいきます!ところで、: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でした)。

2番目のコマンドは、vimがファイルタイプ定義を保存する2つのフォルダー内のすべてのファイルタイプ名をリストします。

更新

以下を提供するmuruによる2つのコマンドの改善案:

1。

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

2。

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

3
これはパイプラインが複雑すぎます。使用してtr、簡単なコマンドのグループ化を行うだろうと、唯一の非常に次のコマンドをバックに変換するためにnullに改行を変換するプロセス置換。次のようなものをお勧めしますfind syntax ftplugin -iname '*.vim' -exec basename -s .vim {} + | sort -u
。– muru

ニース、もっと簡潔に。端末からVIMRUNTIME値を見つけるためのより良いソリューションはありますか?
サミールAlajmovic

1
vim -Nesc '!echo $VIMRUNTIME' -c qa、 おもう。
ムル

うわぁ。その2番目のコマンドは恐ろしいです。ごめんなさい。私は良くありません。;)楽しみのために、muruの提案に代わるBashの代替案を1つだけ使用します(外部コマンドは1つだけですprintff=({ftplugin,syntax}/*.vim) && f=(${f[@]##*/}) && printf "%s\n" "${f[@]%%.*}" | sort -u。象形文字の説明については、Bashのマニュアルページの「パラメータ拡張」を参照してください。
Bレイヤー

これによりbash、「実際のファイルタイププラグインではない...およびファイルタイプ「sh」の効果を得る」などの疑似ファイルタイププラグインが得られます
jeremysprofile
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.