aboutsummaryrefslogtreecommitdiffstats
path: root/autoload/xolox/misc/option.vim
blob: efaf1bceb91e4de23a5e8773f4567dbabf7203a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
" Vim auto-load script
" Author: Peter Odding <peter@peterodding.com>
" Last Change: August 31, 2011
" URL: http://peterodding.com/code/vim/misc/

function! xolox#misc#option#get(name, ...)
  if exists('b:' . a:name)
    " Buffer local variable.
    return eval('b:' . a:name)
  elseif exists('g:' . a:name)
    " Global variable.
    return eval('g:' . a:name)
  elseif exists('a:1')
    " Default value.
    return a:1
  endif
endfunction

" Functions to parse multi-valued Vim options like &tags and &runtimepath.

function! xolox#misc#option#split(value)
  let values = split(a:value, '[^\\]\zs,')
  return map(values, 's:unescape(v:val)')
endfunction

function! s:unescape(s)
  return substitute(a:s, '\\\([\\,]\)', '\1', 'g')
endfunction

function! xolox#misc#option#join(values)
  let values = copy(a:values)
  call map(values, 's:escape(v:val)')
  return join(values, ',')
endfunction

function! s:escape(s)
  return escape(a:s, ',\')
endfunction

function! xolox#misc#option#split_tags(value)
  let values = split(a:value, '[^\\]\zs,')
  return map(values, 's:unescape_tags(v:val)')
endfunction

function! s:unescape_tags(s)
  return substitute(a:s, '\\\([\\, ]\)', '\1', 'g')
endfunction

function! xolox#misc#option#join_tags(values)
  let values = copy(a:values)
  call map(values, 's:escape_tags(v:val)')
  return join(values, ',')
endfunction

function! s:escape_tags(s)
  return escape(a:s, ', ')
endfunction

function! xolox#misc#option#eval_tags(value, ...)
  let pathnames = []
  let first_only = exists('a:1') && a:1
  for pattern in xolox#misc#option#split_tags(a:value)
    " Make buffer relative pathnames absolute.
    if pattern =~ '^\./'
      let directory = xolox#misc#escape#substitute(expand('%:p:h'))
      let pattern = substitute(pattern, '^.\ze/', directory, '')
    endif
    " Make working directory relative pathnames absolute.
    if xolox#misc#path#is_relative(pattern)
      let pattern = xolox#misc#path#merge(getcwd(), pattern)
    endif
    " Ignore the trailing `;' for recursive upwards searching because we
    " always want the most specific pathname available.
    let pattern = substitute(pattern, ';$', '', '')
    " Expand the pattern.
    call extend(pathnames, split(expand(pattern), "\n"))
    if first_only && !empty(pathnames)
      return pathnames[0]
    endif
  endfor
  return firstonly ? '' : pathnames
endfunction

" vim: ts=2 sw=2 et