2011-02-12 89 views
37

在我的vim插件目前Vimscript中,我有兩個文件:如何獲得路徑正在執行

myplugin/plugin.vim 
myplugin/plugin_helpers.py 

我想進口從plugin.vim plugin_helpers(使用vim的Python支持),所以我相信我首先需要將我的插件的目錄放在python的sys.path中。

我該如何(在vimscript中)獲取當前正在執行的腳本的路徑?在python中,這是__file__。紅寶石,它是__FILE__。我無法通過Google搜索找到任何類似的vim,可以完成嗎?

注:我不是尋找當前編輯文件( 「%:p」 和朋友)。

+0

源相對於路徑當前腳本:`執行'源'。展開(':p:h')。 '/ another.vim'` – 2015-06-25 08:44:44

回答

53
" Relative path of script file: 
let s:path = expand('<sfile>') 

" Absolute path of script file: 
let s:path = expand('<sfile>:p') 

" Absolute path of script file with symbolic links resolved: 
let s:path = resolve(expand('<sfile>:p')) 

" Folder in which script resides: (not safe for symlinks) 
let s:path = expand('<sfile>:p:h') 

" If you're using a symlink to your script, but your resources are in 
" the same directory as the actual script, you'll need to do this: 
" 1: Get the absolute path of the script 
" 2: Resolve all symbolic links 
" 3: Get the folder of the resolved absolute file 
let s:path = fnamemodify(resolve(expand('<sfile>:p')), ':h') 

我用,往往最後一個,因爲我的~/.vimrc是一個符號鏈接到一個腳本在一個Git倉庫。

32

發現:

let s:current_file=expand("<sfile>") 
+14

它幫助其他人。確保在最高級別範圍內執行此操作。如果你試圖在一個函數中運行它,你最終會得到函數名,而不是包含該函數的文件的路徑。 – 2012-02-12 21:54:38

+3

我很驚訝在互聯網上找到這些信息有多困難,謝謝! – 2013-01-15 06:53:22

+1

`:p`爲絕對路徑。 `:p:h`代表腳本所在的目錄。 – Zenexer 2013-05-10 12:56:57

7

值得一提的是,上述解決方案只能在一個函數之外使用。

這將不會得到預期的結果:

function! MyFunction() 
let s:current_file=expand('<sfile>:p:h') 
echom s:current_file 
endfunction 

但這會:

let s:current_file=expand('<sfile>') 
function! MyFunction() 
echom s:current_file 
endfunction 

這裏有一個完整的解決方案,以OP的原題:

let s:path = expand('<sfile>:p:h') 

function! MyPythonFunction() 
import sys 
import os 
script_path = vim.eval('s:path') 

lib_path = os.path.join(script_path, '.') 
sys.path.insert(0, lib_path)          

import vim 
import plugin_helpers 
plugin_helpers.do_some_cool_stuff_here() 
vim.command("badd %(result)s" % {'result':plugin_helpers.get_result()}) 

EOF 
endfunction