diff --git a/autoload/airline.vim b/autoload/airline.vim index 29a9d016..42a530a6 100644 --- a/autoload/airline.vim +++ b/autoload/airline.vim @@ -5,6 +5,7 @@ let g:airline_statusline_funcrefs = get(g:, 'airline_statusline_funcrefs', []) let s:sections = ['a','b','c','gutter','x','y','z','warning'] let s:highlighter = airline#highlighter#new() +let s:inactive_funcrefs = [] function! airline#add_statusline_func(name) call airline#add_statusline_funcref(function(a:name)) @@ -21,6 +22,10 @@ function! airline#remove_statusline_func(name) endif endfunction +function! airline#add_inactive_statusline_func(name) + call add(s:inactive_funcrefs, function(a:name)) +endfunction + function! airline#load_theme() call s:highlighter.load_theme() call airline#extensions#load_theme() @@ -96,25 +101,27 @@ function! airline#update_statusline() for nr in filter(range(1, winnr('$')), 'v:val != winnr()') call setwinvar(nr, 'airline_active', 0) let context = { 'winnr': nr, 'active': 0 } - let builder = airline#builder#new(context, s:highlighter) - call setwinvar(nr, '&statusline', airline#get_statusline(builder, nr, 0)) + call s:invoke_funcrefs(context, s:inactive_funcrefs) endfor - let w:airline_active = 1 - unlet! w:airline_render_left unlet! w:airline_render_right for section in s:sections unlet! w:airline_section_{section} endfor + let w:airline_active = 1 let context = { 'winnr': winnr(), 'active': 1 } - let builder = airline#builder#new(context, s:highlighter) - let err = airline#util#exec_funcrefs(g:airline_statusline_funcrefs, builder) + call s:invoke_funcrefs(context, g:airline_statusline_funcrefs) +endfunction + +function! s:invoke_funcrefs(context, funcrefs) + let builder = airline#builder#new(a:context, s:highlighter) + let err = airline#util#exec_funcrefs(a:funcrefs, builder, a:context) if err == 0 - call setwinvar(winnr(), '&statusline', airline#get_statusline(builder, winnr(), 1)) + call setwinvar(a:context.winnr, '&statusline', airline#get_statusline(builder, a:context.winnr, a:context.active)) elseif err == 1 - call setwinvar(winnr(), '&statusline', builder.build()) + call setwinvar(a:context.winnr, '&statusline', builder.build()) endif endfunction diff --git a/autoload/airline/extensions.vim b/autoload/airline/extensions.vim index 8015f69e..3d2d5ab1 100644 --- a/autoload/airline/extensions.vim +++ b/autoload/airline/extensions.vim @@ -8,6 +8,9 @@ endfunction function! s:ext.add_statusline_funcref(function) dict call airline#add_statusline_funcref(a:function) endfunction +function! s:ext.add_inactive_statusline_func(name) dict + call airline#add_inactive_statusline_func(a:name) +endfunction let s:script_path = expand(':p:h') diff --git a/doc/airline.txt b/doc/airline.txt index dcc86a2b..290a546b 100644 --- a/doc/airline.txt +++ b/doc/airline.txt @@ -302,6 +302,12 @@ statuslines to your liking. Here is an example: > < The second variable is the context, which is a dictionary containing various values such as whether the statusline is active or not, and the window number. +> + context = { + 'winnr': 'the window number for the statusline', + 'active': 'whether the window is active or not', + } +< *airline-pipeline-return-codes* The pipeline accepts various return codes and can be used to determine the