2013-05-10 95 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 
    
    相關問題