2

vimスクリプトのパスの下にディレクトリ名を取得する簡単なソリューションが必要です。

これが私の試した方法です:コード。https://gist.github.com/4307744 関数は行L84にあります。

この関数をinput()の完全な関数として使用します。したがって、この関数はパスの下にあるディレクトリ名のリストを返す必要があります。例えば

to/path/
        - a/
        - b/

取得したいab

でvimの内部関数を見つけようとしました:help functions。見つかっただけですがglobpath()、フルパスを返します。

それで、誰かが簡単な解決策を持っていますか?(ところで、Vimのパスの下でディレクトリ名を取得するのがとても難しいのはなぜですか??)

4

1 に答える 1

10

意図的かどうかはわかりませんが、glob()ディレクトリを、パターンが で終わるパスを持つディレクトリのみに制限します/

let directories=glob(fnameescape(top_directory).'/{,.}*/', 1, 1)
call map(directories, 'fnamemodify(v:val, ":h:t")')

. いくつかの説明:

  • fnameescape()top_directory をエスケープし (to/pathこの例では に設定する必要があります)、その中の特殊文字が独自に展開されるのを防ぎます (以前は という名前のディレクトリがありました*.*)。
  • {,.}UNIX では、vim はデフォルトでドットで始まるファイルをリストしないため、これが必要です。通常、.*pattern は special.および..directory に一致し、その後削除されますが、何らかの理由{,.}*で一致しないことに注意してください。
  • , 1, 1glob()無視'suffixes'してオプションを作成'wildignore'し(最初)、リストを返します(2番目、最新のvimが必要です)。
  • 最後の (2 番目の) 行は、要求どおりにディレクトリ名のみを保持するためのものです。通常:h:tは親ディレクトリ名のみを返しますが、次のglob()ようなパスを出力するため、末尾のスラッシュのみを削除します。ディレクトリ パスを取り除きます (末尾のパス コンポーネントを返します)。末尾のパス コンポーネントのスラッシュを削除しないと、空の文字列になります。to/path/a/:h:t:h

すべてを 1 行に結合できます。

let directories=map(glob(fnameescape(top_directory).'/{,.}*/', 1, 1), 'fnamemodify(v:val, ":h:t")')
于 2012-12-17T04:30:03.217 に答える