如何获取路径字符串的父目录

时间:2013-05-10 15:30:43

标签: vim

我希望在vimscript中对bash dirname命令或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

这不是我想要的,我无法弄清楚它在做什么。

我希望找到一个跨平台的解决方案。

2 个答案:

答案 0 :(得分:8)

您是否已阅读: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

所以决定输出有两个因素。

  • 如果您的字符串以separator
  • 结尾
  • 如果您使用:p

要实现目标,如果字符串以/(或\ in win?)结尾,则可以删除最后一个字符,然后传递给不带:p的函数

答案 1 :(得分:5)

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

:p修饰符会将路径扩展为完整路径。因此它必须是一条真正的道路。如果你没有弄乱真正的路径,就不要使用:p

:h filename-modifiers