From e10b690cdfd3f29ca3db0e76baeced7872d9b5be Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Wed, 28 Aug 2013 23:29:35 +0000 Subject: [PATCH 01/20] convert mode/paste/iminsert parts to function names. --- autoload/airline/parts.vim | 22 ++++++++++++++++++++-- autoload/airline/util.vim | 18 ++++++++++++++++++ plugin/airline.vim | 20 ++++++++++---------- 3 files changed, 48 insertions(+), 12 deletions(-) diff --git a/autoload/airline/parts.vim b/autoload/airline/parts.vim index 0c7ece9..917a469 100644 --- a/autoload/airline/parts.vim +++ b/autoload/airline/parts.vim @@ -1,13 +1,31 @@ " MIT License. Copyright (c) 2013 Bailey Ling. " vim: et ts=2 sts=2 sw=2 +function! airline#parts#append(name) + let val = function(a:name)() + return empty(val) ? '' : ' '.g:airline_left_alt_sep.' '.val +endfunction + +function! airline#parts#prepend(name) + let val = function(a:name)() + return empty(val) ? '' : val.' '.g:airline_right_alt_sep +endfunction + +function! airline#parts#empty() + return '' +endfunction + +function! airline#parts#mode() + return get(w:, 'airline_current_mode', '') +endfunction + function! airline#parts#paste() - return g:airline_detect_paste && &paste ? ' '.g:airline_symbols.paste : '' + return g:airline_detect_paste && &paste ? g:airline_symbols.paste : '' endfunction function! airline#parts#iminsert() if g:airline_detect_iminsert && &iminsert && exists('b:keymap_name') - return ' '.g:airline_left_alt_sep.' '.toupper(b:keymap_name) + return toupper(b:keymap_name) endif return '' endfunction diff --git a/autoload/airline/util.vim b/autoload/airline/util.vim index 3581698..e556024 100644 --- a/autoload/airline/util.vim +++ b/autoload/airline/util.vim @@ -1,6 +1,24 @@ " MIT License. Copyright (c) 2013 Bailey Ling. " vim: et ts=2 sts=2 sw=2 +function! s:get_val(part) + let val = g:airline_parts[a:part] + if match(val, '%') > -1 + return val + else + return '%{function("'.val.'")()}' + endif +endfunction + +function! airline#util#define_section(key, parts) + if !exists('g:airline_section_{a:key}') && len(a:parts) > 0 + let g:airline_section_{a:key} = s:get_val(a:parts[0]) + for i in range(1, len(a:parts) - 1) + let g:airline_section_{a:key} .= s:get_val(a:parts[i]) + endfor + endif +endfunction + if v:version >= 704 function! airline#util#getwinvar(winnr, key, def) return getwinvar(a:winnr, a:key, a:def) diff --git a/plugin/airline.vim b/plugin/airline.vim index 0547d4d..341a8a7 100644 --- a/plugin/airline.vim +++ b/plugin/airline.vim @@ -34,7 +34,7 @@ function! s:init() call s:check_defined('g:airline_symbols', {}) call extend(g:airline_symbols, { - \ 'paste': get(g:, 'airline_paste_symbol', g:airline_left_alt_sep.' PASTE'), + \ 'paste': get(g:, 'airline_paste_symbol', 'PASTE'), \ 'readonly': get(g:, 'airline_readonly_symbol', get(g:, 'airline_powerline_fonts', 0) ? '' : 'RO'), \ 'whitespace': get(g:, 'airline_powerline_fonts', 0) ? '✹' : '!', \ 'linenr': get(g:, 'airline_linecolumn_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ':' ), @@ -43,17 +43,17 @@ function! s:init() call s:check_defined('g:airline_parts', {}) call extend(g:airline_parts, { - \ 'mode': '%{get(w:,"airline_current_mode","")}', - \ 'iminsert': '%{airline#parts#iminsert()}', - \ 'paste': '%{airline#parts#paste()}', + \ 'mode': 'airline#parts#mode', + \ 'iminsert': 'airline#parts#iminsert', + \ 'paste': 'airline#parts#paste', \ 'readonly': '%#airline_file#%{airline#parts#readonly()}', \ 'ffenc': '%{printf("%s%s",&fenc,strlen(&ff)>0?"[".&ff."]":"")}', \ 'file': '%f%m', - \ 'hunks': '', - \ 'branch': '', - \ 'tagbar': '', - \ 'syntastic': '', - \ 'whitespace': '', + \ 'hunks': 'airline#parts#empty', + \ 'branch': 'airline#parts#empty', + \ 'tagbar': 'airline#parts#empty', + \ 'syntastic': 'airline#parts#empty', + \ 'whitespace': 'airline#parts#empty', \ }, 'keep') call s:check_defined('g:airline_mode_map', {}) @@ -80,7 +80,7 @@ function! s:init() \ }, 'keep') call airline#extensions#load() - call s:check_defined('g:airline_section_a', (g:airline_parts.mode).(g:airline_parts.paste).(g:airline_parts.iminsert)) + call airline#util#define_section('a', ['mode', 'paste', 'iminsert']) call s:check_defined('g:airline_section_b', (g:airline_parts.hunks).(g:airline_parts.branch)) call s:check_defined('g:airline_section_c', '%<'.(g:airline_parts.file)) call s:check_defined('g:airline_section_gutter', ' '.(g:airline_parts.readonly).'%=') From bdd758dd3885fcc5a5bf5eed49dc1a196d2a54ac Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Thu, 29 Aug 2013 00:15:07 +0000 Subject: [PATCH 02/20] convert branch/hunks/bufferline to function names. --- autoload/airline/extensions/branch.vim | 2 +- autoload/airline/extensions/hunks.vim | 2 +- autoload/airline/util.vim | 13 ++++++++----- plugin/airline.vim | 4 ++-- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/autoload/airline/extensions/branch.vim b/autoload/airline/extensions/branch.vim index a746ea6..14dc8af 100644 --- a/autoload/airline/extensions/branch.vim +++ b/autoload/airline/extensions/branch.vim @@ -31,6 +31,6 @@ function! airline#extensions#branch#get_head() endfunction function! airline#extensions#branch#init(ext) - let g:airline_parts.branch = '%{airline#extensions#branch#get_head()}' + let g:airline_parts.branch = 'airline#extensions#branch#get_head' endfunction diff --git a/autoload/airline/extensions/hunks.vim b/autoload/airline/extensions/hunks.vim index 66403b1..0c5ee50 100644 --- a/autoload/airline/extensions/hunks.vim +++ b/autoload/airline/extensions/hunks.vim @@ -54,6 +54,6 @@ function! airline#extensions#hunks#get_hunks() endfunction function! airline#extensions#hunks#init(ext) - let g:airline_parts.hunks = '%{airline#extensions#hunks#get_hunks()}' + let g:airline_parts.hunks = 'airline#extensions#hunks#get_hunks' endfunction diff --git a/autoload/airline/util.vim b/autoload/airline/util.vim index e556024..624e5e8 100644 --- a/autoload/airline/util.vim +++ b/autoload/airline/util.vim @@ -2,12 +2,15 @@ " vim: et ts=2 sts=2 sw=2 function! s:get_val(part) - let val = g:airline_parts[a:part] - if match(val, '%') > -1 - return val - else - return '%{function("'.val.'")()}' + if has_key(g:airline_parts, a:part) + let val = g:airline_parts[a:part] + if match(val, '%\| ') > -1 + return val + else + return '%{'.val.'()}' + endif endif + return a:part endfunction function! airline#util#define_section(key, parts) diff --git a/plugin/airline.vim b/plugin/airline.vim index 341a8a7..e5b812b 100644 --- a/plugin/airline.vim +++ b/plugin/airline.vim @@ -81,8 +81,8 @@ function! s:init() call airline#extensions#load() call airline#util#define_section('a', ['mode', 'paste', 'iminsert']) - call s:check_defined('g:airline_section_b', (g:airline_parts.hunks).(g:airline_parts.branch)) - call s:check_defined('g:airline_section_c', '%<'.(g:airline_parts.file)) + call airline#util#define_section('b', ['hunks', 'branch']) + call airline#util#define_section('c', ['%<', 'file']) call s:check_defined('g:airline_section_gutter', ' '.(g:airline_parts.readonly).'%=') call s:check_defined('g:airline_section_x', (g:airline_parts.tagbar).'%{&filetype}') call s:check_defined('g:airline_section_y', g:airline_parts.ffenc) From e13a4c8b1a0f46e6c51c192f462af141246f781e Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Thu, 29 Aug 2013 00:36:07 +0000 Subject: [PATCH 03/20] convert the rest to use define section. --- autoload/airline/extensions/tagbar.vim | 10 ++++++++-- plugin/airline.vim | 10 +++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/autoload/airline/extensions/tagbar.vim b/autoload/airline/extensions/tagbar.vim index bf7efee..4b51787 100644 --- a/autoload/airline/extensions/tagbar.vim +++ b/autoload/airline/extensions/tagbar.vim @@ -16,11 +16,17 @@ function! airline#extensions#tagbar#inactive_apply(...) endif endfunction +function! airline#extensions#tagbar#currenttag() + if get(w:, 'airline_active', 0) + return tagbar#currenttag('%s', '') + endif + return '' +endfunction + function! airline#extensions#tagbar#init(ext) call a:ext.add_inactive_statusline_func('airline#extensions#tagbar#inactive_apply') let g:tagbar_status_func = 'airline#extensions#tagbar#get_status' - let g:airline_parts.tagbar = '%(%{get(w:,"airline_active",0) ? tagbar#currenttag("%s","") : ""} ' - \ .g:airline_right_alt_sep.' %)' + let g:airline_parts.tagbar = 'airline#extensions#tagbar#currenttag' endfunction diff --git a/plugin/airline.vim b/plugin/airline.vim index e5b812b..179446f 100644 --- a/plugin/airline.vim +++ b/plugin/airline.vim @@ -83,11 +83,11 @@ function! s:init() call airline#util#define_section('a', ['mode', 'paste', 'iminsert']) call airline#util#define_section('b', ['hunks', 'branch']) call airline#util#define_section('c', ['%<', 'file']) - call s:check_defined('g:airline_section_gutter', ' '.(g:airline_parts.readonly).'%=') - call s:check_defined('g:airline_section_x', (g:airline_parts.tagbar).'%{&filetype}') - call s:check_defined('g:airline_section_y', g:airline_parts.ffenc) - call s:check_defined('g:airline_section_z', '%3p%% %{g:airline_symbols.linenr} %3l:%3c ') - call s:check_defined('g:airline_section_warning', (g:airline_parts.syntastic).(g:airline_parts.whitespace)) + call airline#util#define_section('gutter', ['readonly', '%=']) + call airline#util#define_section('x', ['tagbar', '%{&filetype}']) + call airline#util#define_section('y', ['ffenc']) + call airline#util#define_section('z', ['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) + call airline#util#define_section('warning', ['syntastic', 'whitespace']) let s:airline_theme_defined = exists('g:airline_theme') if s:airline_theme_defined || !airline#switch_matching_theme() From a927bf947592fe865c668887355ab9938545407a Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Thu, 29 Aug 2013 00:57:58 +0000 Subject: [PATCH 04/20] automatic separators. --- autoload/airline/parts.vim | 2 +- autoload/airline/util.vim | 22 ++++++++++++++++++---- plugin/airline.vim | 16 ++++++++-------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/autoload/airline/parts.vim b/autoload/airline/parts.vim index 917a469..63fe741 100644 --- a/autoload/airline/parts.vim +++ b/autoload/airline/parts.vim @@ -8,7 +8,7 @@ endfunction function! airline#parts#prepend(name) let val = function(a:name)() - return empty(val) ? '' : val.' '.g:airline_right_alt_sep + return empty(val) ? '' : val.' '.g:airline_right_alt_sep.' ' endfunction function! airline#parts#empty() diff --git a/autoload/airline/util.vim b/autoload/airline/util.vim index 624e5e8..3de33c3 100644 --- a/autoload/airline/util.vim +++ b/autoload/airline/util.vim @@ -1,11 +1,15 @@ " MIT License. Copyright (c) 2013 Bailey Ling. " vim: et ts=2 sts=2 sw=2 -function! s:get_val(part) +function! s:get_val(part, append) if has_key(g:airline_parts, a:part) let val = g:airline_parts[a:part] if match(val, '%\| ') > -1 return val + elseif a:append > 0 + return '%{airline#parts#append("'.val.'")}' + elseif a:append < 0 + return '%{airline#parts#prepend("'.val.'")}' else return '%{'.val.'()}' endif @@ -13,15 +17,25 @@ function! s:get_val(part) return a:part endfunction -function! airline#util#define_section(key, parts) +function! airline#util#define_left_section(key, parts) if !exists('g:airline_section_{a:key}') && len(a:parts) > 0 - let g:airline_section_{a:key} = s:get_val(a:parts[0]) + let g:airline_section_{a:key} = s:get_val(a:parts[0], 0) for i in range(1, len(a:parts) - 1) - let g:airline_section_{a:key} .= s:get_val(a:parts[i]) + let g:airline_section_{a:key} .= s:get_val(a:parts[i], 1) endfor endif endfunction +function! airline#util#define_right_section(key, parts) + if !exists('g:airline_section_{a:key}') && len(a:parts) > 0 + let g:airline_section_{a:key} = '' + for i in range(0, len(a:parts) - 2) + let g:airline_section_{a:key} .= s:get_val(a:parts[i], -1) + endfor + let g:airline_section_{a:key} .= s:get_val(a:parts[-1], 0) + endif +endfunction + if v:version >= 704 function! airline#util#getwinvar(winnr, key, def) return getwinvar(a:winnr, a:key, a:def) diff --git a/plugin/airline.vim b/plugin/airline.vim index 179446f..7e64569 100644 --- a/plugin/airline.vim +++ b/plugin/airline.vim @@ -80,14 +80,14 @@ function! s:init() \ }, 'keep') call airline#extensions#load() - call airline#util#define_section('a', ['mode', 'paste', 'iminsert']) - call airline#util#define_section('b', ['hunks', 'branch']) - call airline#util#define_section('c', ['%<', 'file']) - call airline#util#define_section('gutter', ['readonly', '%=']) - call airline#util#define_section('x', ['tagbar', '%{&filetype}']) - call airline#util#define_section('y', ['ffenc']) - call airline#util#define_section('z', ['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) - call airline#util#define_section('warning', ['syntastic', 'whitespace']) + call airline#util#define_left_section('a', ['mode', 'paste', 'iminsert']) + call airline#util#define_left_section('b', ['hunks', 'branch']) + call airline#util#define_left_section('c', ['%<', 'file']) + call airline#util#define_left_section('gutter', ['readonly', '%=']) + call airline#util#define_right_section('x', ['tagbar', '%{&filetype}']) + call airline#util#define_right_section('y', ['ffenc']) + call airline#util#define_right_section('z', ['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) + call airline#util#define_right_section('warning', ['syntastic', 'whitespace']) let s:airline_theme_defined = exists('g:airline_theme') if s:airline_theme_defined || !airline#switch_matching_theme() From fa517238c771c9749b1e87870ced8b61fb8bb169 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 21:51:10 +0000 Subject: [PATCH 05/20] introduce parts metadata. --- autoload/airline/extensions/branch.vim | 2 +- autoload/airline/extensions/bufferline.vim | 3 +- autoload/airline/extensions/hunks.vim | 2 +- autoload/airline/parts.vim | 25 +++++++++++---- autoload/airline/util.vim | 35 +++----------------- plugin/airline.vim | 37 +++++++++++++--------- 6 files changed, 49 insertions(+), 55 deletions(-) diff --git a/autoload/airline/extensions/branch.vim b/autoload/airline/extensions/branch.vim index 14dc8af..446c89d 100644 --- a/autoload/airline/extensions/branch.vim +++ b/autoload/airline/extensions/branch.vim @@ -31,6 +31,6 @@ function! airline#extensions#branch#get_head() endfunction function! airline#extensions#branch#init(ext) - let g:airline_parts.branch = 'airline#extensions#branch#get_head' + call airline#parts#define_function('branch', 'airline#extensions#branch#get_head') endfunction diff --git a/autoload/airline/extensions/bufferline.vim b/autoload/airline/extensions/bufferline.vim index 4a6e014..cc13ec0 100644 --- a/autoload/airline/extensions/bufferline.vim +++ b/autoload/airline/extensions/bufferline.vim @@ -14,5 +14,6 @@ function! airline#extensions#bufferline#init(ext) let g:bufferline_separator = ' ' endif - let g:airline_parts.file = '%{bufferline#refresh_status()}'.bufferline#get_status_string() + call airline#parts#define_raw('file', '%{bufferline#refresh_status()}'.bufferline#get_status_string()) endfunction + diff --git a/autoload/airline/extensions/hunks.vim b/autoload/airline/extensions/hunks.vim index 0c5ee50..803dfaf 100644 --- a/autoload/airline/extensions/hunks.vim +++ b/autoload/airline/extensions/hunks.vim @@ -54,6 +54,6 @@ function! airline#extensions#hunks#get_hunks() endfunction function! airline#extensions#hunks#init(ext) - let g:airline_parts.hunks = 'airline#extensions#hunks#get_hunks' + call airline#parts#define_function('hunks', 'airline#extensions#hunks#get_hunks') endfunction diff --git a/autoload/airline/parts.vim b/autoload/airline/parts.vim index 63fe741..42ab21e 100644 --- a/autoload/airline/parts.vim +++ b/autoload/airline/parts.vim @@ -1,14 +1,27 @@ " MIT License. Copyright (c) 2013 Bailey Ling. " vim: et ts=2 sts=2 sw=2 -function! airline#parts#append(name) - let val = function(a:name)() - return empty(val) ? '' : ' '.g:airline_left_alt_sep.' '.val +let s:parts = {} + +function! airline#parts#define(key, config) + let s:parts[a:key] = get(s:parts, a:key, {}) + call extend(s:parts[a:key], a:config) endfunction -function! airline#parts#prepend(name) - let val = function(a:name)() - return empty(val) ? '' : val.' '.g:airline_right_alt_sep.' ' +function! airline#parts#define_function(key, name) + call airline#parts#define(a:key, { 'function': a:name }) +endfunction + +function! airline#parts#define_text(key, text) + call airline#parts#define(a:key, { 'text': a:text }) +endfunction + +function! airline#parts#define_raw(key, raw) + call airline#parts#define(a:key, { 'raw': a:raw }) +endfunction + +function! airline#parts#get(key) + return get(s:parts, a:key, {}) endfunction function! airline#parts#empty() diff --git a/autoload/airline/util.vim b/autoload/airline/util.vim index 3de33c3..e7b27f8 100644 --- a/autoload/airline/util.vim +++ b/autoload/airline/util.vim @@ -1,39 +1,12 @@ " MIT License. Copyright (c) 2013 Bailey Ling. " vim: et ts=2 sts=2 sw=2 -function! s:get_val(part, append) - if has_key(g:airline_parts, a:part) - let val = g:airline_parts[a:part] - if match(val, '%\| ') > -1 - return val - elseif a:append > 0 - return '%{airline#parts#append("'.val.'")}' - elseif a:append < 0 - return '%{airline#parts#prepend("'.val.'")}' - else - return '%{'.val.'()}' - endif - endif - return a:part +function! airline#util#append(text) + return empty(a:text) ? '' : ' '.g:airline_left_alt_sep.' '.a:text endfunction -function! airline#util#define_left_section(key, parts) - if !exists('g:airline_section_{a:key}') && len(a:parts) > 0 - let g:airline_section_{a:key} = s:get_val(a:parts[0], 0) - for i in range(1, len(a:parts) - 1) - let g:airline_section_{a:key} .= s:get_val(a:parts[i], 1) - endfor - endif -endfunction - -function! airline#util#define_right_section(key, parts) - if !exists('g:airline_section_{a:key}') && len(a:parts) > 0 - let g:airline_section_{a:key} = '' - for i in range(0, len(a:parts) - 2) - let g:airline_section_{a:key} .= s:get_val(a:parts[i], -1) - endfor - let g:airline_section_{a:key} .= s:get_val(a:parts[-1], 0) - endif +function! airline#util#prepend(text) + return empty(a:text) ? '' : a:text.' '.g:airline_right_alt_sep.' ' endfunction if v:version >= 704 diff --git a/plugin/airline.vim b/plugin/airline.vim index 7e64569..b54ae3c 100644 --- a/plugin/airline.vim +++ b/plugin/airline.vim @@ -41,16 +41,18 @@ function! s:init() \ 'branch': get(g:, 'airline_branch_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ''), \ }, 'keep') + call airline#parts#define_function('mode', 'airline#parts#mode') + call airline#parts#define_function('iminsert', 'airline#parts#iminsert') + call airline#parts#define_function('paste', 'airline#parts#paste') + call airline#parts#define('readonly', { + \ 'function': 'airline#parts#readonly', + \ 'highlight': 'airline_file', + \ }) + call airline#parts#define_raw('file', '%f%m') + call s:check_defined('g:airline_parts', {}) call extend(g:airline_parts, { - \ 'mode': 'airline#parts#mode', - \ 'iminsert': 'airline#parts#iminsert', - \ 'paste': 'airline#parts#paste', - \ 'readonly': '%#airline_file#%{airline#parts#readonly()}', \ 'ffenc': '%{printf("%s%s",&fenc,strlen(&ff)>0?"[".&ff."]":"")}', - \ 'file': '%f%m', - \ 'hunks': 'airline#parts#empty', - \ 'branch': 'airline#parts#empty', \ 'tagbar': 'airline#parts#empty', \ 'syntastic': 'airline#parts#empty', \ 'whitespace': 'airline#parts#empty', @@ -80,14 +82,19 @@ function! s:init() \ }, 'keep') call airline#extensions#load() - call airline#util#define_left_section('a', ['mode', 'paste', 'iminsert']) - call airline#util#define_left_section('b', ['hunks', 'branch']) - call airline#util#define_left_section('c', ['%<', 'file']) - call airline#util#define_left_section('gutter', ['readonly', '%=']) - call airline#util#define_right_section('x', ['tagbar', '%{&filetype}']) - call airline#util#define_right_section('y', ['ffenc']) - call airline#util#define_right_section('z', ['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) - call airline#util#define_right_section('warning', ['syntastic', 'whitespace']) + + if !exists('g:airline_section_a') + let g:airline_section_a = airline#section#create_left(['mode', 'paste', 'iminsert']) + endif + if !exists('g:airline_section_b') + let g:airline_section_b = airline#section#create(['hunks', 'branch']) + endif + let g:airline_section_c = airline#section#create(['%<', 'file']) + let g:airline_section_gutter = airline#section#create([' ', 'readonly', '%=']) + let g:airline_section_x = airline#section#create(['tagbar', '%{&filetype}']) + let g:airline_section_y = airline#section#create(['ffenc']) + let g:airline_section_z = airline#section#create(['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) + let g:airline_section_warning = airline#section#create(['syntastic', 'whitespace']) let s:airline_theme_defined = exists('g:airline_theme') if s:airline_theme_defined || !airline#switch_matching_theme() From 93eb0389b91c610a8e371d7548f6d4b70fe72ff7 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 21:56:12 +0000 Subject: [PATCH 06/20] move init code into new file, add section. --- autoload/airline/init.vim | 87 ++++++++++++++++++++++++++++++++++++ autoload/airline/section.vim | 47 +++++++++++++++++++ plugin/airline.vim | 82 +-------------------------------- 3 files changed, 135 insertions(+), 81 deletions(-) create mode 100644 autoload/airline/init.vim create mode 100644 autoload/airline/section.vim diff --git a/autoload/airline/init.vim b/autoload/airline/init.vim new file mode 100644 index 0000000..cb53f5e --- /dev/null +++ b/autoload/airline/init.vim @@ -0,0 +1,87 @@ +" MIT License. Copyright (c) 2013 Bailey Ling. +" vim: et ts=2 sts=2 sw=2 + +function! s:check_defined(variable, default) + if !exists(a:variable) + let {a:variable} = a:default + endif +endfunction + +function! airline#init#bootstrap() + call s:check_defined('g:airline_left_sep', get(g:, 'airline_powerline_fonts', 0)?"":">") + call s:check_defined('g:airline_left_alt_sep', get(g:, 'airline_powerline_fonts', 0)?"":">") + call s:check_defined('g:airline_right_sep', get(g:, 'airline_powerline_fonts', 0)?"":"<") + call s:check_defined('g:airline_right_alt_sep', get(g:, 'airline_powerline_fonts', 0)?"":"<") + call s:check_defined('g:airline_detect_modified', 1) + call s:check_defined('g:airline_detect_paste', 1) + call s:check_defined('g:airline_detect_iminsert', 0) + call s:check_defined('g:airline_inactive_collapse', 1) + call s:check_defined('g:airline_exclude_filenames', ['DebuggerWatch','DebuggerStack','DebuggerStatus']) + call s:check_defined('g:airline_exclude_filetypes', []) + call s:check_defined('g:airline_exclude_preview', 0) + + call s:check_defined('g:airline_symbols', {}) + call extend(g:airline_symbols, { + \ 'paste': get(g:, 'airline_paste_symbol', 'PASTE'), + \ 'readonly': get(g:, 'airline_readonly_symbol', get(g:, 'airline_powerline_fonts', 0) ? '' : 'RO'), + \ 'whitespace': get(g:, 'airline_powerline_fonts', 0) ? '✹' : '!', + \ 'linenr': get(g:, 'airline_linecolumn_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ':' ), + \ 'branch': get(g:, 'airline_branch_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ''), + \ }, 'keep') + + call airline#parts#define_function('mode', 'airline#parts#mode') + call airline#parts#define_function('iminsert', 'airline#parts#iminsert') + call airline#parts#define_function('paste', 'airline#parts#paste') + call airline#parts#define('readonly', { + \ 'function': 'airline#parts#readonly', + \ 'highlight': 'airline_file', + \ }) + call airline#parts#define_raw('file', '%f%m') + + call s:check_defined('g:airline_parts', {}) + call extend(g:airline_parts, { + \ 'ffenc': '%{printf("%s%s",&fenc,strlen(&ff)>0?"[".&ff."]":"")}', + \ 'tagbar': 'airline#parts#empty', + \ 'syntastic': 'airline#parts#empty', + \ 'whitespace': 'airline#parts#empty', + \ }, 'keep') + + call s:check_defined('g:airline_mode_map', {}) + call extend(g:airline_mode_map, { + \ '__' : '------', + \ 'n' : 'NORMAL', + \ 'i' : 'INSERT', + \ 'R' : 'REPLACE', + \ 'v' : 'VISUAL', + \ 'V' : 'V-LINE', + \ 'c' : 'COMMAND', + \ '' : 'V-BLOCK', + \ 's' : 'SELECT', + \ 'S' : 'S-LINE', + \ '' : 'S-BLOCK', + \ }, 'keep') + + call s:check_defined('g:airline_theme_map', {}) + call extend(g:airline_theme_map, { + \ 'Tomorrow.*': 'tomorrow', + \ 'mo[l|n]okai': 'molokai', + \ 'wombat.*': 'wombat', + \ '.*solarized.*': 'solarized', + \ }, 'keep') + + call airline#extensions#load() + + if !exists('g:airline_section_a') + let g:airline_section_a = airline#section#create_left(['mode', 'paste', 'iminsert']) + endif + if !exists('g:airline_section_b') + let g:airline_section_b = airline#section#create(['hunks', 'branch']) + endif + let g:airline_section_c = airline#section#create(['%<', 'file']) + let g:airline_section_gutter = airline#section#create([' ', 'readonly', '%=']) + let g:airline_section_x = airline#section#create(['tagbar', '%{&filetype}']) + let g:airline_section_y = airline#section#create(['ffenc']) + let g:airline_section_z = airline#section#create(['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) + let g:airline_section_warning = airline#section#create(['syntastic', 'whitespace']) +endfunction + diff --git a/autoload/airline/section.vim b/autoload/airline/section.vim new file mode 100644 index 0000000..788b443 --- /dev/null +++ b/autoload/airline/section.vim @@ -0,0 +1,47 @@ +" MIT License. Copyright (c) 2013 Bailey Ling. +" vim: et ts=2 sts=2 sw=2 + +function! s:get_val(key, append) + let val = '' + let part = airline#parts#get(a:key) + if exists('part.function') + let func = (part.function).'()' + elseif exists('part.text') + let func = '"'.(part.text).'"' + elseif exists('part.raw') + return part.raw + else + return a:key + endif + + if a:append > 0 + let val .= '%{airline#util#append('.func.')}' + elseif a:append < 0 + return '%{airline#util#prepend('.func.')}' + else + return '%{'.func.'}' + endif + return val +endfunction + +function! airline#section#create(parts) + return join(map(a:parts, 's:get_val(v:val, 0)'), '') +endfunction + +function! airline#section#create_left(parts) + let _ = s:get_val(a:parts[0], 0) + for i in range(1, len(a:parts) - 1) + let _ .= s:get_val(a:parts[i], 1) + endfor + return _ +endfunction + +function! airline#section#create_right(parts) + let _ = '' + for i in range(0, len(a:parts) - 2) + let _ .= s:get_val(a:parts[i], -1) + endfor + let _ .= s:get_val(a:parts[-1], 0) + return _ +endfunction + diff --git a/plugin/airline.vim b/plugin/airline.vim index b54ae3c..f1164da 100644 --- a/plugin/airline.vim +++ b/plugin/airline.vim @@ -8,93 +8,13 @@ let g:loaded_airline = 1 " autocmd VimEnter * call airline#deprecation#check() -function! s:check_defined(variable, default) - if !exists(a:variable) - let {a:variable} = a:default - endif -endfunction - let s:airline_initialized = 0 let s:airline_theme_defined = 0 function! s:init() if !s:airline_initialized let s:airline_initialized = 1 - call s:check_defined('g:airline_left_sep', get(g:, 'airline_powerline_fonts', 0)?"":">") - call s:check_defined('g:airline_left_alt_sep', get(g:, 'airline_powerline_fonts', 0)?"":">") - call s:check_defined('g:airline_right_sep', get(g:, 'airline_powerline_fonts', 0)?"":"<") - call s:check_defined('g:airline_right_alt_sep', get(g:, 'airline_powerline_fonts', 0)?"":"<") - call s:check_defined('g:airline_detect_modified', 1) - call s:check_defined('g:airline_detect_paste', 1) - call s:check_defined('g:airline_detect_iminsert', 0) - call s:check_defined('g:airline_inactive_collapse', 1) - call s:check_defined('g:airline_exclude_filenames', ['DebuggerWatch','DebuggerStack','DebuggerStatus']) - call s:check_defined('g:airline_exclude_filetypes', []) - call s:check_defined('g:airline_exclude_preview', 0) - - call s:check_defined('g:airline_symbols', {}) - call extend(g:airline_symbols, { - \ 'paste': get(g:, 'airline_paste_symbol', 'PASTE'), - \ 'readonly': get(g:, 'airline_readonly_symbol', get(g:, 'airline_powerline_fonts', 0) ? '' : 'RO'), - \ 'whitespace': get(g:, 'airline_powerline_fonts', 0) ? '✹' : '!', - \ 'linenr': get(g:, 'airline_linecolumn_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ':' ), - \ 'branch': get(g:, 'airline_branch_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ''), - \ }, 'keep') - - call airline#parts#define_function('mode', 'airline#parts#mode') - call airline#parts#define_function('iminsert', 'airline#parts#iminsert') - call airline#parts#define_function('paste', 'airline#parts#paste') - call airline#parts#define('readonly', { - \ 'function': 'airline#parts#readonly', - \ 'highlight': 'airline_file', - \ }) - call airline#parts#define_raw('file', '%f%m') - - call s:check_defined('g:airline_parts', {}) - call extend(g:airline_parts, { - \ 'ffenc': '%{printf("%s%s",&fenc,strlen(&ff)>0?"[".&ff."]":"")}', - \ 'tagbar': 'airline#parts#empty', - \ 'syntastic': 'airline#parts#empty', - \ 'whitespace': 'airline#parts#empty', - \ }, 'keep') - - call s:check_defined('g:airline_mode_map', {}) - call extend(g:airline_mode_map, { - \ '__' : '------', - \ 'n' : 'NORMAL', - \ 'i' : 'INSERT', - \ 'R' : 'REPLACE', - \ 'v' : 'VISUAL', - \ 'V' : 'V-LINE', - \ 'c' : 'COMMAND', - \ '' : 'V-BLOCK', - \ 's' : 'SELECT', - \ 'S' : 'S-LINE', - \ '' : 'S-BLOCK', - \ }, 'keep') - - call s:check_defined('g:airline_theme_map', {}) - call extend(g:airline_theme_map, { - \ 'Tomorrow.*': 'tomorrow', - \ 'mo[l|n]okai': 'molokai', - \ 'wombat.*': 'wombat', - \ '.*solarized.*': 'solarized', - \ }, 'keep') - - call airline#extensions#load() - - if !exists('g:airline_section_a') - let g:airline_section_a = airline#section#create_left(['mode', 'paste', 'iminsert']) - endif - if !exists('g:airline_section_b') - let g:airline_section_b = airline#section#create(['hunks', 'branch']) - endif - let g:airline_section_c = airline#section#create(['%<', 'file']) - let g:airline_section_gutter = airline#section#create([' ', 'readonly', '%=']) - let g:airline_section_x = airline#section#create(['tagbar', '%{&filetype}']) - let g:airline_section_y = airline#section#create(['ffenc']) - let g:airline_section_z = airline#section#create(['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) - let g:airline_section_warning = airline#section#create(['syntastic', 'whitespace']) + call airline#init#bootstrap() let s:airline_theme_defined = exists('g:airline_theme') if s:airline_theme_defined || !airline#switch_matching_theme() From 2d049949f0573f38a996fa21f0c1af13c98b0965 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 21:58:29 +0000 Subject: [PATCH 07/20] fix indentation. --- plugin/airline.vim | 77 +++++++++++++++++++++++----------------------- 1 file changed, 39 insertions(+), 38 deletions(-) diff --git a/plugin/airline.vim b/plugin/airline.vim index f1164da..055c065 100644 --- a/plugin/airline.vim +++ b/plugin/airline.vim @@ -54,47 +54,48 @@ function! s:airline_toggle() au! augroup END augroup! airline - if exists("s:stl") - let &stl = s:stl - endif - else - let s:stl = &stl - augroup airline - autocmd! - autocmd CmdwinEnter * - \ call airline#add_statusline_func('airline#cmdwinenter') - \ | call on_window_changed() - autocmd CmdwinLeave * call airline#remove_statusline_func('airline#cmdwinenter') - - autocmd ColorScheme * call on_colorscheme_changed() - autocmd WinEnter,BufWinEnter,FileType,BufUnload,ShellCmdPost,VimResized * - \ call on_window_changed() - - autocmd BufWritePost */autoload/airline/themes/*.vim - \ exec 'source '.split(globpath(&rtp, 'autoload/airline/themes/'.g:airline_theme.'.vim', 1), "\n")[0] - \ | call airline#load_theme() - augroup END - if s:airline_initialized - call on_window_changed() - endif + if exists("s:stl") + let &stl = s:stl endif - endfunction + else + let s:stl = &stl + augroup airline + autocmd! - function! s:get_airline_themes(a, l, p) - let files = split(globpath(&rtp, 'autoload/airline/themes/'.a:a.'*'), "\n") - return map(files, 'fnamemodify(v:val, ":t:r")') - endfunction - function! s:airline_theme(...) - if a:0 - call airline#switch_theme(a:1) - else - echo g:airline_theme + autocmd CmdwinEnter * + \ call airline#add_statusline_func('airline#cmdwinenter') + \ | call on_window_changed() + autocmd CmdwinLeave * call airline#remove_statusline_func('airline#cmdwinenter') + + autocmd ColorScheme * call on_colorscheme_changed() + autocmd WinEnter,BufWinEnter,FileType,BufUnload,ShellCmdPost,VimResized * + \ call on_window_changed() + + autocmd BufWritePost */autoload/airline/themes/*.vim + \ exec 'source '.split(globpath(&rtp, 'autoload/airline/themes/'.g:airline_theme.'.vim', 1), "\n")[0] + \ | call airline#load_theme() + augroup END + if s:airline_initialized + call on_window_changed() endif - endfunction - command! -nargs=? -complete=customlist,get_airline_themes AirlineTheme call airline_theme() - command! AirlineToggleWhitespace call airline#extensions#whitespace#toggle() - command! AirlineToggle call airline_toggle() + endif +endfunction - call airline_toggle() +function! s:get_airline_themes(a, l, p) + let files = split(globpath(&rtp, 'autoload/airline/themes/'.a:a.'*'), "\n") + return map(files, 'fnamemodify(v:val, ":t:r")') +endfunction +function! s:airline_theme(...) + if a:0 + call airline#switch_theme(a:1) + else + echo g:airline_theme + endif +endfunction +command! -nargs=? -complete=customlist,get_airline_themes AirlineTheme call airline_theme() +command! AirlineToggleWhitespace call airline#extensions#whitespace#toggle() +command! AirlineToggle call airline_toggle() + +call airline_toggle() From 19910a26cbd67aeeda24a56efeca010e7195cd22 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 21:59:46 +0000 Subject: [PATCH 08/20] check existence of all variables. --- autoload/airline/init.vim | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/autoload/airline/init.vim b/autoload/airline/init.vim index cb53f5e..a08542b 100644 --- a/autoload/airline/init.vim +++ b/autoload/airline/init.vim @@ -77,11 +77,23 @@ function! airline#init#bootstrap() if !exists('g:airline_section_b') let g:airline_section_b = airline#section#create(['hunks', 'branch']) endif - let g:airline_section_c = airline#section#create(['%<', 'file']) - let g:airline_section_gutter = airline#section#create([' ', 'readonly', '%=']) - let g:airline_section_x = airline#section#create(['tagbar', '%{&filetype}']) - let g:airline_section_y = airline#section#create(['ffenc']) - let g:airline_section_z = airline#section#create(['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) - let g:airline_section_warning = airline#section#create(['syntastic', 'whitespace']) + if !exists('g:airline_section_c') + let g:airline_section_c = airline#section#create(['%<', 'file']) + endif + if !exists('g:airline_section_gutter') + let g:airline_section_gutter = airline#section#create([' ', 'readonly', '%=']) + endif + if !exists('g:airline_section_x') + let g:airline_section_x = airline#section#create(['tagbar', '%{&filetype}']) + endif + if !exists('g:airline_section_y') + let g:airline_section_y = airline#section#create(['ffenc']) + endif + if !exists('g:airline_section_z') + let g:airline_section_z = airline#section#create(['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) + endif + if !exists('g:airline_section_warning') + let g:airline_section_warning = airline#section#create(['syntastic', 'whitespace']) + endif endfunction From c6d996d5cae38c52a4114b9e3e9b23bec73719e1 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 22:07:45 +0000 Subject: [PATCH 09/20] define the rest of the extensions. --- autoload/airline/extensions/example.vim | 4 ++-- autoload/airline/extensions/syntastic.vim | 2 +- autoload/airline/extensions/tagbar.vim | 2 +- autoload/airline/extensions/whitespace.vim | 2 +- autoload/airline/init.vim | 9 +-------- doc/airline.txt | 3 --- 6 files changed, 6 insertions(+), 16 deletions(-) diff --git a/autoload/airline/extensions/example.vim b/autoload/airline/extensions/example.vim index d522bd6..0f571f2 100644 --- a/autoload/airline/extensions/example.vim +++ b/autoload/airline/extensions/example.vim @@ -11,7 +11,7 @@ function! airline#extensions#example#init(ext) " Here we define a new part for the plugin. This allows users to place this " extension in arbitrary locations. - let g:airline_parts.cats = '%{airline#extensions#example#get_cats()}' + call airline#parts#define_raw('cats', '%{airline#extensions#example#get_cats()}') " Next up we add a funcref so that we can run some code prior to the " statusline getting modifed. @@ -28,7 +28,7 @@ function! airline#extensions#example#apply(...) " Let's use a helper function. It will take care of ensuring that the " window-local override exists (and create one based on the global " airline_section if not), and prepend to it. - call airline#extensions#prepend_to_section('x', g:airline_parts.cats) + call airline#extensions#prepend_to_section('x', airline#parts#get('cats').raw) endif endfunction diff --git a/autoload/airline/extensions/syntastic.vim b/autoload/airline/extensions/syntastic.vim index 24308c5..a91ec66 100644 --- a/autoload/airline/extensions/syntastic.vim +++ b/autoload/airline/extensions/syntastic.vim @@ -10,6 +10,6 @@ function! airline#extensions#syntastic#get_warnings() endfunction function! airline#extensions#syntastic#init(ext) - let g:airline_parts.syntastic = '%{airline#extensions#syntastic#get_warnings()}' + call airline#parts#define_function('syntastic', 'airline#extensions#syntastic#get_warnings') endfunction diff --git a/autoload/airline/extensions/tagbar.vim b/autoload/airline/extensions/tagbar.vim index 4b51787..214d443 100644 --- a/autoload/airline/extensions/tagbar.vim +++ b/autoload/airline/extensions/tagbar.vim @@ -27,6 +27,6 @@ function! airline#extensions#tagbar#init(ext) call a:ext.add_inactive_statusline_func('airline#extensions#tagbar#inactive_apply') let g:tagbar_status_func = 'airline#extensions#tagbar#get_status' - let g:airline_parts.tagbar = 'airline#extensions#tagbar#currenttag' + call airline#parts#define_function('tagbar', 'airline#extensions#tagbar#currenttag') endfunction diff --git a/autoload/airline/extensions/whitespace.vim b/autoload/airline/extensions/whitespace.vim index 0aa8fbe..234c732 100644 --- a/autoload/airline/extensions/whitespace.vim +++ b/autoload/airline/extensions/whitespace.vim @@ -65,7 +65,7 @@ function! airline#extensions#whitespace#toggle() endfunction function! airline#extensions#whitespace#init(...) - let g:airline_parts.whitespace = '%{airline#extensions#whitespace#check()}' + call airline#parts#define_function('whitespace', 'airline#extensions#whitespace#check') unlet! b:airline_whitespace_check augroup airline_whitespace diff --git a/autoload/airline/init.vim b/autoload/airline/init.vim index a08542b..80ab516 100644 --- a/autoload/airline/init.vim +++ b/autoload/airline/init.vim @@ -37,14 +37,7 @@ function! airline#init#bootstrap() \ 'highlight': 'airline_file', \ }) call airline#parts#define_raw('file', '%f%m') - - call s:check_defined('g:airline_parts', {}) - call extend(g:airline_parts, { - \ 'ffenc': '%{printf("%s%s",&fenc,strlen(&ff)>0?"[".&ff."]":"")}', - \ 'tagbar': 'airline#parts#empty', - \ 'syntastic': 'airline#parts#empty', - \ 'whitespace': 'airline#parts#empty', - \ }, 'keep') + call airline#parts#define_raw('ffenc', '%{printf("%s%s",&fenc,strlen(&ff)>0?"[".&ff."]":"")}') call s:check_defined('g:airline_mode_map', {}) call extend(g:airline_mode_map, { diff --git a/doc/airline.txt b/doc/airline.txt index 5bcac27..4159728 100644 --- a/doc/airline.txt +++ b/doc/airline.txt @@ -388,9 +388,6 @@ For contributions into the plugin, here are the following guidelines: b. Configuration variables for the extension should reside in the extension, e.g. `g:airline#extensions#foo_plugin#bar_variable`. - c. A value should be added to the `g:airline_parts` dictionary such that - the extension can be arbitrarily positioned. - See the source of |example.vim| for a working extension. ============================================================================== From cb774fcfd02bd623e710cf1f1c9bdaaa541d1bc6 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 22:10:04 +0000 Subject: [PATCH 10/20] use correct direction of separators. --- autoload/airline/init.vim | 8 ++++---- autoload/airline/parts.vim | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/autoload/airline/init.vim b/autoload/airline/init.vim index 80ab516..8302e6e 100644 --- a/autoload/airline/init.vim +++ b/autoload/airline/init.vim @@ -77,16 +77,16 @@ function! airline#init#bootstrap() let g:airline_section_gutter = airline#section#create([' ', 'readonly', '%=']) endif if !exists('g:airline_section_x') - let g:airline_section_x = airline#section#create(['tagbar', '%{&filetype}']) + let g:airline_section_x = airline#section#create_right(['tagbar', '%{&filetype}']) endif if !exists('g:airline_section_y') - let g:airline_section_y = airline#section#create(['ffenc']) + let g:airline_section_y = airline#section#create_right(['ffenc']) endif if !exists('g:airline_section_z') - let g:airline_section_z = airline#section#create(['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) + let g:airline_section_z = airline#section#create_right(['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) endif if !exists('g:airline_section_warning') - let g:airline_section_warning = airline#section#create(['syntastic', 'whitespace']) + let g:airline_section_warning = airline#section#create_right(['syntastic', 'whitespace']) endif endfunction diff --git a/autoload/airline/parts.vim b/autoload/airline/parts.vim index 42ab21e..31a9f16 100644 --- a/autoload/airline/parts.vim +++ b/autoload/airline/parts.vim @@ -24,10 +24,6 @@ function! airline#parts#get(key) return get(s:parts, a:key, {}) endfunction -function! airline#parts#empty() - return '' -endfunction - function! airline#parts#mode() return get(w:, 'airline_current_mode', '') endfunction From 0548aeefcbc30d0a4e40819a65babc0e67040628 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 20:26:42 -0400 Subject: [PATCH 11/20] basic tests and travis integration. --- .gitignore | 1 + .travis.yml | 4 ++++ Gemfile | 2 ++ README.md | 2 ++ Rakefile | 14 ++++++++++++++ t/init.vim | 37 +++++++++++++++++++++++++++++++++++++ 6 files changed, 60 insertions(+) create mode 100644 .travis.yml create mode 100644 Gemfile create mode 100644 Rakefile create mode 100644 t/init.vim diff --git a/.gitignore b/.gitignore index 926ccaa..66fb17d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ doc/tags +*.lock diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..9ed483e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,4 @@ +language: ruby +rvm: + - 1.9.3 +script: rake ci diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..088f22e --- /dev/null +++ b/Gemfile @@ -0,0 +1,2 @@ +source 'https://rubygems.org' +gem 'vim-flavor', '~> 1.1' diff --git a/README.md b/README.md index 161b7e6..57cf16f 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,8 @@ Lean & mean statusline for vim that's light as air. * supports 7.2 as the minimum Vim version * predictable release cycle; the master branch is experimental and may break from time to time, if you prefer stability, use the most recent tag which usually is released once every 2 weeks. +[![Build Status](https://travis-ci.org/bling/vim-airline.png)](https://travis-ci.org/bling/vim-airline) + # Straightforward customization If you don't like the defaults, you can replace all sections with standard `statusline` syntax. Give your statusline that you've built over the years a face lift. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..741cfc2 --- /dev/null +++ b/Rakefile @@ -0,0 +1,14 @@ +#!/usr/bin/env rake + +task :default => [:test] + +task :ci => [:dump, :test] + +task :dump do + sh 'vim --version' +end + +task :test do + sh 'bundle exec vim-flavor test' +end + diff --git a/t/init.vim b/t/init.vim new file mode 100644 index 0000000..8aa4e1e --- /dev/null +++ b/t/init.vim @@ -0,0 +1,37 @@ +for key in ['a', 'b', 'c', 'gutter', 'x', 'y', 'z', 'warning'] + unlet! g:airline_section_{key} +endfor +call airline#init#bootstrap() + +describe 'init' + it 'section a should have mode, paste, iminsert' + Expect g:airline_section_a =~ 'mode' + Expect g:airline_section_a =~ 'paste' + Expect g:airline_section_a =~ 'iminsert' + end + + it 'section b should have hunks and branch' + Expect g:airline_section_b =~ 'hunks' + Expect g:airline_section_b =~ 'branch' + end + + it 'section c should be file' + Expect g:airline_section_c == '%<%f%m' + end + + it 'section x should be filetype' + Expect g:airline_section_x =~ '&filetype' + end + + it 'section y should be fenc and ff' + Expect g:airline_section_y =~ 'ff' + Expect g:airline_section_y =~ 'fenc' + end + + it 'section z should be line numbers' + Expect g:airline_section_z =~ '%3p%%' + Expect g:airline_section_z =~ '%3l' + Expect g:airline_section_z =~ '%3c' + end +end + From 54ec1f39ca1ee01c511d7d942d962a62177aa9b9 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 20:57:34 -0400 Subject: [PATCH 12/20] test some commands --- autoload/airline/extensions/whitespace.vim | 1 + t/commands.vim | 26 ++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 t/commands.vim diff --git a/autoload/airline/extensions/whitespace.vim b/autoload/airline/extensions/whitespace.vim index 234c732..3766f4e 100644 --- a/autoload/airline/extensions/whitespace.vim +++ b/autoload/airline/extensions/whitespace.vim @@ -56,6 +56,7 @@ endfunction! function! airline#extensions#whitespace#toggle() if s:enabled autocmd! airline_whitespace CursorHold,BufWritePost + augroup! airline_whitespace let s:enabled = 0 else call airline#extensions#whitespace#init() diff --git a/t/commands.vim b/t/commands.vim new file mode 100644 index 0000000..8038ffd --- /dev/null +++ b/t/commands.vim @@ -0,0 +1,26 @@ +call airline#init#bootstrap() +source plugin/airline.vim + +describe 'commands' + it 'should toggle off and on' + execute 'AirlineToggle' + Expect exists('#airline') to_be_false + execute 'AirlineToggle' + Expect exists('#airline') to_be_true + end + + it 'should toggle whitespace off and on' + execute 'AirlineToggleWhitespace' + Expect exists('#airline_whitespace') to_be_false + execute 'AirlineToggleWhitespace' + Expect exists('#airline_whitespace') to_be_true + end + + it 'should display theme name with no args' + execute 'AirlineTheme simple' + Expect g:airline_theme == 'simple' + execute 'AirlineTheme dark' + Expect g:airline_theme == 'dark' + end +end + From f5885bf9c2ae12a9f1b74f1e57fa4adaf8d3f20c Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 21:15:41 -0400 Subject: [PATCH 13/20] test creation of sections --- autoload/airline/section.vim | 6 +++--- t/parts.vim | 24 ++++++++++++++++++++++++ t/section.vim | 28 ++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 t/parts.vim create mode 100644 t/section.vim diff --git a/autoload/airline/section.vim b/autoload/airline/section.vim index 788b443..d14a828 100644 --- a/autoload/airline/section.vim +++ b/autoload/airline/section.vim @@ -2,7 +2,6 @@ " vim: et ts=2 sts=2 sw=2 function! s:get_val(key, append) - let val = '' let part = airline#parts#get(a:key) if exists('part.function') let func = (part.function).'()' @@ -14,12 +13,13 @@ function! s:get_val(key, append) return a:key endif + let val = '' if a:append > 0 let val .= '%{airline#util#append('.func.')}' elseif a:append < 0 - return '%{airline#util#prepend('.func.')}' + let val .= '%{airline#util#prepend('.func.')}' else - return '%{'.func.'}' + let val .= '%{'.func.'}' endif return val endfunction diff --git a/t/parts.vim b/t/parts.vim new file mode 100644 index 0000000..03fee1e --- /dev/null +++ b/t/parts.vim @@ -0,0 +1,24 @@ +describe 'parts' + it 'overwrites existing values' + call airline#parts#define('foo', { 'test': '123' }) + Expect airline#parts#get('foo').test == '123' + call airline#parts#define('foo', { 'test': '321' }) + Expect airline#parts#get('foo').test == '321' + end + + it 'can define a function part' + call airline#parts#define_function('func', 'bar') + Expect airline#parts#get('func').function == 'bar' + end + + it 'can define a text part' + call airline#parts#define_text('text', 'bar') + Expect airline#parts#get('text').text == 'bar' + end + + it 'can define a raw part' + call airline#parts#define_raw('raw', 'bar') + Expect airline#parts#get('raw').raw == 'bar' + end +end + diff --git a/t/section.vim b/t/section.vim new file mode 100644 index 0000000..0a16105 --- /dev/null +++ b/t/section.vim @@ -0,0 +1,28 @@ +call airline#init#bootstrap() + +function! SectionSpec() +endfunction + +describe 'section' + before + call airline#parts#define_text('text', 'text') + call airline#parts#define_raw('raw', 'raw') + call airline#parts#define_function('func', 'SectionSpec') + end + + it 'should create sections with no separators' + let s = airline#section#create(['text', 'raw', 'func']) + Expect s == '%{"text"}raw%{SectionSpec()}' + end + + it 'should create left sections with separators' + let s = airline#section#create_left(['text', 'text']) + Expect s == '%{"text"}%{airline#util#append("text")}' + end + + it 'should create right sections with separators' + let s = airline#section#create_right(['text', 'text']) + Expect s == '%{airline#util#prepend("text")}%{"text"}' + end +end + From b4cd0ae99d97f00ce72de56e8a07be50c40bc60c Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 21:28:38 -0400 Subject: [PATCH 14/20] add tests for the builder --- t/builder.vim | 47 +++++++++++++++++++++++++++++++++++++++++++++++ t/init.vim | 30 ++++++++++++++++++++++++++---- 2 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 t/builder.vim diff --git a/t/builder.vim b/t/builder.vim new file mode 100644 index 0000000..b96d8de --- /dev/null +++ b/t/builder.vim @@ -0,0 +1,47 @@ +call airline#init#bootstrap() + +describe 'active builder' + before + let s:builder = airline#builder#new({'active': 1}) + end + + it 'should have a call to check mode' + let stl = s:builder.build() + Expect stl =~ '%{airline#check_mode()}' + end + + it 'should transition colors from one to the next' + call s:builder.add_section('Normal', 'hello') + call s:builder.add_section('NonText', 'world') + let stl = s:builder.build() + Expect stl =~ '%#Normal#hello%#Normal_to_NonText#>%#NonText#world' + end + + it 'should split left/right sections' + call s:builder.split() + let stl = s:builder.build() + Expect stl =~ '%=' + end + + it 'after split, sections use the right separator' + call s:builder.split() + call s:builder.add_section('Normal', 'hello') + call s:builder.add_section('NonText', 'world') + let stl = s:builder.build() + Expect stl =~ '%#Normal#hello%#Normal_to_NonText#<%#NonText#world' + end +end + +describe 'inactive builder' + before + let s:builder = airline#builder#new({'active': 0}) + end + + it 'should transition colors from one to the next' + call s:builder.add_section('Normal', 'hello') + call s:builder.add_section('NonText', 'world') + let stl = s:builder.build() + Expect stl =~ '%#Normal_inactive#hello%#Normal_to_NonText_inactive#>%#NonText_inactive#world' + end +end + diff --git a/t/init.vim b/t/init.vim index 8aa4e1e..72a42f6 100644 --- a/t/init.vim +++ b/t/init.vim @@ -1,9 +1,21 @@ -for key in ['a', 'b', 'c', 'gutter', 'x', 'y', 'z', 'warning'] - unlet! g:airline_section_{key} -endfor -call airline#init#bootstrap() +let s:sections = ['a', 'b', 'c', 'gutter', 'x', 'y', 'z', 'warning'] + +function! s:clear() + for key in s:sections + unlet! g:airline_section_{key} + endfor +endfunction describe 'init' + before + call s:clear() + call airline#init#bootstrap() + end + + after + call s:clear() + end + it 'section a should have mode, paste, iminsert' Expect g:airline_section_a =~ 'mode' Expect g:airline_section_a =~ 'paste' @@ -33,5 +45,15 @@ describe 'init' Expect g:airline_section_z =~ '%3l' Expect g:airline_section_z =~ '%3c' end + + it 'should not redefine sections already defined' + for s in s:sections + let g:airline_section_{s} = s + endfor + call airline#init#bootstrap() + for s in s:sections + Expect g:airline_section_{s} == s + endfor + end end From e852fb388f7002f57b066404569c58a29b23e47d Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 21:42:42 -0400 Subject: [PATCH 15/20] test util functions --- t/util.vim | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 t/util.vim diff --git a/t/util.vim b/t/util.vim new file mode 100644 index 0000000..511c7fd --- /dev/null +++ b/t/util.vim @@ -0,0 +1,41 @@ +call airline#init#bootstrap() + +function! Util1() + let g:count += 1 +endfunction +function! Util2() + let g:count += 2 +endfunction +function! Util3(...) + let g:count = a:0 +endfunction + +describe 'util' + before + let g:count = 0 + end + + it 'has append wrapper function' + Expect airline#util#append('') == '' + Expect airline#util#append('1') == ' > 1' + end + + it 'has prepend wrapper function' + Expect airline#util#prepend('') == '' + Expect airline#util#prepend('1') == '1 < ' + end + + it 'has getwinvar function' + Expect airline#util#getwinvar(1, '&statusline', 'foo') == getwinvar(1, '&statusline') + Expect airline#util#getwinvar(1, 'asdf', '123') == '123' + end + + it 'has exec funcrefs helper functions' + call airline#util#exec_funcrefs([function('Util1'), function('Util2')]) + Expect g:count == 3 + + call airline#util#exec_funcrefs([function('Util3')], 1, 2, 3, 4) + Expect g:count == 4 + end +end + From d2687440776790c2b695be97f6e1a2d0a6571030 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Fri, 30 Aug 2013 22:44:20 -0400 Subject: [PATCH 16/20] test the layout config for the default extension. --- .gitignore | 1 + autoload/airline/extensions/branch.vim | 4 +++- t/extensions_default.vim | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 t/extensions_default.vim diff --git a/.gitignore b/.gitignore index 66fb17d..296f094 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ doc/tags *.lock +.vim-flavor diff --git a/autoload/airline/extensions/branch.vim b/autoload/airline/extensions/branch.vim index 446c89d..0aa3da5 100644 --- a/autoload/airline/extensions/branch.vim +++ b/autoload/airline/extensions/branch.vim @@ -27,7 +27,9 @@ function! airline#extensions#branch#get_head() endif endif - return empty(head) ? s:empty_message : s:symbol.' '.head + return empty(head) + \ ? s:empty_message + \ : printf('%s%s', empty(s:symbol) ? '' : s:symbol.' ', head) endfunction function! airline#extensions#branch#init(ext) diff --git a/t/extensions_default.vim b/t/extensions_default.vim new file mode 100644 index 0000000..9eb8023 --- /dev/null +++ b/t/extensions_default.vim @@ -0,0 +1,22 @@ +call airline#init#bootstrap() + +describe 'default' + before + let s:builder = airline#builder#new({'active': 1}) + end + + it 'should use the layout' + let g:airline#extensions#default#layout = [ + \ [ 'c', 'a', 'b', 'warning' ], + \ [ 'x', 'z', 'y' ] + \ ] + call airline#extensions#default#apply(s:builder, { 'winnr': 1, 'active': 1 }) + let stl = s:builder.build() + Expect stl =~ 'airline_c_to_airline_a' + Expect stl =~ 'airline_a_to_airline_b' + Expect stl =~ 'airline_b_to_airline_warning' + Expect stl =~ 'airline_x_to_airline_z' + Expect stl =~ 'airline_z_to_airline_y' + end +end + From 500ecf7cd08c5883baecb640340814751ab6026e Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Sat, 31 Aug 2013 03:26:59 +0000 Subject: [PATCH 17/20] support for prefixing with a highlight group. --- autoload/airline/section.vim | 10 ++++++++-- t/section.vim | 9 +++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/autoload/airline/section.vim b/autoload/airline/section.vim index d14a828..3df4bbe 100644 --- a/autoload/airline/section.vim +++ b/autoload/airline/section.vim @@ -3,17 +3,23 @@ function! s:get_val(key, append) let part = airline#parts#get(a:key) + + let val = '' + if exists('part.highlight') + let val .= '%#'.(part.highlight).'#' + endif + if exists('part.function') let func = (part.function).'()' elseif exists('part.text') let func = '"'.(part.text).'"' elseif exists('part.raw') - return part.raw + return val.(part.raw) else return a:key endif - let val = '' + if a:append > 0 let val .= '%{airline#util#append('.func.')}' elseif a:append < 0 diff --git a/t/section.vim b/t/section.vim index 0a16105..433dc0a 100644 --- a/t/section.vim +++ b/t/section.vim @@ -8,6 +8,10 @@ describe 'section' call airline#parts#define_text('text', 'text') call airline#parts#define_raw('raw', 'raw') call airline#parts#define_function('func', 'SectionSpec') + call airline#parts#define('hi', { + \ 'raw': 'hello', + \ 'highlight': 'hlgroup', + \ }) end it 'should create sections with no separators' @@ -24,5 +28,10 @@ describe 'section' let s = airline#section#create_right(['text', 'text']) Expect s == '%{airline#util#prepend("text")}%{"text"}' end + + it 'should prefix with highlight group if provided' + let s = airline#section#create(['hi']) + Expect s == '%#hlgroup#hello' + end end From a13c6925297b645d399f97c00c865ed21afe9d50 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Sat, 31 Aug 2013 03:35:23 +0000 Subject: [PATCH 18/20] define default statusline items with empty contents. --- autoload/airline/init.vim | 40 ++++++++++++++++++++------------------ autoload/airline/parts.vim | 6 ++++++ t/init.vim | 12 +++++++++--- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/autoload/airline/init.vim b/autoload/airline/init.vim index 8302e6e..c1ac79f 100644 --- a/autoload/airline/init.vim +++ b/autoload/airline/init.vim @@ -20,25 +20,6 @@ function! airline#init#bootstrap() call s:check_defined('g:airline_exclude_filetypes', []) call s:check_defined('g:airline_exclude_preview', 0) - call s:check_defined('g:airline_symbols', {}) - call extend(g:airline_symbols, { - \ 'paste': get(g:, 'airline_paste_symbol', 'PASTE'), - \ 'readonly': get(g:, 'airline_readonly_symbol', get(g:, 'airline_powerline_fonts', 0) ? '' : 'RO'), - \ 'whitespace': get(g:, 'airline_powerline_fonts', 0) ? '✹' : '!', - \ 'linenr': get(g:, 'airline_linecolumn_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ':' ), - \ 'branch': get(g:, 'airline_branch_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ''), - \ }, 'keep') - - call airline#parts#define_function('mode', 'airline#parts#mode') - call airline#parts#define_function('iminsert', 'airline#parts#iminsert') - call airline#parts#define_function('paste', 'airline#parts#paste') - call airline#parts#define('readonly', { - \ 'function': 'airline#parts#readonly', - \ 'highlight': 'airline_file', - \ }) - call airline#parts#define_raw('file', '%f%m') - call airline#parts#define_raw('ffenc', '%{printf("%s%s",&fenc,strlen(&ff)>0?"[".&ff."]":"")}') - call s:check_defined('g:airline_mode_map', {}) call extend(g:airline_mode_map, { \ '__' : '------', @@ -62,6 +43,27 @@ function! airline#init#bootstrap() \ '.*solarized.*': 'solarized', \ }, 'keep') + call s:check_defined('g:airline_symbols', {}) + call extend(g:airline_symbols, { + \ 'paste': get(g:, 'airline_paste_symbol', 'PASTE'), + \ 'readonly': get(g:, 'airline_readonly_symbol', get(g:, 'airline_powerline_fonts', 0) ? '' : 'RO'), + \ 'whitespace': get(g:, 'airline_powerline_fonts', 0) ? '✹' : '!', + \ 'linenr': get(g:, 'airline_linecolumn_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ':' ), + \ 'branch': get(g:, 'airline_branch_prefix', get(g:, 'airline_powerline_fonts', 0) ? '' : ''), + \ }, 'keep') + + call airline#parts#define_function('mode', 'airline#parts#mode') + call airline#parts#define_function('iminsert', 'airline#parts#iminsert') + call airline#parts#define_function('paste', 'airline#parts#paste') + call airline#parts#define('readonly', { + \ 'function': 'airline#parts#readonly', + \ 'highlight': 'airline_file', + \ }) + call airline#parts#define_raw('file', '%f%m') + call airline#parts#define_raw('ffenc', '%{printf("%s%s",&fenc,strlen(&ff)>0?"[".&ff."]":"")}') + + call airline#parts#define_empty(['hunks', 'branch', 'tagbar', 'syntastic']) + call airline#extensions#load() if !exists('g:airline_section_a') diff --git a/autoload/airline/parts.vim b/autoload/airline/parts.vim index 31a9f16..39041f8 100644 --- a/autoload/airline/parts.vim +++ b/autoload/airline/parts.vim @@ -20,6 +20,12 @@ function! airline#parts#define_raw(key, raw) call airline#parts#define(a:key, { 'raw': a:raw }) endfunction +function! airline#parts#define_empty(keys) + for key in a:keys + call airline#parts#define_raw(key, '') + endfor +endfunction + function! airline#parts#get(key) return get(s:parts, a:key, {}) endfunction diff --git a/t/init.vim b/t/init.vim index 72a42f6..f529381 100644 --- a/t/init.vim +++ b/t/init.vim @@ -22,9 +22,8 @@ describe 'init' Expect g:airline_section_a =~ 'iminsert' end - it 'section b should have hunks and branch' - Expect g:airline_section_b =~ 'hunks' - Expect g:airline_section_b =~ 'branch' + it 'section b should be blank because no extensions are installed' + Expect g:airline_section_b == '' end it 'section c should be file' @@ -55,5 +54,12 @@ describe 'init' Expect g:airline_section_{s} == s endfor end + + it 'all default statusline extensions should be blank' + Expect airline#parts#get('hunks').raw == '' + Expect airline#parts#get('branch').raw == '' + Expect airline#parts#get('tagbar').raw == '' + Expect airline#parts#get('syntastic').raw == '' + end end From 7bcb9b5fffb57605632fb1082e46c85355c6cdfa Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Sat, 31 Aug 2013 03:41:19 +0000 Subject: [PATCH 19/20] more compatible test for older vim version. --- autoload/airline/section.vim | 1 - t/util.vim | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/autoload/airline/section.vim b/autoload/airline/section.vim index 3df4bbe..1c7e789 100644 --- a/autoload/airline/section.vim +++ b/autoload/airline/section.vim @@ -19,7 +19,6 @@ function! s:get_val(key, append) return a:key endif - if a:append > 0 let val .= '%{airline#util#append('.func.')}' elseif a:append < 0 diff --git a/t/util.vim b/t/util.vim index 511c7fd..60606c7 100644 --- a/t/util.vim +++ b/t/util.vim @@ -26,8 +26,9 @@ describe 'util' end it 'has getwinvar function' - Expect airline#util#getwinvar(1, '&statusline', 'foo') == getwinvar(1, '&statusline') Expect airline#util#getwinvar(1, 'asdf', '123') == '123' + call setwinvar(1, 'vspec', 'is cool') + Expect airline#util#getwinvar(1, 'vspec', '') == 'is cool' end it 'has exec funcrefs helper functions' From a249c87f616f08bb98a562ffe77402d48e06a048 Mon Sep 17 00:00:00 2001 From: Bailey Ling Date: Sat, 31 Aug 2013 04:54:52 +0000 Subject: [PATCH 20/20] separators unnecessary in warning section. --- autoload/airline/init.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autoload/airline/init.vim b/autoload/airline/init.vim index c1ac79f..50551f4 100644 --- a/autoload/airline/init.vim +++ b/autoload/airline/init.vim @@ -88,7 +88,7 @@ function! airline#init#bootstrap() let g:airline_section_z = airline#section#create_right(['%3p%% %{g:airline_symbols.linenr} %3l:%3c ']) endif if !exists('g:airline_section_warning') - let g:airline_section_warning = airline#section#create_right(['syntastic', 'whitespace']) + let g:airline_section_warning = airline#section#create(['syntastic', 'whitespace']) endif endfunction