188 lines
4.8 KiB
VimL
188 lines
4.8 KiB
VimL
let s:default_modes = ['n', 'N', 'v', 'i', 'r', 's']
|
|
|
|
function! s:CheckConditions(params) " {{{
|
|
" Check conditions for a segment/group
|
|
" Integer parameters are always conditions
|
|
for param in a:params
|
|
if type(param) == type(0) && param == 0
|
|
" Break here if it's an integer parameter and it's false (0)
|
|
return 0
|
|
endif
|
|
unlet! param
|
|
endfor
|
|
|
|
return 1
|
|
endfunction " }}}
|
|
function! Pl#Segment#Create(name, ...) " {{{
|
|
" Check condition parameters
|
|
if ! s:CheckConditions(a:000)
|
|
return {}
|
|
endif
|
|
|
|
let name = a:name
|
|
let modes = s:default_modes
|
|
let padding = 1
|
|
let segments = []
|
|
|
|
for param in a:000
|
|
" Lookup modes for this segment/group
|
|
if type(param) == type([]) && param[0] == 'modes'
|
|
let modes = param[1]
|
|
elseif type(param) == type([]) && param[0] == 'nopadding'
|
|
let padding = 0
|
|
elseif type(a:1) == type([]) && a:1[0] == 'segment'
|
|
call add(segments, param[1])
|
|
endif
|
|
|
|
unlet! param
|
|
endfor
|
|
|
|
if type(a:1) == type([]) && a:1[0] == 'segment'
|
|
" This is a segment group
|
|
return ['segment_group', {
|
|
\ 'type': 'segment_group'
|
|
\ , 'name': name
|
|
\ , 'segments': segments
|
|
\ , 'modes': modes
|
|
\ , 'padding': padding
|
|
\ }]
|
|
else
|
|
" This is a single segment
|
|
let text = a:1
|
|
|
|
" Search/replace symbols
|
|
for [key, symbol] in items(g:Pl#Parser#Symbols[g:Powerline_symbols].symbols)
|
|
let text = substitute(
|
|
\ text,
|
|
\ '\v\$('. key .')',
|
|
\ '\=Pl#Parser#ParseChars(g:Pl#Parser#Symbols[g:Powerline_symbols].symbols[submatch(1)])',
|
|
\ 'g')
|
|
|
|
unlet! key symbol
|
|
endfor
|
|
|
|
return ['segment', {
|
|
\ 'type': 'segment'
|
|
\ , 'name': name
|
|
\ , 'text': text
|
|
\ , 'modes': modes
|
|
\ , 'padding': padding
|
|
\ }]
|
|
endif
|
|
|
|
endfunction " }}}
|
|
function! Pl#Segment#Init(params) " {{{
|
|
" Check condition parameters
|
|
if ! s:CheckConditions(a:params)
|
|
return {}
|
|
endif
|
|
|
|
let segments = {}
|
|
let ns = ''
|
|
|
|
for param in a:params
|
|
if type(param) == type('')
|
|
" String parameters is the namespace
|
|
let ns = param
|
|
elseif type(param) == type([])
|
|
" The data dict is in param[1]
|
|
" By default we don't have a namespace for the segment
|
|
let segment = param[1]
|
|
|
|
if ! empty(ns)
|
|
" Update segment so that it includes the namespace
|
|
" Add the namespace to the segment dict key
|
|
let segment.ns = ns
|
|
let segment.name = join([segment.ns, segment.name], ':')
|
|
endif
|
|
|
|
let key = segment.name
|
|
|
|
let segments[key] = segment
|
|
endif
|
|
|
|
unlet! param
|
|
endfor
|
|
|
|
return segments
|
|
endfunction " }}}
|
|
function! Pl#Segment#Modes(modes) " {{{
|
|
" Handle modes for both segments and groups
|
|
let modes = split(a:modes, '\zs')
|
|
|
|
if modes[0] == '!'
|
|
" Filter modes (e.g. "!nr" will ignore the segment in normal and replace modes)
|
|
let modes = filter(deepcopy(s:default_modes), 'v:val !~# "['. join(modes[1:]) .']"')
|
|
endif
|
|
|
|
return ['modes', modes]
|
|
endfunction " }}}
|
|
function! Pl#Segment#NoPadding() " {{{
|
|
return ['nopadding']
|
|
endfunction " }}}
|
|
function! Pl#Segment#Split(...) " {{{
|
|
return a:0 ? a:1 .':SPLIT' : 'SPLIT'
|
|
endfunction " }}}
|
|
function! Pl#Segment#Truncate() " {{{
|
|
return 'TRUNCATE'
|
|
endfunction " }}}
|
|
function! Pl#Segment#Get(name) " {{{
|
|
" Return a segment data dict
|
|
let args = []
|
|
|
|
" Check for printf segments (lists)
|
|
if type(a:name) == type([])
|
|
" We're dealing with a segment with printf arguments
|
|
let seg_orig_name = a:name[0]
|
|
let args = a:name[1:]
|
|
else
|
|
let seg_orig_name = a:name
|
|
endif
|
|
|
|
" Fetch namespace and variants for storing in the segment dict
|
|
let seg_ns = ''
|
|
let seg_variants = []
|
|
|
|
" Retrieve color scheme variants
|
|
let seg_name_split = split(seg_orig_name, '\v\.')
|
|
if len(seg_name_split) > 1
|
|
let seg_variants = seg_name_split[1:]
|
|
endif
|
|
|
|
" Retrieve segment name and namespace
|
|
" Use the first piece of the split string, we can't have variants in the final segment name
|
|
let seg_name_split = split(seg_name_split[0], '\v:')
|
|
let seg_name = seg_name_split[0]
|
|
|
|
if len(seg_name_split) > 1
|
|
let seg_ns = seg_name_split[0]
|
|
let seg_name = seg_name_split[-1]
|
|
endif
|
|
|
|
try
|
|
" If we have a namespace, try to use the namespaced segment first (i.e. search for the segment in the namespaced file first)
|
|
let return_segment = deepcopy(g:Powerline#Segments#{seg_ns}#segments[seg_ns .':'. seg_name])
|
|
catch
|
|
try
|
|
" We didn't find a namespaced segment, fall back to common segments
|
|
let return_segment = deepcopy(g:Powerline#Segments#segments[seg_name])
|
|
catch
|
|
" Didn't find the segment among the common segments either, just skip it
|
|
return {}
|
|
endtry
|
|
endtry
|
|
|
|
if len(args) && has_key(return_segment, 'text')
|
|
" Handle segment printf arguments
|
|
" printf doesn't accept lists as its second argument, so we have to work around that
|
|
let return_segment.text = call('printf', [ return_segment.text ] + args)
|
|
endif
|
|
|
|
" Assign namespace, name and variants
|
|
let return_segment.ns = seg_ns
|
|
let return_segment.name = seg_name
|
|
let return_segment.orig_name = seg_orig_name
|
|
let return_segment.variants = seg_variants
|
|
|
|
return return_segment
|
|
endfunction " }}}
|