2013-05-10 59 views
2

我想在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 

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

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

回答

7

你读过的: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 

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

  • 如果你的,如果你使用:p

,以实现自己的目标与separator

  • 结尾的字符串,你可以,如果该字符串与/(或\ in win?)结束删除最后一个字符,然后传递给没有:p

  • +0

    我认为这不是我的问题的由来,但我反而问自己,无论如何,所以+1。多么复杂的行为... – 2013-05-10 16:14:25

    +0

    t请回我的最后一条评论,这*是我的问题的主要原因!使用':p'不仅仅是因为dir可能不存在,而是因为使用':p:h'不能做我想要的。 ':p'删除了'idontexist'部分,似乎做了我想要的东西,这些都属于未定义的行为,只会让我感到困惑。 – 2013-05-11 05:33:09

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

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

    :h filename-modifiers 
    
    相关问题