9

パス文字列(必ずしも現在のファイルのパスではない)に対して、vimscriptのbashdirnameコマンドまたはpythonと同じことをしたい。os.path.split()[0]

望ましい動作の例:

  • /a/b/->/a
  • /a/b->/a

私は試しfnamemodify()ましたが、その出力はディレクトリが存在するかどうかに依存するようです:

:ec fnamemodify( '/usr/idontexist', ':p:h')

与えます:

/usr

これは良いことですが:

:ec fnamemodify( '/usr/bin', ':p:h')

与えます:

/usr/bin

これは私が望んでいるものではなく、それが何をしているのかわかりません。

クロスプラットフォームのソリューションを見つけたいと思っています。

4

2 に答える 2

18

の説明のこの部分を読みましたか:h:

 When the file name ends in a path separator, only the path
            separator is removed. Thus ":p:h" on a directory name results
        on the directory name itself (without trailing slash).

それが次の理由です。

:ec fnamemodify( '/usr/bin/', ':p:h')  "directory, ending with /
-> /usr/bin
:ec fnamemodify( '/usr/bin/', ':h')  "directory, ending with /
-> /usr/bin
:ec fnamemodify( '/usr/bin', ':p:h')  "directory, not ending with /
-> /usr/bin
:ec fnamemodify( '/usr/bin', ':h')  "directory, not ending with /
-> /usr

したがって、出力を決定する要因は 2 つあります。

  • あなたの文字列がで終わる場合separator
  • 使用した場合:p

/目標を達成するために、文字列が(またはで終わっている場合は最後の文字を削除して\ in win?)から、:p

于 2013-05-10T16:01:52.183 に答える