1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-02-09 19:50:06 +08:00
SpaceVim/bundle/gina.vim/autoload/gina/core/path.vim

77 lines
2.2 KiB
VimL

let s:Git = vital#gina#import('Git')
let s:Path = vital#gina#import('System.Filepath')
let s:String = vital#gina#import('Data.String')
let s:is_windows = has('win32') || has('win64')
if s:is_windows
function! gina#core#path#expand(expr) abort
return s:Path.unixpath(s:expand(s:realpath(a:expr)))
endfunction
function! gina#core#path#abspath(path, ...) abort
let path = s:realpath(a:path)
return s:Path.unixpath(call('s:abspath', [path] + a:000))
endfunction
function! gina#core#path#relpath(path, ...) abort
let path = s:realpath(a:path)
return s:Path.unixpath(call('s:relpath', [path] + a:000))
endfunction
function! s:realpath(path) abort
if a:path =~# '^\w\+://'
return s:Path.unixpath(a:path)
endif
return s:Path.realpath(a:path)
endfunction
else
function! gina#core#path#expand(expr) abort
return s:expand(a:expr)
endfunction
function! gina#core#path#abspath(path, ...) abort
return call('s:abspath', [a:path] + a:000)
endfunction
function! gina#core#path#relpath(path, ...) abort
return call('s:relpath', [a:path] + a:000)
endfunction
endif
function! s:expand(expr) abort
if empty(a:expr) || a:expr[0] ==# ':'
return a:expr
elseif a:expr[:6] ==# 'gina://'
let git = gina#core#get_or_fail({'expr': a:expr})
let path = gina#core#buffer#param(a:expr, 'path')
return empty(path) ? '' : s:Path.join(git.worktree, path)
elseif a:expr[0] =~# '[%#<]'
let m = matchlist(a:expr, '^\([%#]\|<\w\+>\)\(.*\)')
let expr = expand(m[1])
let modifiers = m[2]
return fnamemodify(s:expand(expr), modifiers)
endif
return a:expr
endfunction
function! s:abspath(path, ...) abort
if s:Path.is_absolute(a:path) || a:path[0] ==# ':'
return a:path
endif
let root = s:Path.remove_last_separator(a:0 == 0 ? getcwd() : a:1)
return s:Path.join(root, a:path)
endfunction
function! s:relpath(path, ...) abort
if s:Path.is_relative(a:path) || a:path[0] ==# ':'
return a:path
endif
let root = s:Path.remove_last_separator(a:0 == 0 ? getcwd() : a:1)
let pattern = s:String.escape_pattern(root . s:Path.separator())
return a:path =~# '^' . pattern
\ ? matchstr(a:path, '^' . pattern . '\zs.*')
\ : a:path
endfunction