Как получить путь к текущему исполняемому vimscript - PullRequest
49 голосов
/ 12 февраля 2011

В моем плагине vim у меня есть два файла:

myplugin/plugin.vim
myplugin/plugin_helpers.py

Я бы хотел импортировать plugin_helpers из plugin.vim (используя поддержку Python vim), поэтому я считаю, что сначала мне нужно поместить каталог моего плагина в sys.path python.

Как я могу (в vimscript) получить путь к исполняемому в данный момент скрипту? В питоне это __file__. В рубине это __FILE__. Я не мог найти ничего похожего на vim, прибегая к помощи, можно ли это сделать?

Примечание: Я не ищу в настоящий момент отредактированный файл ("%: p" и друзья).

Ответы [ 3 ]

68 голосов
/ 11 сентября 2013
" 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.

35 голосов
/ 12 февраля 2011

Нашел:

let s:current_file=expand("<sfile>")
11 голосов
/ 24 января 2014

Стоит отметить, что вышеуказанное решение будет работать только вне функции.

Это не даст желаемого результата:

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

Вот полное решение оригинального вопроса ОП:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...