diff options
Diffstat (limited to 'path.vim')
-rw-r--r-- | path.vim | 201 |
1 files changed, 0 insertions, 201 deletions
diff --git a/path.vim b/path.vim deleted file mode 100644 index 6f8fe44..0000000 --- a/path.vim +++ /dev/null @@ -1,201 +0,0 @@ -" Vim auto-load script -" Author: Peter Odding <peter@peterodding.com> -" Last Change: April 18, 2013 -" URL: http://peterodding.com/code/vim/misc/ - -let s:windows_compatible = has('win32') || has('win64') -let s:mac_os_x_compatible = has('macunix') - -function! xolox#misc#path#which(...) - let extensions = s:windows_compatible ? split($PATHEXT, ';') : [''] - let matches = [] - let checked = {} - for directory in split($PATH, s:windows_compatible ? ';' : ':') - let directory = xolox#misc#path#absolute(directory) - if !has_key(checked, directory) - if isdirectory(directory) - for program in a:000 - for extension in extensions - let path = xolox#misc#path#merge(directory, program . extension) - if executable(path) - call add(matches, path) - endif - endfor - endfor - endif - let checked[directory] = 1 - endif - endfor - return matches -endfunction - -" Split a pathname into a list of path components. - -function! xolox#misc#path#split(path) - if type(a:path) == type('') - if s:windows_compatible - return split(a:path, '[\/]\+') - else - let absolute = (a:path =~ '^/') - let segments = split(a:path, '/\+') - return absolute ? insert(segments, '/') : segments - endif - endif - return [] -endfunction - -" Join a list of path components into a pathname. - -function! xolox#misc#path#join(parts) - if type(a:parts) == type([]) - if !s:windows_compatible && a:parts[0] == '/' - return join(a:parts, '/')[1 : -1] - else - return join(a:parts, '/') - endif - endif - return '' -endfunction - -" Canonicalize and resolve a pathname. - -function! xolox#misc#path#absolute(path) - if type(a:path) == type('') - let path = fnamemodify(a:path, ':p') - " resolve() doesn't work when there's a trailing path separator. - if path =~ '/$' - let stripped_slash = 1 - let path = substitute(path, '/$', '', '') - endif - let path = resolve(path) - " Restore the path separator after calling resolve(). - if exists('stripped_slash') && path !~ '/$' - let path .= '/' - endif - return path - endif - return '' -endfunction - -" Make an absolute pathname relative. - -function! xolox#misc#path#relative(path, base) - let path = xolox#misc#path#split(a:path) - let base = xolox#misc#path#split(a:base) - while path != [] && base != [] && path[0] == base[0] - call remove(path, 0) - call remove(base, 0) - endwhile - let distance = repeat(['..'], len(base)) - return xolox#misc#path#join(distance + path) -endfunction - -" Join a directory and filename into a single pathname. - -function! xolox#misc#path#merge(parent, child, ...) - " TODO Use isabs()! - if type(a:parent) == type('') && type(a:child) == type('') - if s:windows_compatible - let parent = substitute(a:parent, '[\\/]\+$', '', '') - let child = substitute(a:child, '^[\\/]\+', '', '') - return parent . '\' . child - else - let parent = substitute(a:parent, '/\+$', '', '') - let child = substitute(a:child, '^/\+', '', '') - return parent . '/' . child - endif - endif - return '' -endfunction - -" Find the common prefix of path components in a list of pathnames. - -function! xolox#misc#path#commonprefix(paths) - let common = xolox#misc#path#split(a:paths[0]) - for path in a:paths - let index = 0 - for segment in xolox#misc#path#split(path) - if len(common) <= index - break - elseif common[index] != segment - call remove(common, index, -1) - break - endif - let index += 1 - endfor - endfor - return xolox#misc#path#join(common) -endfunction - -" Encode a pathname so it can be used as a filename. - -function! xolox#misc#path#encode(path) - if s:windows_compatible - let mask = '[*|\\/:"<>?%]' - elseif s:mac_os_x_compatible - let mask = '[\\/%:]' - else - let mask = '[\\/%]' - endif - return substitute(a:path, mask, '\=printf("%%%x", char2nr(submatch(0)))', 'g') -endfunction - -" Decode a pathname previously encoded with xolox#misc#path#encode(). - -function! xolox#misc#path#decode(encoded_path) - return substitute(a:encoded_path, '%\(\x\x\?\)', '\=nr2char("0x" . submatch(1))', 'g') -endfunction - -" Check whether two pathnames point to the same file. - -if s:windows_compatible - function! xolox#misc#path#equals(a, b) - return a:a ==? a:b || xolox#misc#path#absolute(a:a) ==? xolox#misc#path#absolute(a:b) - endfunction -else - function! xolox#misc#path#equals(a, b) - return a:a ==# a:b || xolox#misc#path#absolute(a:a) ==# xolox#misc#path#absolute(a:b) - endfunction -endif - -" Check whether a path is relative. - -function! xolox#misc#path#is_relative(path) - if a:path =~ '^\w\+://' - return 0 - elseif s:windows_compatible - return a:path !~ '^\(\w:\|[\\/]\)' - else - return a:path !~ '^/' - endif -endfunction - -" Create a temporary directory and return the path. - -function! xolox#misc#path#tempdir() - if !exists('s:tempdir_counter') - let s:tempdir_counter = 1 - endif - if exists('*mkdir') - if s:windows_compatible - let template = $TMP . '\vim_tempdir_' - elseif filewritable('/tmp') == 2 - let template = '/tmp/vim_tempdir_' - endif - endif - if !exists('template') - throw "xolox#misc#path#tempdir() hasn't been implemented on your platform!" - endif - while 1 - let directory = template . s:tempdir_counter - try - call mkdir(directory, '', 0700) - return directory - catch /\<E739\>/ - " Keep looking for a non-existing directory. - endtry - let s:tempdir_counter += 1 - endwhile -endfunction - -" vim: ts=2 sw=2 et |