2014-04-04 74 views
0

我正在用Vimscript讀取配置文件foo.yml。該文件包含一個參數,該參數是目錄的相對路徑。這path是相對於foo.yml文件,而不是我目前的工作目錄。展開包含文件的相對路徑wrt

我需要將此相對路徑擴展爲絕對路徑。

我試過用fnamemodify(path, ':p')expand(path)沒有運氣。我認爲這些函數看起來很困惑,因爲從當前工作目錄來看,相對路徑是無效的。所以它保持原樣。

有沒有辦法讓Vim在解析相對路徑時使用foo.yml作爲參考點?或者其他可以做同樣的功能?

感謝您的幫助。

回答

2

爲了相對於文件目錄進行擴展,最簡單的方法是暫時將:cd放入該目錄。下面是一些示例代碼,用於爲當前文件執行此操作(%);你必須適應這一點,以通過文件規範工作。

if expand('%:h') !=# '.' 
    " Need to change into the file's directory first to get glob results 
    " relative to the file. 
    let l:save_cwd = getcwd() 
    let l:chdirCommand = (haslocaldir() ? 'lchdir!' : 'chdir!') 
    execute l:chdirCommand '%:p:h' 
endif 
try 
    " Get the full path to a:filespec, relative to the current file's directory. 
    let l:absoluteFilespec = fnamemodify(a:filespec, ':p') 
finally 
    if exists('l:save_cwd') 
     execute l:chdirCommand fnameescape(l:save_cwd) 
    endif 
endtry 
+0

好答案!這完成了工作。在try-catch中使用它也是一個好的提示。 –

1

如何

:let dir = expand('%:p:h') 
:let absolute_path = dir . '/' . path 

你將不得不如果你想讓它工作在Windows上更加努力地工作,太。

:help expand() 
:help filename-modifiers 
:help file-functions 
+0

不錯的嘗試,但是如果'path'可能與它的孩子有關,就不會工作。 –

+0

請說明,或舉一個例子。在我看來,我已經回答了問題,但我想我錯過了一些東西。 「我正在閱讀一個配置文件foo.yml ......這條路徑與foo.yml文件相關。」擴展('%:p:h')'不給foo.yml的目錄,還是不是你所說的「相對於foo.yml文件」? – benjifisher

+0

你的回答很好。但是如果路徑是相對的,比如'a/b/c/d'指向foo.yml所在的目錄,那麼它就不起作用。無論如何,感謝您的幫助,但是我已經使用'lcd'封裝了代碼並按照@Ingo的建議進行了恢復。 –