2020-01-06 03:22:49 +01:00
" MIT License. Copyright (c) 2013-2020 Bailey Ling, Christian Brabandt et al.
2013-08-17 19:35:06 +02:00
" vim: et ts=2 sts=2 sw=2
2013-08-02 19:56:12 +02:00
2019-12-13 10:17:15 +01:00
let s :save_cpo = &cpo
set cpo &vim
2016-09-24 02:16:30 +02:00
scriptencoding utf -8
2013-07-02 06:04:59 +02:00
if &cp | | v :version < 702 | | ( exists ( 'g:loaded_airline' ) && g :loaded_airline )
finish
endif
let g :loaded_airline = 1
2013-08-15 21:54:14 +02:00
2015-03-04 04:07:23 +01:00
let s :airline_initialized = 0
2013-08-18 20:13:34 +02:00
function ! s :init ( )
2015-03-04 04:07:23 +01:00
if s :airline_initialized
return
endif
let s :airline_initialized = 1
2015-02-20 03:08:21 +01:00
call airline #extensions #load ( )
call airline #init #sections ( )
2016-01-30 21:17:19 +01:00
let s :theme_in_vimrc = exists ( 'g:airline_theme' )
if s :theme_in_vimrc
2016-01-30 04:24:49 +01:00
try
2019-03-26 21:03:13 +01:00
if g :airline_theme is # 'random'
2019-03-26 21:10:45 +01:00
let g :airline_theme = s :random_theme ( )
2019-03-26 21:03:13 +01:00
endif
2016-01-30 04:24:49 +01:00
let palette = g :airline #themes #{g :airline_theme }#palette
catch
2018-11-13 21:36:50 +01:00
call airline #util #warning ( printf ( 'Could not resolve airline theme "%s". Themes have been migrated to github.com/vim-airline/vim-airline-themes.' , g :airline_theme ) )
2016-01-30 04:24:49 +01:00
let g :airline_theme = 'dark'
endtry
2019-04-17 08:25:55 +02:00
try
silent call airline #switch_theme ( g :airline_theme )
catch
call airline #util #warning ( printf ( 'Could not find airline theme "%s".' , g :airline_theme ) )
let g :airline_theme = 'dark'
silent call airline #switch_theme ( g :airline_theme )
endtry
2016-01-30 21:17:19 +01:00
else
let g :airline_theme = 'dark'
silent call s :on_colorscheme_changed ( )
2013-07-06 19:50:57 +02:00
endif
2015-02-20 03:08:21 +01:00
2018-09-25 16:03:30 +02:00
call airline #util #doautocmd ( 'AirlineAfterInit' )
2013-08-18 20:13:34 +02:00
endfunction
2019-12-13 08:55:56 +01:00
function ! s :do_vim_enter ( )
" Needed for the Vista extension #2009
if get ( g :, 'airline#extensions#vista#enabled' , 1 ) && exists ( ':Vista' )
call vista #RunForNearestMethodOrFunction ( )
endif
call < sid > on_window_changed ( 'VimEnter' )
endfunction
2018-06-14 19:31:17 +02:00
let s :active_winnr = -1
2019-06-03 08:30:27 +02:00
function ! s :on_window_changed ( event )
2019-11-25 16:24:58 +01:00
" don't trigger for Vim popup windows
if &buftype is # 'popup'
return
endif
2018-06-14 19:31:17 +02:00
2016-01-21 17:45:10 +01:00
if pumvisible ( ) && ( ! &previewwindow | | g :airline_exclude_preview )
2019-11-25 16:24:58 +01:00
" do not trigger for previewwindows
2013-08-25 03:17:16 +02:00
return
endif
2019-11-25 16:24:58 +01:00
let s :active_winnr = winnr ( )
2016-04-20 21:06:04 +02:00
" Handle each window only once, since we might come here several times for
" different autocommands.
2018-06-14 19:31:17 +02:00
let l :key = [bufnr ( '%' ) , s :active_winnr , winnr ( '$' ) , tabpagenr ( ) , &ft ]
2016-09-14 19:05:57 +02:00
if get ( g :, 'airline_last_window_changed' , []) = = l :key
2018-06-14 19:31:17 +02:00
\ && &stl is # '%!airline#statusline(' .s :active_winnr .')'
2017-03-20 08:56:35 +01:00
\ && &ft ! ~ ? 'gitcommit'
2017-03-20 08:36:54 +01:00
" fugitive is special, it changes names and filetypes several times,
" make sure the caching does not get into its way
2016-04-20 21:06:04 +02:00
return
endif
2016-09-14 19:05:57 +02:00
let g :airline_last_window_changed = l :key
2015-03-04 04:07:23 +01:00
call s :init ( )
2013-07-31 19:37:00 +02:00
call airline #update_statusline ( )
endfunction
2020-01-28 15:54:00 +01:00
function ! s :on_focus_gained ( )
2020-01-28 20:58:45 +01:00
if airline #util #try_focusgained ( )
unlet ! w :airline_lastmode | :call < sid > airline_refresh ( 1 )
2020-01-28 15:54:00 +01:00
endif
endfunction
2019-02-03 17:30:55 +01:00
function ! s :on_cursor_moved ( )
2019-10-24 09:19:58 +02:00
if winnr ( ) ! = s :active_winnr | | ! exists ( 'w:airline_active' )
2019-06-03 08:30:27 +02:00
call s :on_window_changed ( 'CursorMoved' )
2019-02-03 17:30:55 +01:00
endif
2019-02-04 08:23:58 +01:00
call airline #update_tabline ( )
2019-02-03 17:30:55 +01:00
endfunction
2013-08-18 06:44:13 +02:00
function ! s :on_colorscheme_changed ( )
2015-03-04 04:07:23 +01:00
call s :init ( )
2017-02-28 08:33:44 +01:00
unlet ! g :airline #highlighter #normal_fg_hi
2017-08-11 11:26:35 +02:00
call airline #highlighter #reset_hlcache ( )
2016-02-05 22:19:48 +01:00
let g :airline_gui_mode = airline #init #gui_mode ( )
2016-01-30 21:17:19 +01:00
if ! s :theme_in_vimrc
call airline #switch_matching_theme ( )
2013-08-18 06:44:13 +02:00
endif
" couldn't find a match, or theme was defined, just refresh
call airline #load_theme ( )
endfunction
2016-04-20 21:10:28 +02:00
function ! airline #cmdwinenter ( ...)
2013-08-15 21:54:14 +02:00
call airline #extensions #apply_left_override ( 'Command Line' , '' )
endfunction
2013-08-14 23:56:55 +02:00
function ! s :airline_toggle ( )
if exists ( "#airline" )
augroup airline
au !
augroup END
augroup ! airline
2013-08-30 23:58:29 +02:00
if exists ( "s:stl" )
2013-10-14 00:01:38 +02:00
let &stl = s :stl
2013-08-14 23:56:55 +02:00
endif
2019-02-03 17:30:55 +01:00
if exists ( "s:tal" )
let [&tal , &showtabline ] = s :tal
endif
2017-08-11 12:05:39 +02:00
call airline #highlighter #reset_hlcache ( )
2013-10-14 00:01:38 +02:00
2018-09-25 16:03:30 +02:00
call airline #util #doautocmd ( 'AirlineToggledOff' )
2013-08-30 23:58:29 +02:00
else
2013-10-14 00:01:38 +02:00
let s :stl = &statusline
2019-02-03 17:30:55 +01:00
let s :tal = [&tabline , &showtabline ]
2013-08-30 23:58:29 +02:00
augroup airline
autocmd !
autocmd CmdwinEnter *
\ call airline #add_statusline_func ( 'airline#cmdwinenter' )
2019-06-03 08:30:27 +02:00
\ | call < sid > on_window_changed ( 'CmdwinEnter' )
2013-08-30 23:58:29 +02:00
autocmd CmdwinLeave * call airline #remove_statusline_func ( 'airline#cmdwinenter' )
2016-02-05 22:19:48 +01:00
autocmd GUIEnter , ColorScheme * call < sid > on_colorscheme_changed ( )
2018-04-12 10:23:49 +02:00
if exists ( "##OptionSet" )
" Make sure that g_airline_gui_mode is refreshed
autocmd OptionSet termguicolors call < sid > on_colorscheme_changed ( )
2018-06-04 22:44:46 +02:00
endif
2018-10-03 12:29:23 +02:00
" Set all statuslines to inactive
2018-10-16 10:49:17 +02:00
autocmd FocusLost * call airline #update_statusline_focuslost ( )
2018-01-04 20:07:15 +01:00
" Refresh airline for :syntax off
2018-01-21 05:27:32 +01:00
autocmd SourcePre */syntax/ syntax .vim
\ call airline #extensions #tabline #buffers #invalidate ( )
2019-12-13 08:55:56 +01:00
autocmd VimEnter * call < sid > do_vim_enter ( )
2019-06-03 08:30:27 +02:00
autocmd WinEnter * call < sid > on_window_changed ( 'WinEnter' )
autocmd FileType * call < sid > on_window_changed ( 'FileType' )
autocmd BufWinEnter * call < sid > on_window_changed ( 'BufWinEnter' )
autocmd BufUnload * call < sid > on_window_changed ( 'BufUnload' )
2018-06-09 10:50:25 +02:00
if exists ( '##CompleteDone' )
2019-06-03 08:30:27 +02:00
autocmd CompleteDone * call < sid > on_window_changed ( 'CompleteDone' )
2017-02-11 19:59:58 +01:00
endif
2018-06-14 19:31:17 +02:00
" non-trivial number of external plugins use eventignore=all, so we need to account for that
2019-02-03 17:30:55 +01:00
autocmd CursorMoved * call < sid > on_cursor_moved ( )
2013-08-30 23:58:29 +02:00
2020-01-28 15:54:00 +01:00
autocmd VimResized * call < sid > on_focus_gained ( )
2018-11-08 07:54:01 +01:00
if exists ( '*timer_start' ) && exists ( '*funcref' )
" do not trigger FocusGained on startup, it might erase the intro screen (see #1817)
" needs funcref() (needs 7.4.2137) and timers (7.4.1578)
2018-11-07 10:38:34 +01:00
let Handler = funcref ( '<sid>FocusGainedHandler' )
let s :timer = timer_start ( 5000 , Handler )
else
2020-01-28 15:54:00 +01:00
autocmd FocusGained * call < sid > on_focus_gained ( )
2018-11-07 10:38:34 +01:00
endif
2018-11-22 08:31:14 +01:00
if exists ( "##TerminalOpen" )
" Using the same function with the TermOpen autocommand
" breaks for Neovim see #1828, looks like a neovim bug.
autocmd TerminalOpen * :call airline #load_theme ( ) " reload current theme for Terminal, forces the terminal extension to be loaded
2018-11-20 15:28:29 +01:00
endif
2016-06-23 17:52:17 +02:00
autocmd TabEnter * :unlet ! w :airline_lastmode | let w :airline_active = 1
2013-08-30 23:58:29 +02:00
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 ( )
2019-02-04 08:25:45 +01:00
autocmd User AirlineModeChanged nested call airline #mode_changed ( )
2019-02-03 17:30:55 +01:00
if get ( g :, 'airline_statusline_ontop' , 0 )
" Force update of tabline more often
2019-02-04 08:23:58 +01:00
autocmd InsertEnter , InsertLeave , CursorMovedI * :call airline #update_tabline ( )
2019-02-03 17:30:55 +01:00
endif
2013-08-30 23:58:29 +02:00
augroup END
2013-10-14 00:01:38 +02:00
2019-12-22 12:06:35 +01:00
if ! airline #util #stl_disabled ( winnr ( ) )
2019-12-13 09:59:45 +01:00
if &laststatus < 2
set laststatus = 2
endif
2017-07-02 20:42:32 +02:00
endif
2015-03-04 04:07:23 +01:00
if s :airline_initialized
2019-06-03 08:30:27 +02:00
call s :on_window_changed ( 'Init' )
2015-03-04 04:07:23 +01:00
endif
2018-09-25 16:03:30 +02:00
call airline #util #doautocmd ( 'AirlineToggledOn' )
2013-08-30 23:58:29 +02:00
endif
endfunction
function ! s :get_airline_themes ( a , l , p )
2018-11-13 22:14:13 +01:00
return airline #util #themes ( a :a )
2013-08-30 23:58:29 +02:00
endfunction
2015-02-20 03:08:21 +01:00
2013-08-30 23:58:29 +02:00
function ! s :airline_theme ( ...)
if a :0
2018-11-14 07:36:45 +01:00
try
2019-03-26 21:03:13 +01:00
let theme = a :1
if theme is # 'random'
2019-03-26 21:10:45 +01:00
let theme = s :random_theme ( )
2019-03-26 21:03:13 +01:00
endif
call airline #switch_theme ( theme )
2018-11-14 07:36:45 +01:00
catch " discard error
endtry
2019-03-26 21:03:13 +01:00
if a :1 is # 'random'
echo g :airline_theme
endif
2013-08-30 23:58:29 +02:00
else
echo g :airline_theme
endif
endfunction
2015-02-20 03:08:21 +01:00
2019-04-26 10:16:40 +02:00
function ! s :airline_refresh ( ...)
" a:1, fast refresh, do not reload the theme
let fast = ! empty ( get ( a :000 , 0 , 0 ) )
2016-07-24 09:58:52 +02:00
if ! exists ( "#airline" )
" disabled
return
endif
2018-09-25 16:03:30 +02:00
call airline #util #doautocmd ( 'AirlineBeforeRefresh' )
2017-08-14 08:06:53 +02:00
call airline #highlighter #reset_hlcache ( )
2019-04-26 10:16:40 +02:00
if ! fast
call airline #load_theme ( )
endif
2016-01-28 09:49:09 +01:00
call airline #update_statusline ( )
2019-02-04 08:23:58 +01:00
call airline #update_tabline ( )
2016-01-28 09:49:09 +01:00
endfunction
2018-11-07 10:38:34 +01:00
function ! s :FocusGainedHandler ( timer )
if exists ( "s:timer" ) && a :timer = = s :timer
augroup airline
2020-01-28 15:54:00 +01:00
au FocusGained * call s :on_focus_gained ( )
2018-11-07 10:38:34 +01:00
augroup END
endif
endfu
2018-11-14 08:06:39 +01:00
function ! s :airline_extensions ( )
let loaded = airline #extensions #get_loaded_extensions ( )
let files = split ( globpath ( &rtp , "autoload/airline/extensions/*.vim" ) , "\n" )
call map ( files , 'fnamemodify(v:val, ":t:r")' )
2019-05-03 12:43:21 +02:00
if empty ( files )
echo "No extensions loaded"
return
2018-11-14 08:06:39 +01:00
endif
2019-05-03 12:43:21 +02:00
echohl Title
echo printf ( "%-15s\t%s\t%s" , "Extension" , "Extern" , "Status" )
echohl Normal
let set = []
2018-11-14 08:06:39 +01:00
for ext in sort ( files )
2019-05-03 12:43:21 +02:00
if index ( set , ext ) > -1
continue
endif
2019-03-26 08:41:36 +01:00
let indx = match ( loaded , '^' .ext .'\*\?$' )
let external = ( indx > -1 && loaded [indx ] = ~ '\*$' )
echo printf ( "%-15s\t%s\t%sloaded" , ext , external , indx = = -1 ? 'not ' : '' )
2019-05-03 12:43:21 +02:00
call add ( set , ext )
2018-11-14 08:06:39 +01:00
endfor
endfunction
2019-03-26 21:10:45 +01:00
function ! s :rand ( max ) abort
2019-11-25 17:13:33 +01:00
if exists ( "*rand" )
" Needs Vim 8.1.2342
let number = rand ( )
elseif has ( "reltime" )
2019-03-26 21:03:13 +01:00
let timerstr = reltimestr ( reltime ( ) )
let number = split ( timerstr , '\.' ) [1 ]+ 0
2019-03-26 21:53:47 +01:00
elseif has ( "win32" ) && &shell = ~ 'cmd'
let number = system ( "echo %random%" ) + 0
2019-03-26 21:03:13 +01:00
else
" best effort, bash and zsh provide $RANDOM
" cmd.exe on windows provides %random%, but expand()
" does not seem to be able to expand this correctly.
" In the worst case, this always returns zero
let number = expand ( "$RANDOM" ) + 0
endif
return number % a :max
endfunction
2019-03-26 21:10:45 +01:00
function ! s :random_theme ( ) abort
2019-03-26 21:03:13 +01:00
let themes = airline #util #themes ( '' )
2019-03-26 21:10:45 +01:00
return themes [s :rand ( len ( themes ) ) ]
2019-03-26 21:03:13 +01:00
endfunction
2015-04-24 20:26:44 +02:00
command ! - bar - nargs = ? - complete = customlist , < sid > get_airline_themes AirlineTheme call < sid > airline_theme ( < f - args > )
command ! - bar AirlineToggleWhitespace call airline #extensions #whitespace #toggle ( )
2018-11-14 08:06:39 +01:00
command ! - bar AirlineToggle call s :airline_toggle ( )
2019-04-26 10:16:40 +02:00
command ! - bar - bang AirlineRefresh call s :airline_refresh ( < q - bang > )
2018-11-14 08:06:39 +01:00
command ! AirlineExtensions call s :airline_extensions ( )
2013-07-10 21:55:55 +02:00
2015-02-26 22:15:39 +01:00
call airline #init #bootstrap ( )
2015-03-04 04:07:23 +01:00
call s :airline_toggle ( )
2020-05-04 08:10:33 +02:00
if exists ( "v:vim_did_enter" ) && v :vim_did_enter
2020-05-04 07:48:13 +02:00
call < sid > on_window_changed ( 'VimEnter' )
endif
2019-12-13 10:17:15 +01:00
let &cpo = s :save_cpo
unlet s :save_cpo