I broke up with neovim....vim is my best friend now

This commit is contained in:
LinlyBoi
2023-04-30 08:14:07 +03:00
parent 0d185449c5
commit 4a4a6b1e81
5245 changed files with 468325 additions and 25 deletions

View File

@@ -0,0 +1,138 @@
" MIT License. Copyright (c) 2013-2021 Bjorn Neergaard, w0rp et al.
" Plugin: https://github.com/dense-analysis/ale
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_ale_dont_use_this_in_other_plugins_please', 0)
finish
endif
function! s:airline_ale_count(cnt, symbol)
return a:cnt ? a:symbol. a:cnt : ''
endfunction
function! s:legacy_airline_ale_get_line_number(cnt, type) abort
" Before ALE introduced the FirstProblem API function, this is how
" airline would get the line numbers:
" 1. Get the whole loclist; 2. Filter it for the desired problem type.
" 3. Return the line number of the first element in the filtered list.
if a:cnt == 0
return ''
endif
let buffer = bufnr('')
let problem_type = (a:type ==# 'error') ? 'E' : 'W'
let problems = copy(ale#engine#GetLoclist(buffer))
call filter(problems, 'v:val.bufnr is buffer && v:val.type is# problem_type')
if empty(problems)
return ''
endif
let open_lnum_symbol = get(g:, 'airline#extensions#ale#open_lnum_symbol', '(L')
let close_lnum_symbol = get(g:, 'airline#extensions#ale#close_lnum_symbol', ')')
return open_lnum_symbol . problems[0].lnum . close_lnum_symbol
endfunction
function! s:new_airline_ale_get_line_number(cnt, type) abort
" The FirstProblem call in ALE is a far more efficient way
" of obtaining line number data. If the installed ALE supports
" it, we should use this method of getting line data.
if a:cnt == 0
return ''
endif
let l:buffer = bufnr('')
" Try to get the first error from ALE.
let l:result = ale#statusline#FirstProblem(l:buffer, a:type)
if empty(l:result)
" If there are no errors then try and check for style errors.
let l:result = ale#statusline#FirstProblem(l:buffer, 'style_' . a:type)
endif
if empty(l:result)
return ''
endif
let l:open_lnum_symbol =
\ get(g:, 'airline#extensions#ale#open_lnum_symbol', '(L')
let l:close_lnum_symbol =
\ get(g:, 'airline#extensions#ale#close_lnum_symbol', ')')
return open_lnum_symbol . l:result.lnum . close_lnum_symbol
endfunction
function! s:airline_ale_get_line_number(cnt, type) abort
" Use the new ALE statusline API function if it is available.
if exists("*ale#statusline#FirstProblem")
return s:new_airline_ale_get_line_number(a:cnt, a:type)
endif
return s:legacy_airline_ale_get_line_number(a:cnt, a:type)
endfunction
function! airline#extensions#ale#get(type)
if !exists(':ALELint')
return ''
endif
let error_symbol = get(g:, 'airline#extensions#ale#error_symbol', 'E:')
let warning_symbol = get(g:, 'airline#extensions#ale#warning_symbol', 'W:')
let checking_symbol = get(g:, 'airline#extensions#ale#checking_symbol', '...')
let show_line_numbers = get(g:, 'airline#extensions#ale#show_line_numbers', 1)
let is_err = a:type ==# 'error'
if ale#engine#IsCheckingBuffer(bufnr('')) == 1
return is_err ? '' : checking_symbol
endif
let symbol = is_err ? error_symbol : warning_symbol
let counts = ale#statusline#Count(bufnr(''))
if type(counts) == type({}) && has_key(counts, 'error')
" Use the current Dictionary format.
let errors = counts.error + counts.style_error
let num = is_err ? errors : counts.total - errors
else
" Use the old List format.
let num = is_err ? counts[0] : counts[1]
endif
if show_line_numbers == 1
return s:airline_ale_count(num, symbol) . <sid>airline_ale_get_line_number(num, a:type)
else
return s:airline_ale_count(num, symbol)
endif
endfunction
function! airline#extensions#ale#get_warning()
return airline#extensions#ale#get('warning')
endfunction
function! airline#extensions#ale#get_error()
return airline#extensions#ale#get('error')
endfunction
function! airline#extensions#ale#init(ext)
call airline#parts#define_function('ale_error_count', 'airline#extensions#ale#get_error')
call airline#parts#define_function('ale_warning_count', 'airline#extensions#ale#get_warning')
augroup airline_ale
autocmd!
autocmd CursorHold,BufWritePost * call <sid>ale_refresh()
autocmd User ALEJobStarted,ALELintPost call <sid>ale_refresh()
augroup END
endfunction
function! s:ale_refresh()
if !exists('#airline')
" airline disabled
return
endif
if get(g:, 'airline_skip_empty_sections', 0)
exe ':AirlineRefresh!'
endif
endfunction

View File

@@ -0,0 +1,23 @@
" MIT License. Copyright (c) 2014-2021 Mathias Andersson et al.
" Plugin: https://github.com/lambdalisue/battery.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('g:loaded_battery')
finish
endif
function! airline#extensions#battery#status(...) abort
if !exists('g:battery#update_statusline')
let g:battery#update_statusline = 1
call battery#update()
endif
let bat = battery#component()
return bat
endfunction
function! airline#extensions#battery#init(ext) abort
call airline#parts#define_function('battery', 'airline#extensions#battery#status')
endfunction

View File

@@ -0,0 +1,30 @@
" MIT License. Copyright (c) 2021 Bjoern Petri <bjoern.petri@sundevil.de>
" Plugin: https://github.com/MattesGroeger/vim-bookmarks
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':BookmarkToggle')
finish
endif
function! airline#extensions#bookmark#currentbookmark() abort
if get(w:, 'airline_active', 0)
let file = expand('%:p')
if file ==# ''
return
endif
let current_line = line('.')
let has_bm = bm#has_bookmark_at_line(file, current_line)
let bm = has_bm ? bm#get_bookmark_by_line(file, current_line) : 0
let annotation = has_bm ? bm['annotation'] : ''
return annotation
endif
return ''
endfunction
function! airline#extensions#bookmark#init(ext) abort
call airline#parts#define_function('bookmark', 'airline#extensions#bookmark#currentbookmark')
endfunction

View File

@@ -0,0 +1,369 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: fugitive, gina, lawrencium and vcscommand
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
" s:vcs_config contains static configuration of VCSes and their status relative
" to the active file.
" 'branch' - The name of currently active branch. This field is empty iff it
" has not been initialized yet or the current file is not in
" an active branch.
" 'untracked' - Cache of untracked files represented as a dictionary with files
" as keys. A file has a not exists symbol set as its value if it
" is untracked. A file is present in this dictionary iff its
" status is considered up to date.
" 'untracked_mark' - used as regexp to test against the output of 'cmd'
let s:vcs_config = {
\ 'git': {
\ 'exe': 'git',
\ 'cmd': 'git status --porcelain -- ',
\ 'dirty': 'git status -uno --porcelain --ignore-submodules',
\ 'untracked_mark': '??',
\ 'exclude': '\.git',
\ 'update_branch': 's:update_git_branch',
\ 'display_branch': 's:display_git_branch',
\ 'branch': '',
\ 'untracked': {},
\ },
\ 'mercurial': {
\ 'exe': 'hg',
\ 'cmd': 'hg status -u -- ',
\ 'dirty': 'hg status -mard',
\ 'untracked_mark': '?',
\ 'exclude': '\.hg',
\ 'update_branch': 's:update_hg_branch',
\ 'display_branch': 's:display_hg_branch',
\ 'branch': '',
\ 'untracked': {},
\ },
\}
" Initializes b:buffer_vcs_config. b:buffer_vcs_config caches the branch and
" untracked status of the file in the buffer. Caching those fields is necessary,
" because s:vcs_config may be updated asynchronously and s:vcs_config fields may
" be invalid during those updates. b:buffer_vcs_config fields are updated
" whenever corresponding fields in s:vcs_config are updated or an inconsistency
" is detected during update_* operation.
"
" b:airline_head caches the head string it is empty iff it needs to be
" recalculated. b:airline_head is recalculated based on b:buffer_vcs_config.
function! s:init_buffer()
let b:buffer_vcs_config = {}
for vcs in keys(s:vcs_config)
let b:buffer_vcs_config[vcs] = {
\ 'branch': '',
\ 'untracked': '',
\ 'dirty': 0,
\ }
endfor
unlet! b:airline_head
endfunction
let s:head_format = get(g:, 'airline#extensions#branch#format', 0)
if s:head_format == 1
function! s:format_name(name)
return fnamemodify(a:name, ':t')
endfunction
elseif s:head_format == 2
function! s:format_name(name)
return pathshorten(a:name)
endfunction
elseif type(s:head_format) == type('')
function! s:format_name(name)
return call(s:head_format, [a:name])
endfunction
else
function! s:format_name(name)
return a:name
endfunction
endif
" Fugitive special revisions. call '0' "staging" ?
let s:names = {'0': 'index', '1': 'orig', '2':'fetch', '3':'merge'}
let s:sha1size = get(g:, 'airline#extensions#branch#sha1_len', 7)
function! s:update_git_branch()
call airline#util#ignore_next_focusgain()
if airline#util#has_fugitive()
call s:config_fugitive_branch()
elseif airline#util#has_gina()
call s:config_gina_branch()
else
let s:vcs_config['git'].branch = ''
return
endif
endfunction
function! s:config_fugitive_branch() abort
let s:vcs_config['git'].branch = FugitiveHead(s:sha1size)
if s:vcs_config['git'].branch is# 'master' &&
\ airline#util#winwidth() < 81
" Shorten default a bit
let s:vcs_config['git'].branch='mas'
endif
endfunction
function! s:config_gina_branch() abort
try
let g:gina#component#repo#commit_length = s:sha1size
let s:vcs_config['git'].branch = gina#component#repo#branch()
catch
endtry
if s:vcs_config['git'].branch is# 'master' &&
\ airline#util#winwidth() < 81
" Shorten default a bit
let s:vcs_config['git'].branch='mas'
endif
endfunction
function! s:display_git_branch()
let name = b:buffer_vcs_config['git'].branch
try
let commit = matchstr(FugitiveParse()[0], '^\x\+')
if has_key(s:names, commit)
let name = get(s:names, commit)."(".name.")"
elseif !empty(commit)
if exists('*FugitiveExecute')
let ref = FugitiveExecute(['describe', '--all', '--exact-match', commit], bufnr('')).stdout[0]
else
noautocmd let ref = fugitive#repo().git_chomp('describe', '--all', '--exact-match', commit)
if ref =~# ':'
let ref = ''
endif
endif
if !empty(ref)
let name = s:format_name(substitute(ref, '\v\C^%(heads/|remotes/|tags/)=','',''))."(".name.")"
else
let name = matchstr(commit, '.\{'.s:sha1size.'}')."(".name.")"
endif
endif
catch
endtry
return name
endfunction
function! s:update_hg_branch()
if airline#util#has_lawrencium()
let cmd='LC_ALL=C hg qtop'
let stl=lawrencium#statusline()
let file=expand('%:p')
if !empty(stl) && get(b:, 'airline_do_mq_check', 1)
if g:airline#init#vim_async
noa call airline#async#get_mq_async(cmd, file)
elseif has("nvim")
noa call airline#async#nvim_get_mq_async(cmd, file)
else
" remove \n at the end of the command
let output=system(cmd)[0:-2]
noa call airline#async#mq_output(output, file)
endif
endif
" do not do mq check anymore
let b:airline_do_mq_check = 0
if exists("b:mq") && !empty(b:mq)
if stl is# 'default'
" Shorten default a bit
let stl='def'
endif
let stl.=' ['.b:mq.']'
endif
let s:vcs_config['mercurial'].branch = stl
else
let s:vcs_config['mercurial'].branch = ''
endif
endfunction
function! s:display_hg_branch()
return b:buffer_vcs_config['mercurial'].branch
endfunction
function! s:update_branch()
for vcs in keys(s:vcs_config)
call {s:vcs_config[vcs].update_branch}()
if b:buffer_vcs_config[vcs].branch != s:vcs_config[vcs].branch
let b:buffer_vcs_config[vcs].branch = s:vcs_config[vcs].branch
unlet! b:airline_head
endif
endfor
endfunction
function! airline#extensions#branch#update_untracked_config(file, vcs)
if !has_key(s:vcs_config[a:vcs].untracked, a:file)
return
elseif s:vcs_config[a:vcs].untracked[a:file] != b:buffer_vcs_config[a:vcs].untracked
let b:buffer_vcs_config[a:vcs].untracked = s:vcs_config[a:vcs].untracked[a:file]
unlet! b:airline_head
endif
endfunction
function! s:update_untracked()
let file = expand("%:p")
if empty(file) || isdirectory(file) || !empty(&buftype)
return
endif
let needs_update = 1
let vcs_checks = get(g:, "airline#extensions#branch#vcs_checks", ["untracked", "dirty"])
for vcs in keys(s:vcs_config)
if file =~ s:vcs_config[vcs].exclude
" Skip check for files that live in the exclude directory
let needs_update = 0
endif
if has_key(s:vcs_config[vcs].untracked, file)
let needs_update = 0
call airline#extensions#branch#update_untracked_config(file, vcs)
endif
endfor
if !needs_update
return
endif
for vcs in keys(s:vcs_config)
" only check, for git, if fugitive is installed
" and for 'hg' if lawrencium is installed, else skip
if vcs is# 'git' && (!airline#util#has_fugitive() && !airline#util#has_gina())
continue
elseif vcs is# 'mercurial' && !airline#util#has_lawrencium()
continue
endif
let config = s:vcs_config[vcs]
" Note that asynchronous update updates s:vcs_config only, and only
" s:update_untracked updates b:buffer_vcs_config. If s:vcs_config is
" invalidated again before s:update_untracked is called, then we lose the
" result of the previous call, i.e. the head string is not updated. It
" doesn't happen often in practice, so we let it be.
if index(vcs_checks, 'untracked') > -1
call airline#async#vcs_untracked(config, file, vcs)
endif
" Check clean state of repo
if index(vcs_checks, 'dirty') > -1
call airline#async#vcs_clean(config.dirty, file, vcs)
endif
endfor
endfunction
function! airline#extensions#branch#head()
if !exists('b:buffer_vcs_config')
call s:init_buffer()
endif
call s:update_branch()
call s:update_untracked()
if exists('b:airline_head') && !empty(b:airline_head)
return b:airline_head
endif
let b:airline_head = ''
let vcs_priority = get(g:, "airline#extensions#branch#vcs_priority", ["git", "mercurial"])
let heads = []
for vcs in vcs_priority
if !empty(b:buffer_vcs_config[vcs].branch)
let heads += [vcs]
endif
endfor
for vcs in heads
if !empty(b:airline_head)
let b:airline_head .= ' | '
endif
if len(heads) > 1
let b:airline_head .= s:vcs_config[vcs].exe .':'
endif
let b:airline_head .= s:format_name({s:vcs_config[vcs].display_branch}())
let additional = b:buffer_vcs_config[vcs].untracked
if empty(additional) &&
\ has_key(b:buffer_vcs_config[vcs], 'dirty') &&
\ b:buffer_vcs_config[vcs].dirty
let additional = g:airline_symbols['dirty']
endif
let b:airline_head .= additional
endfor
if empty(heads)
if airline#util#has_vcscommand()
noa call VCSCommandEnableBufferSetup()
if exists('b:VCSCommandBufferInfo')
let b:airline_head = s:format_name(get(b:VCSCommandBufferInfo, 0, ''))
endif
endif
endif
if empty(heads)
if airline#util#has_custom_scm()
try
let Fn = function(g:airline#extensions#branch#custom_head)
let b:airline_head = Fn()
endtry
endif
endif
if exists("g:airline#extensions#branch#displayed_head_limit")
let w:displayed_head_limit = g:airline#extensions#branch#displayed_head_limit
if strwidth(b:airline_head) > w:displayed_head_limit - 1
let b:airline_head =
\ airline#util#strcharpart(b:airline_head, 0, w:displayed_head_limit - 1)
\ . (&encoding ==? 'utf-8' ? '…' : '.')
endif
endif
return b:airline_head
endfunction
function! airline#extensions#branch#get_head()
let head = airline#extensions#branch#head()
let winwidth = get(airline#parts#get('branch'), 'minwidth', 120)
let minwidth = empty(get(b:, 'airline_hunks', '')) ? 14 : 7
let head = airline#util#shorten(head, winwidth, minwidth)
let symbol = get(g:, 'airline#extensions#branch#symbol', g:airline_symbols.branch)
return empty(head)
\ ? get(g:, 'airline#extensions#branch#empty_message', '')
\ : printf('%s%s', empty(symbol) ? '' : symbol.(g:airline_symbols.space), head)
endfunction
function! s:reset_untracked_cache(shellcmdpost)
" shellcmdpost - whether function was called as a result of ShellCmdPost hook
if !exists('#airline')
" airline disabled
return
endif
if !g:airline#init#vim_async && !has('nvim')
if a:shellcmdpost
" Clear cache only if there was no error or the script uses an
" asynchronous interface. Otherwise, cache clearing would overwrite
" v:shell_error with a system() call inside get_*_untracked.
if v:shell_error
return
endif
endif
endif
let file = expand("%:p")
for vcs in keys(s:vcs_config)
" Dump the value of the cache for the current file. Partially mitigates the
" issue of cache invalidation happening before a call to
" s:update_untracked()
call airline#extensions#branch#update_untracked_config(file, vcs)
let s:vcs_config[vcs].untracked = {}
endfor
endfunction
function! s:sh_autocmd_handler()
if exists('#airline')
unlet! b:airline_head b:airline_do_mq_check
endif
endfunction
function! airline#extensions#branch#init(ext)
call airline#parts#define_function('branch', 'airline#extensions#branch#get_head')
autocmd ShellCmdPost,CmdwinLeave * call s:sh_autocmd_handler()
autocmd User AirlineBeforeRefresh call s:sh_autocmd_handler()
autocmd BufWritePost * call s:reset_untracked_cache(0)
autocmd ShellCmdPost * call s:reset_untracked_cache(1)
endfunction

View File

@@ -0,0 +1,28 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/bling/vim-bufferline
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('*bufferline#get_status_string')
finish
endif
function! airline#extensions#bufferline#init(ext)
if get(g:, 'airline#extensions#bufferline#overwrite_variables', 1)
highlight bufferline_selected gui=bold cterm=bold term=bold
highlight link bufferline_selected_inactive airline_c_inactive
let g:bufferline_inactive_highlight = 'airline_c'
let g:bufferline_active_highlight = 'bufferline_selected'
let g:bufferline_active_buffer_left = ''
let g:bufferline_active_buffer_right = ''
let g:bufferline_separator = g:airline_symbols.space
endif
if exists("+autochdir") && &autochdir == 1
" if 'acd' is set, vim-airline uses the path section, so we need to redefine this here as well
call airline#parts#define_raw('path', '%{bufferline#refresh_status()}'.bufferline#get_status_string())
else
call airline#parts#define_raw('file', '%{bufferline#refresh_status()}'.bufferline#get_status_string())
endif
endfunction

View File

@@ -0,0 +1,17 @@
" MIT License. Copyright (c) 2014-2021 Mathias Andersson et al.
" Plugin: https://github.com/tpope/vim-capslock
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('*CapsLockStatusline')
finish
endif
function! airline#extensions#capslock#status()
return tolower(CapsLockStatusline()) ==# '[caps]' ? get(g:, 'airline#extensions#capslock#symbol', 'CAPS') : ''
endfunction
function! airline#extensions#capslock#init(ext)
call airline#parts#define_function('capslock', 'airline#extensions#capslock#status')
endfunction

View File

@@ -0,0 +1,54 @@
" MIT License. Copyright (c) 2019-2021 Peng Guanwen et al.
" vim: et ts=2 sts=2 sw=2
" Plugin: https://github.com/neoclide/coc
scriptencoding utf-8
let s:show_coc_status = get(g:, 'airline#extensions#coc#show_coc_status', 1)
function! airline#extensions#coc#get_warning() abort
return airline#extensions#coc#get('warning')
endfunction
function! airline#extensions#coc#get_error() abort
return airline#extensions#coc#get('error')
endfunction
function! airline#extensions#coc#get(type) abort
if !exists(':CocCommand') | return '' | endif
let is_err = (a:type is# 'error')
let info = get(b:, 'coc_diagnostic_info', {})
if empty(info) | return '' | endif
let cnt = get(info, a:type, 0)
if empty(cnt) | return '' | endif
let error_symbol = get(g:, 'airline#extensions#coc#error_symbol', 'E:')
let warning_symbol = get(g:, 'airline#extensions#coc#warning_symbol', 'W:')
let error_format = get(g:, 'airline#extensions#coc#stl_format_err', '%C(L%L)')
let warning_format = get(g:, 'airline#extensions#coc#stl_format_warn', '%C(L%L)')
" replace %C with error count and %L with line number
return (is_err ? error_symbol : warning_symbol) .
\ substitute(substitute(is_err ? error_format : warning_format,
\ '%C', cnt, 'g'),
\ '%L', (info.lnums)[is_err ? 0 : 1], 'g')
endfunction
function! airline#extensions#coc#get_status() abort
" Shorten text for windows < 91 characters
let status = airline#util#shorten(get(g:, 'coc_status', ''), 91, 9)
return (s:show_coc_status ? status : '')
endfunction
function! airline#extensions#coc#get_current_function() abort
return get(b:, 'coc_current_function', '')
endfunction
function! airline#extensions#coc#init(ext) abort
call airline#parts#define_function('coc_error_count', 'airline#extensions#coc#get_error')
call airline#parts#define_function('coc_warning_count', 'airline#extensions#coc#get_warning')
call airline#parts#define_function('coc_status', 'airline#extensions#coc#get_status')
call airline#parts#define_function('coc_current_function', 'airline#extensions#coc#get_current_function')
endfunction

View File

@@ -0,0 +1,19 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/wincent/command-t
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'command_t_loaded', 0)
finish
endif
function! airline#extensions#commandt#apply(...)
if bufname('%') ==# 'GoToFile'
call airline#extensions#apply_left_override('CommandT', '')
endif
endfunction
function! airline#extensions#commandt#init(ext)
call a:ext.add_statusline_func('airline#extensions#commandt#apply')
endfunction

View File

@@ -0,0 +1,33 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling, Christian Brabandt et al.
" Plugin: https://github.com/chrisbra/csv.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_csv', 0) && !exists(':Table')
finish
endif
let s:column_display = get(g:, 'airline#extensions#csv#column_display', 'Number')
function! airline#extensions#csv#get_column()
if exists('*CSV_WCol')
if s:column_display ==# 'Name'
return '['.CSV_WCol('Name').CSV_WCol().']'
else
return '['.CSV_WCol().']'
endif
endif
return ''
endfunction
function! airline#extensions#csv#apply(...)
if &ft ==# "csv"
call airline#extensions#prepend_to_section('gutter',
\ g:airline_left_alt_sep.' %{airline#extensions#csv#get_column()}')
endif
endfunction
function! airline#extensions#csv#init(ext)
call a:ext.add_statusline_func('airline#extensions#csv#apply')
endfunction

View File

@@ -0,0 +1,82 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/ctrlpvim/ctrlp.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_ctrlp', 0)
finish
endif
let s:color_template = get(g:, 'airline#extensions#ctrlp#color_template', 'insert')
function! airline#extensions#ctrlp#generate_color_map(dark, light, white)
return {
\ 'CtrlPdark' : a:dark,
\ 'CtrlPlight' : a:light,
\ 'CtrlPwhite' : a:white,
\ 'CtrlParrow1' : [ a:light[1] , a:white[1] , a:light[3] , a:white[3] , '' ] ,
\ 'CtrlParrow2' : [ a:white[1] , a:light[1] , a:white[3] , a:light[3] , '' ] ,
\ 'CtrlParrow3' : [ a:light[1] , a:dark[1] , a:light[3] , a:dark[3] , '' ] ,
\ }
endfunction
function! airline#extensions#ctrlp#load_theme(palette)
if exists('a:palette.ctrlp')
let theme = a:palette.ctrlp
else
let s:color_template = has_key(a:palette, s:color_template) ? s:color_template : 'insert'
let theme = airline#extensions#ctrlp#generate_color_map(
\ a:palette[s:color_template]['airline_c'],
\ a:palette[s:color_template]['airline_b'],
\ a:palette[s:color_template]['airline_a'])
endif
for key in keys(theme)
call airline#highlighter#exec(key, theme[key])
endfor
endfunction
" Arguments: focus, byfname, regexp, prv, item, nxt, marked
function! airline#extensions#ctrlp#ctrlp_airline(...)
let b = airline#builder#new({'active': 1})
if a:2 == 'file'
call b.add_section_spaced('CtrlPlight', 'by fname')
endif
if a:3
call b.add_section_spaced('CtrlPlight', 'regex')
endif
if get(g:, 'airline#extensions#ctrlp#show_adjacent_modes', 1)
call b.add_section_spaced('CtrlPlight', a:4)
call b.add_section_spaced('CtrlPwhite', a:5)
call b.add_section_spaced('CtrlPlight', a:6)
else
call b.add_section_spaced('CtrlPwhite', a:5)
endif
call b.add_section_spaced('CtrlPdark', a:7)
call b.split()
call b.add_section_spaced('CtrlPdark', a:1)
call b.add_section_spaced('CtrlPdark', a:2)
call b.add_section_spaced('CtrlPlight', '%{getcwd()}')
return b.build()
endfunction
" Argument: len
function! airline#extensions#ctrlp#ctrlp_airline_status(...)
let len = '%#CtrlPdark# '.a:1
let dir = '%=%<%#CtrlParrow3#'.g:airline_right_sep.'%#CtrlPlight# '.getcwd().' %*'
return len.dir
endfunction
function! airline#extensions#ctrlp#apply(...)
" disable statusline overwrite if ctrlp already did it
return match(&statusline, 'CtrlPwhite') >= 0 ? -1 : 0
endfunction
function! airline#extensions#ctrlp#init(ext)
let g:ctrlp_status_func = {
\ 'main': 'airline#extensions#ctrlp#ctrlp_airline',
\ 'prog': 'airline#extensions#ctrlp#ctrlp_airline_status',
\ }
call a:ext.add_statusline_func('airline#extensions#ctrlp#apply')
call a:ext.add_theme_func('airline#extensions#ctrlp#load_theme')
endfunction

View File

@@ -0,0 +1,21 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/szw/vim-ctrlspace
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#ctrlspace#statusline(...) abort
let spc = g:airline_symbols.space
let l:padding = spc . spc . spc
let cs = ctrlspace#context#Configuration().Symbols.CS
let b = airline#builder#new({ 'active': 1 })
call b.add_section('airline_b', cs . l:padding . ctrlspace#api#StatuslineModeSegment(l:padding))
call b.split()
call b.add_section('airline_x', spc . ctrlspace#api#StatuslineTabSegment() . spc)
return b.build()
endfunction
function! airline#extensions#ctrlspace#init(ext) abort
let g:CtrlSpaceStatuslineFunction = "airline#extensions#ctrlspace#statusline()"
endfunction

View File

@@ -0,0 +1,126 @@
" MIT Licsense.
" Plugin: https://github.com/vheon/vim-cursormode
" Copyright (C) 2014 Andrea Cedraro <a.cedraro@gmail.com>,
" Copyright (C) 2017 Eduardo Suarez-Santana <e.suarezsantana@gmail.com>
scriptencoding utf-8
if exists('g:loaded_cursormode')
finish
endif
let g:loaded_cursormode = 1
let s:is_win = has('win32') || has('win64')
let s:is_iTerm = exists('$TERM_PROGRAM') && $TERM_PROGRAM =~# 'iTerm.app'
let s:is_AppleTerminal = exists('$TERM_PROGRAM') && $TERM_PROGRAM =~# 'Apple_Terminal'
let s:is_good = !has('gui_running') && !s:is_win && !s:is_AppleTerminal
let s:last_mode = ''
if !exists('g:cursormode_exit_mode')
let g:cursormode_exit_mode='n'
endif
function! airline#extensions#cursormode#tmux_escape(escape)
return '\033Ptmux;'.substitute(a:escape, '\\033', '\\033\\033', 'g').'\033\\'
endfunction
let s:iTerm_escape_template = '\033]Pl%s\033\\'
let s:xterm_escape_template = '\033]12;%s\007'
function! s:get_mode()
return call(get(g:, 'cursormode_mode_func', 'mode'), [])
endfunction
function! airline#extensions#cursormode#set(...)
let mode = s:get_mode()
if mode !=# s:last_mode
let s:last_mode = mode
call s:set_cursor_color_for(mode)
endif
return ''
endfunction
function! s:set_cursor_color_for(mode)
let mode = a:mode
for mode in [a:mode, a:mode.&background]
if has_key(s:color_map, mode)
try
let save_eventignore = &eventignore
set eventignore=all
let save_shelltemp = &shelltemp
set noshelltemp
silent call system(s:build_command(s:color_map[mode]))
return
finally
let &shelltemp = save_shelltemp
let &eventignore = save_eventignore
endtry
endif
endfor
endfunction
function! s:build_command(color)
if s:is_iTerm
let color = substitute(a:color, '^#', '', '')
let escape_template = s:iTerm_escape_template
else
let color = a:color
let escape_template = s:xterm_escape_template
endif
let escape = printf(escape_template, color)
if exists('$TMUX')
let escape = airline#extensions#cursormode#tmux_escape(escape)
endif
return "printf '".escape."' > /dev/tty"
endfunction
function! s:get_color_map()
if exists('g:cursormode_color_map')
return g:cursormode_color_map
endif
try
let map = g:cursormode#{g:colors_name}#color_map
return map
catch
return {
\ "nlight": "#000000",
\ "ndark": "#BBBBBB",
\ "i": "#0000BB",
\ "v": "#FF5555",
\ "V": "#BBBB00",
\ "\<C-V>": "#BB00BB",
\ }
endtry
endfunction
augroup airline#extensions#cursormode
autocmd!
autocmd VimLeave * nested call s:set_cursor_color_for(g:cursormode_exit_mode)
" autocmd VimEnter * call airline#extensions#cursormode#activate()
autocmd Colorscheme * call airline#extensions#cursormode#activate()
augroup END
function! airline#extensions#cursormode#activate()
if !exists('#airline')
" airline disabled
return
endif
let s:color_map = s:get_color_map()
call airline#extensions#cursormode#set()
endfunction
function! airline#extensions#cursormode#apply(...)
let w:airline_section_a = get(w:, 'airline_section_a', g:airline_section_a)
let w:airline_section_a .= '%{airline#extensions#cursormode#set()}'
endfunction
function! airline#extensions#cursormode#init(ext)
let s:color_map = s:get_color_map()
call a:ext.add_statusline_func('airline#extensions#cursormode#apply')
endfunction

View File

@@ -0,0 +1,97 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:section_use_groups = get(g:, 'airline#extensions#default#section_use_groupitems', 1)
let s:section_truncate_width = get(g:, 'airline#extensions#default#section_truncate_width', {
\ 'b': 79,
\ 'x': 60,
\ 'y': 80,
\ 'z': 45,
\ 'warning': 80,
\ 'error': 80,
\ })
let s:layout = get(g:, 'airline#extensions#default#layout', [
\ [ 'a', 'b', 'c' ],
\ [ 'x', 'y', 'z', 'warning', 'error' ]
\ ])
function! s:get_section(winnr, key, ...)
if has_key(s:section_truncate_width, a:key)
if airline#util#winwidth(a:winnr) < s:section_truncate_width[a:key]
return ''
endif
endif
let spc = g:airline_symbols.space
if !exists('g:airline_section_{a:key}')
return ''
endif
let text = airline#util#getwinvar(a:winnr, 'airline_section_'.a:key, g:airline_section_{a:key})
let [prefix, suffix] = [get(a:000, 0, '%('.spc), get(a:000, 1, spc.'%)')]
return empty(text) ? '' : prefix.text.suffix
endfunction
function! s:build_sections(builder, context, keys)
for key in a:keys
if (key == 'warning' || key == 'error') && !a:context.active
continue
endif
call s:add_section(a:builder, a:context, key)
endfor
endfunction
" There still is a highlighting bug when using groups %(%) in the statusline,
" deactivate it, unless it is fixed (7.4.1511)
if s:section_use_groups && (v:version >= 704 || (v:version >= 703 && has('patch81')))
function! s:add_section(builder, context, key)
let condition = (a:key is# "warning" || a:key is# "error") &&
\ (v:version == 704 && !has("patch1511"))
" i have no idea why the warning section needs special treatment, but it's
" needed to prevent separators from showing up
if ((a:key == 'error' || a:key == 'warning') && empty(s:get_section(a:context.winnr, a:key)))
return
endif
if condition
call a:builder.add_raw('%(')
endif
call a:builder.add_section('airline_'.a:key, s:get_section(a:context.winnr, a:key))
if condition
call a:builder.add_raw('%)')
endif
endfunction
else
" older version don't like the use of %(%)
function! s:add_section(builder, context, key)
if ((a:key == 'error' || a:key == 'warning') && empty(s:get_section(a:context.winnr, a:key)))
return
endif
if a:key == 'warning'
call a:builder.add_raw('%#airline_warning#'.s:get_section(a:context.winnr, a:key))
elseif a:key == 'error'
call a:builder.add_raw('%#airline_error#'.s:get_section(a:context.winnr, a:key))
else
call a:builder.add_section('airline_'.a:key, s:get_section(a:context.winnr, a:key))
endif
endfunction
endif
function! airline#extensions#default#apply(builder, context) abort
let winnr = a:context.winnr
let active = a:context.active
if airline#util#getwinvar(winnr, 'airline_render_left', active || (!active && !g:airline_inactive_collapse))
call s:build_sections(a:builder, a:context, s:layout[0])
else
let text = !empty(s:get_section(winnr, 'c')) ? s:get_section(winnr, 'c') : ' %f%m '
call a:builder.add_section('airline_c'.(a:context.bufnr), text)
endif
call a:builder.split(s:get_section(winnr, 'gutter', '', ''))
if airline#util#getwinvar(winnr, 'airline_render_right', 1)
call s:build_sections(a:builder, a:context, s:layout[1])
endif
return 1
endfunction

View File

@@ -0,0 +1,55 @@
" MIT License. Copyright (c) 2017-2021 Thomas Dy et al.
" Plugin: https://github.com/Shougo/denite.nvim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_denite', 0)
finish
endif
let s:denite_ver = (exists('*denite#get_status_mode') ? 2 : 3)
" Denite does not use vim's built-in modal editing but has a custom prompt
" that implements its own insert/normal mode so we have to handle changing the
" highlight
function! airline#extensions#denite#check_denite_mode(bufnr) abort
if &filetype !=# 'denite' && &filetype !=# 'denite-filter'
return ''
endif
if s:denite_ver == 3
let mode = split(denite#get_status("mode"), ' ')
else
let mode = split(denite#get_status_mode(), ' ')
endif
let mode = tolower(get(mode, 1, ''))
if !exists('b:denite_mode_cache') || mode != b:denite_mode_cache
call airline#highlighter#highlight([mode], a:bufnr)
let b:denite_mode_cache = mode
endif
return ''
endfunction
function! airline#extensions#denite#apply(...) abort
if &filetype ==# 'denite' || &filetype ==# 'denite-filter'
let w:airline_skip_empty_sections = 0
call a:1.add_section('airline_a', ' Denite %{airline#extensions#denite#check_denite_mode('.a:2['bufnr'].')}')
if s:denite_ver == 3
call a:1.add_section('airline_c', ' %{denite#get_status("sources")}')
call a:1.split()
call a:1.add_section('airline_y', ' %{denite#get_status("path")} ')
call a:1.add_section('airline_z', ' %{denite#get_status("linenr")} ')
else
call a:1.add_section('airline_c', ' %{denite#get_status_sources()}')
call a:1.split()
call a:1.add_section('airline_y', ' %{denite#get_status_path()} ')
call a:1.add_section('airline_z', ' %{denite#get_status_linenr()} ')
endif
return 1
endif
endfunction
function! airline#extensions#denite#init(ext) abort
call denite#custom#option('_', 'statusline', 0)
call a:ext.add_statusline_func('airline#extensions#denite#apply')
endfunction

View File

@@ -0,0 +1,36 @@
" MIT Licsense
" Plugin: https://github.com/justinmk/vim-dirvish
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_dirvish', 0)
finish
endif
let s:spc = g:airline_symbols.space
function! airline#extensions#dirvish#init(ext) abort
call a:ext.add_statusline_func('airline#extensions#dirvish#apply')
endfunction
function! airline#extensions#dirvish#apply(...) abort
if &filetype ==# 'dirvish' && exists('b:dirvish')
let w:airline_section_a = 'Dirvish'
let w:airline_section_b = exists('*airline#extensions#branch#get_head')
\ ? '%{airline#extensions#branch#get_head()}'
\ : ''
let w:airline_section_c = '%{b:dirvish._dir}'
let w:airline_section_x = ''
let w:airline_section_y = ''
let current_column_regex = ':%\dv'
let w:airline_section_z = join(filter(
\ split(get(w:, 'airline_section_z', g:airline_section_z)),
\ 'v:val !~ current_column_regex'
\ ))
endif
endfunction

View File

@@ -0,0 +1,62 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" PLugin: https://eclim.org
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':ProjectCreate')
finish
endif
function! airline#extensions#eclim#creat_line(...)
if &filetype == "tree"
let builder = a:1
call builder.add_section('airline_a', ' Project ')
call builder.add_section('airline_b', ' %f ')
call builder.add_section('airline_c', '')
return 1
endif
endfunction
function! airline#extensions#eclim#get_warnings()
" Cache vavlues, so that it isn't called too often
if exists("s:eclim_errors") &&
\ get(b:, 'airline_changenr', 0) == changenr()
return s:eclim_errors
endif
let eclimList = eclim#display#signs#GetExisting()
let s:eclim_errors = ''
if !empty(eclimList)
" Remove any non-eclim signs (see eclim#display#signs#Update)
" First check for just errors since they are more important.
" If there are no errors, then check for warnings.
let errorList = filter(copy(eclimList), 'v:val.name =~ "^\\(qf_\\)\\?\\(error\\)$"')
if (empty(errorList))
" use the warnings
call filter(eclimList, 'v:val.name =~ "^\\(qf_\\)\\?\\(warning\\)$"')
let type = 'W'
else
" Use the errors
let eclimList = errorList
let type = 'E'
endif
if !empty(eclimList)
let errorsLine = eclimList[0]['line']
let errorsNumber = len(eclimList)
let errors = "[Eclim:" . type . " line:".string(errorsLine)." (".string(errorsNumber).")]"
if !exists(':SyntasticCheck') || SyntasticStatuslineFlag() == ''
let s:eclim_errors = errors.(g:airline_symbols.space)
endif
endif
endif
let b:airline_changenr = changenr()
return s:eclim_errors
endfunction
function! airline#extensions#eclim#init(ext)
call airline#parts#define_function('eclim', 'airline#extensions#eclim#get_warnings')
call a:ext.add_statusline_func('airline#extensions#eclim#creat_line')
endfunction

View File

@@ -0,0 +1,55 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
" we don't actually want this loaded :P
finish
" Due to some potential rendering issues, the use of the `space` variable is
" recommended.
let s:spc = g:airline_symbols.space
" Extension specific variables can be defined the usual fashion.
if !exists('g:airline#extensions#example#number_of_cats')
let g:airline#extensions#example#number_of_cats = 42
endif
" First we define an init function that will be invoked from extensions.vim
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.
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 modified.
call a:ext.add_statusline_func('airline#extensions#example#apply')
" You can also add a funcref for inactive statuslines.
" call a:ext.add_inactive_statusline_func('airline#extensions#example#unapply')
endfunction
" This function will be invoked just prior to the statusline getting modified.
function! airline#extensions#example#apply(...)
" First we check for the filetype.
if &filetype == "nyancat"
" Let's say we want to append to section_c, first we check if there's
" already a window-local override, and if not, create it off of the global
" section_c.
let w:airline_section_c = get(w:, 'airline_section_c', g:airline_section_c)
" Then we just append this extension to it, optionally using separators.
let w:airline_section_c .= s:spc.g:airline_left_alt_sep.s:spc.'%{airline#extensions#example#get_cats()}'
endif
endfunction
" Finally, this function will be invoked from the statusline.
function! airline#extensions#example#get_cats()
let cats = ''
for i in range(1, g:airline#extensions#example#number_of_cats)
let cats .= ' (,,,)=(^.^)=(,,,) '
endfor
return cats
endfunction

View File

@@ -0,0 +1,36 @@
" MIT License. Copyright (c) 2013-2021
" Plugin: https://github.com/lambdalisue/fern.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_fern', 0)
finish
endif
function! airline#extensions#fern#apply(...) abort
if (&ft =~# 'fern')
let spc = g:airline_symbols.space
let fri = fern#fri#parse(expand('%f'))
call a:1.add_section('airline_a', spc.'fern'.spc)
if exists('*airline#extensions#branch#get_head')
call a:1.add_section('airline_b', spc.'%{airline#extensions#branch#get_head()}'.spc)
else
call a:1.add_section('airline_b', '')
endif
if !(fri.authority =~# '^drawer')
let abspath = substitute(fri.path, 'file://', '', '')
call a:1.add_section('airline_c', spc.fnamemodify(abspath, ':~'))
call a:1.split()
if len(get(g:, 'fern#comparators', {}))
call a:1.add_section('airline_y', spc.'%{fern#comparator}'.spc)
endif
endif
return 1
endif
endfunction
function! airline#extensions#fern#init(ext) abort
let g:fern_force_overwrite_statusline = 0
call a:ext.add_statusline_func('airline#extensions#fern#apply')
endfunction

View File

@@ -0,0 +1,61 @@
" MIT License. Copyright (c) 2017-2021 Cimbali et al
" Plugin: https://github.com/tpope/vim-fugitive
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !airline#util#has_fugitive()
finish
endif
let s:has_percent_eval = v:version > 802 || (v:version == 802 && has("patch2854"))
function! airline#extensions#fugitiveline#bufname() abort
if !exists('b:fugitive_name')
let b:fugitive_name = ''
try
if bufname('%') =~? '^fugitive:' && exists('*FugitiveReal')
let b:fugitive_name = FugitiveReal(bufname('%'))
endif
catch
endtry
endif
let fmod = (exists("+autochdir") && &autochdir) ? ':p' : ':.'
let result=''
if empty(b:fugitive_name)
if empty(bufname('%'))
return &buftype ==# 'nofile' ? '[Scratch]' : '[No Name]'
endif
return s:has_percent_eval ? '%f' : fnamemodify(bufname('%'), fmod)
else
return s:has_percent_eval ? '%f [git]' : (fnamemodify(b:fugitive_name, fmod). " [git]")
endif
endfunction
function! s:sh_autocmd_handler()
if exists('#airline')
unlet! b:fugitive_name
endif
endfunction
function! airline#extensions#fugitiveline#init(ext) abort
let prct = s:has_percent_eval ? '%' : ''
if exists("+autochdir") && &autochdir
" if 'acd' is set, vim-airline uses the path section, so we need to redefine this here as well
if get(g:, 'airline_stl_path_style', 'default') ==# 'short'
call airline#parts#define_raw('path', '%<%{'. prct. 'pathshorten(airline#extensions#fugitiveline#bufname())' . prct . '}%m')
else
call airline#parts#define_raw('path', '%<%{' . prct . 'airline#extensions#fugitiveline#bufname()' . prct . '}%m')
endif
else
if get(g:, 'airline_stl_path_style', 'default') ==# 'short'
call airline#parts#define_raw('file', '%<%{' . prct . 'pathshorten(airline#extensions#fugitiveline#bufname())' . prct . '}%m')
else
call airline#parts#define_raw('file', '%<%{' . prct . 'airline#extensions#fugitiveline#bufname()' . prct . '}%m')
endif
endif
autocmd ShellCmdPost,CmdwinLeave * call s:sh_autocmd_handler()
autocmd User AirlineBeforeRefresh call s:sh_autocmd_handler()
endfunction

View File

@@ -0,0 +1,44 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/junegunn/fzf, https://github.com/junegunn/fzf.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#fzf#init(ext) abort
" Remove the custom statusline that fzf.vim sets by removing its `FileType
" fzf` autocmd. Ideally we'd use `let g:fzf_statusline = 0`, but this
" variable is checked *before* airline#extensions#init() is called.
augroup _fzf_statusline
autocmd!
augroup END
call a:ext.add_statusline_func('airline#extensions#fzf#apply')
call a:ext.add_inactive_statusline_func('airline#extensions#fzf#inactive_apply')
endfunction
function! airline#extensions#fzf#statusline(...) abort
let spc = g:airline_symbols.space
let builder = airline#builder#new({ 'active': 1 })
call builder.add_section('airline_a', spc.'FZF'.spc)
call builder.add_section('airline_c', '')
return builder.build()
endfunction
function! airline#extensions#fzf#apply(...) abort
if &filetype ==# 'fzf'
let spc = g:airline_symbols.space
call a:1.add_section('airline_a', spc.'FZF'.spc)
call a:1.add_section('airline_c', '')
return 1
endif
endfunction
function! airline#extensions#fzf#inactive_apply(...) abort
if getbufvar(a:2.bufnr, '&filetype') ==# 'fzf'
let spc = g:airline_symbols.space
call a:1.add_section('airline_a', spc.'FZF'.spc)
call a:1.add_section('airline_c', '')
return 1
endif
endfunction

View File

@@ -0,0 +1,19 @@
" MIT License. Copyright (c) 2014-2021 Mathias Andersson et al.
" Written by Kamil Cukrowski 2020
" Plugin: https://github.com/jsfaint/gen_tags.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !(get(g:, 'loaded_gentags#gtags', 0) || get(g:, 'loaded_gentags#ctags', 0))
finish
endif
function! airline#extensions#gen_tags#status(...) abort
return gen_tags#job#is_running() != 0 ? 'Gen. gen_tags' : ''
endfunction
function! airline#extensions#gen_tags#init(ext) abort
call airline#parts#define_function('gen_tags', 'airline#extensions#gen_tags#status')
endfunction

View File

@@ -0,0 +1,28 @@
" MIT License. Copyright (c) 2013-2021
" Plugin: https://github.com/lambdalisue/gina.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_gina', 0)
finish
endif
function! airline#extensions#gina#apply(...) abort
" gina.vim seems to set b:gina_initialized = 1 in diff buffers it open,
" where get(b:, 'gina_initialized', 0) returns 1.
" In diff buffers not opened by gina.vim b:gina_initialized is not set,
" so get(b:, 'gina_initialized', 0) returns 0.
if (&ft =~# 'gina' && &ft !~# 'blame') || (&ft ==# 'diff' && get(b:, 'gina_initialized', 0))
call a:1.add_section('airline_a', ' gina ')
call a:1.add_section('airline_b', ' %{gina#component#repo#branch()} ')
call a:1.split()
call a:1.add_section('airline_y', ' staged %{gina#component#status#staged()} ')
call a:1.add_section('airline_z', ' unstaged %{gina#component#status#unstaged()} ')
return 1
endif
endfunction
function! airline#extensions#gina#init(ext) abort
let g:gina_force_overwrite_statusline = 0
call a:ext.add_statusline_func('airline#extensions#gina#apply')
endfunction

View File

@@ -0,0 +1,18 @@
" MIT License. Copyright (c) 2014-2021 Mathias Andersson et al.
" Plugin: https://github.com/mhinz/vim-grepper
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_grepper', 0)
finish
endif
function! airline#extensions#grepper#status()
let msg = grepper#statusline()
return empty(msg) ? '' : 'grepper'
endfunction
function! airline#extensions#grepper#init(ext)
call airline#parts#define_function('grepper', 'airline#extensions#grepper#status')
endfunction

View File

@@ -0,0 +1,18 @@
" MIT License. Copyright (c) 2014-2021 Mathias Andersson et al.
" Plugin: https://github.com/ludovicchabant/vim-gutentags
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_gutentags', 0)
finish
endif
function! airline#extensions#gutentags#status()
let msg = gutentags#statusline()
return empty(msg) ? '' : 'Gen. ' . msg
endfunction
function! airline#extensions#gutentags#init(ext)
call airline#parts#define_function('gutentags', 'airline#extensions#gutentags#status')
endfunction

View File

@@ -0,0 +1,149 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: vim-gitgutter, vim-signify, changesPlugin, quickfixsigns, coc-git,
" gitsigns.nvim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_signify', 0)
\ && !get(g:, 'loaded_gitgutter', 0)
\ && !get(g:, 'loaded_changes', 0)
\ && !get(g:, 'loaded_quickfixsigns', 0)
\ && !exists(':Gitsigns')
\ && !exists("*CocAction")
finish
endif
let s:non_zero_only = get(g:, 'airline#extensions#hunks#non_zero_only', 0)
let s:hunk_symbols = get(g:, 'airline#extensions#hunks#hunk_symbols', ['+', '~', '-'])
function! s:coc_git_enabled() abort
if !exists("*CocAction") ||
\ !get(g:, 'airline#extensions#hunks#coc_git', 0)
" coc-git extension is disabled by default
" unless specifically being enabled by the user
" (as requested from coc maintainer)
return 0
endif
return 1
endfunction
function! s:parse_hunk_status_dict(hunks) abort
let result = [0, 0, 0]
let result[0] = get(a:hunks, 'added', 0)
let result[1] = get(a:hunks, 'changed', 0)
let result[2] = get(a:hunks, 'removed', 0)
return result
endfunction
function! s:parse_hunk_status_decorated(hunks) abort
if empty(a:hunks)
return []
endif
let result = [0, 0, 0]
for val in split(a:hunks)
if val[0] is# '+'
let result[0] = val[1:] + 0
elseif val[0] is# '~'
let result[1] = val[1:] + 0
elseif val[0] is# '-'
let result[2] = val[1:] + 0
endif
endfor
return result
endfunction
function! s:get_hunks_signify() abort
let hunks = sy#repo#get_stats()
if hunks[0] >= 0
return hunks
endif
return []
endfunction
function! s:get_hunks_gitgutter() abort
let hunks = GitGutterGetHunkSummary()
return hunks == [0, 0, 0] ? [] : hunks
endfunction
function! s:get_hunks_changes() abort
let hunks = changes#GetStats()
return hunks == [0, 0, 0] ? [] : hunks
endfunction
function! s:get_hunks_gitsigns() abort
let hunks = get(b:, 'gitsigns_status_dict', {})
return s:parse_hunk_status_dict(hunks)
endfunction
function! s:get_hunks_coc() abort
let hunks = get(b:, 'coc_git_status', '')
return s:parse_hunk_status_decorated(hunks)
endfunction
function! s:get_hunks_empty() abort
return ''
endfunction
function! airline#extensions#hunks#get_raw_hunks() abort
if !exists('b:source_func') || get(b:, 'source_func', '') is# 's:get_hunks_empty'
if get(g:, 'loaded_signify') && sy#buffer_is_active()
let b:source_func = 's:get_hunks_signify'
elseif exists('*GitGutterGetHunkSummary') && get(g:, 'gitgutter_enabled')
let b:source_func = 's:get_hunks_gitgutter'
elseif exists('*changes#GetStats')
let b:source_func = 's:get_hunks_changes'
elseif exists('*quickfixsigns#vcsdiff#GetHunkSummary')
let b:source_func = 'quickfixsigns#vcsdiff#GetHunkSummary'
elseif exists(':Gitsigns')
let b:source_func = 's:get_hunks_gitsigns'
elseif s:coc_git_enabled()
let b:source_func = 's:get_hunks_coc'
else
let b:source_func = 's:get_hunks_empty'
endif
endif
return {b:source_func}()
endfunction
function! airline#extensions#hunks#get_hunks() abort
if !get(w:, 'airline_active', 0)
return ''
endif
" Cache values, so that it isn't called too often
if exists("b:airline_hunks") &&
\ get(b:, 'airline_changenr', 0) == b:changedtick &&
\ airline#util#winwidth() == get(s:, 'airline_winwidth', 0) &&
\ get(b:, 'source_func', '') isnot# 's:get_hunks_signify' &&
\ get(b:, 'source_func', '') isnot# 's:get_hunks_gitgutter' &&
\ get(b:, 'source_func', '') isnot# 's:get_hunks_empty' &&
\ get(b:, 'source_func', '') isnot# 's:get_hunks_changes' &&
\ get(b:, 'source_func', '') isnot# 's:get_hunks_gitsigns' &&
\ get(b:, 'source_func', '') isnot# 's:get_hunks_coc'
return b:airline_hunks
endif
let hunks = airline#extensions#hunks#get_raw_hunks()
let string = ''
let winwidth = get(airline#parts#get('hunks'), 'minwidth', 100)
if !empty(hunks)
" hunks should contain [added, changed, deleted]
for i in [0, 1, 2]
if (s:non_zero_only == 0 && airline#util#winwidth() > winwidth) || hunks[i] > 0
let string .= printf('%s%s ', s:hunk_symbols[i], hunks[i])
endif
endfor
endif
if index(airline#extensions#get_loaded_extensions(), 'branch') == -1 && string[-1:] == ' '
" branch extension not loaded, skip trailing whitespace
let string = string[0:-2]
endif
let b:airline_hunks = string
let b:airline_changenr = b:changedtick
let s:airline_winwidth = airline#util#winwidth()
return string
endfunction
function! airline#extensions#hunks#init(ext) abort
call airline#parts#define_function('hunks', 'airline#extensions#hunks#get_hunks')
endfunction

View File

@@ -0,0 +1,31 @@
" MIT License. Copyright (c) 2013-2021 Doron Behar, C.Brabandt et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !has('keymap')
finish
endif
function! airline#extensions#keymap#status()
if (get(g:, 'airline#extensions#keymap#enabled', 1) && has('keymap'))
let short_codes = get(g:, 'airline#extensions#keymap#short_codes', {})
let label = get(g:, 'airline#extensions#keymap#label', g:airline_symbols.keymap)
let default = get(g:, 'airline#extensions#keymap#default', '')
if (label !=# '')
let label .= ' '
endif
let keymap = &keymap
if has_key(short_codes, keymap)
let keymap = short_codes[keymap]
endif
return printf('%s', (!empty(keymap) && &iminsert ? (label . keymap) :
\ (!empty(default) ? label . default : default)))
else
return ''
endif
endfunction
function! airline#extensions#keymap#init(ext)
call airline#parts#define_function('keymap', 'airline#extensions#keymap#status')
endfunction

View File

@@ -0,0 +1,113 @@
" MIT License. Copyright (c) 2013-2021 Bjorn Neergaard, hallettj et al.
" Plugin: https://github.com/autozimu/LanguageClient-neovim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:error_symbol = get(g:, 'airline#extensions#languageclient#error_symbol', 'E:')
let s:warning_symbol = get(g:, 'airline#extensions#languageclient#warning_symbol', 'W:')
let s:show_line_numbers = get(g:, 'airline#extensions#languageclient#show_line_numbers', 1)
" Severity codes from the LSP spec
let s:severity_error = 1
let s:severity_warning = 2
let s:severity_info = 3
let s:severity_hint = 4
" After each LanguageClient state change `s:diagnostics` will be populated with
" a map from file names to lists of errors, warnings, informational messages,
" and hints.
let s:diagnostics = {}
function! s:languageclient_refresh()
if get(g:, 'airline_skip_empty_sections', 0)
exe ':AirlineRefresh!'
endif
endfunction
function! s:record_diagnostics(state)
" The returned message might not have the 'result' key
if has_key(a:state, 'result')
let result = json_decode(a:state.result)
let s:diagnostics = result.diagnostics
endif
call s:languageclient_refresh()
endfunction
function! s:get_diagnostics()
if !exists('#airline')
" airline disabled
return
endif
call LanguageClient#getState(function("s:record_diagnostics"))
endfunction
function! s:diagnostics_for_buffer()
return get(s:diagnostics, expand('%:p'), [])
endfunction
function! s:airline_languageclient_count(cnt, symbol)
return a:cnt ? a:symbol. a:cnt : ''
endfunction
function! s:airline_languageclient_get_line_number(type) abort
let linenumber_of_first_problem = 0
for d in s:diagnostics_for_buffer()
if has_key(d, 'severity') && d.severity == a:type
let linenumber_of_first_problem = d.range.start.line
break
endif
endfor
if linenumber_of_first_problem == 0
return ''
endif
let open_lnum_symbol = get(g:, 'airline#extensions#languageclient#open_lnum_symbol', '(L')
let close_lnum_symbol = get(g:, 'airline#extensions#languageclient#close_lnum_symbol', ')')
return open_lnum_symbol . linenumber_of_first_problem . close_lnum_symbol
endfunction
function! airline#extensions#languageclient#get(type)
if get(b:, 'LanguageClient_isServerRunning', 0) ==# 0
return ''
endif
let is_err = a:type == s:severity_error
let symbol = is_err ? s:error_symbol : s:warning_symbol
let cnt = 0
for d in s:diagnostics_for_buffer()
if has_key(d, 'severity') && d.severity == a:type
let cnt += 1
endif
endfor
if cnt == 0
return ''
endif
if s:show_line_numbers == 1
return s:airline_languageclient_count(cnt, symbol) . <sid>airline_languageclient_get_line_number(a:type)
else
return s:airline_languageclient_count(cnt, symbol)
endif
endfunction
function! airline#extensions#languageclient#get_warning()
return airline#extensions#languageclient#get(s:severity_warning)
endfunction
function! airline#extensions#languageclient#get_error()
return airline#extensions#languageclient#get(s:severity_error)
endfunction
function! airline#extensions#languageclient#init(ext)
call airline#parts#define_function('languageclient_error_count', 'airline#extensions#languageclient#get_error')
call airline#parts#define_function('languageclient_warning_count', 'airline#extensions#languageclient#get_warning')
augroup airline_languageclient
autocmd!
autocmd User LanguageClientDiagnosticsChanged call <sid>get_diagnostics()
augroup END
endfunction

View File

@@ -0,0 +1,41 @@
" MIT License. Copyright (c) 2018-2021 mox et al.
" Plugin: https://github.com/mox-mox/vim-localsearch
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:enabled = get(g:, 'airline#extensions#localsearch#enabled', 1)
if !get(g:, 'loaded_localsearch', 0) || !s:enabled || get(g:, 'airline#extensions#localsearch#loaded', 0)
finish
endif
let g:airline#extensions#localsearch#loaded = 001
let s:spc = g:airline_symbols.space
let g:airline#extensions#localsearch#inverted = get(g:, 'airline#extensions#localsearch#inverted', 0)
function! airline#extensions#localsearch#load_theme(palette) abort
call airline#highlighter#exec('localsearch_dark', [ '#ffffff' , '#000000' , 15 , 1 , ''])
endfunction
function! airline#extensions#localsearch#init(ext) abort
call a:ext.add_theme_func('airline#extensions#localsearch#load_theme')
call a:ext.add_statusline_func('airline#extensions#localsearch#apply')
endfunction
function! airline#extensions#localsearch#apply(...) abort
" first variable is the statusline builder
let builder = a:1
""""" WARNING: the API for the builder is not finalized and may change
if exists('#localsearch#WinEnter') && !g:airline#extensions#localsearch#inverted " If localsearch mode is enabled and 'invert' option is false
call builder.add_section('localsearch_dark', s:spc.airline#section#create('LS').s:spc)
endif
if !exists('#localsearch#WinEnter') && g:airline#extensions#localsearch#inverted " If localsearch mode is disabled and 'invert' option is true
call builder.add_section('localsearch_dark', s:spc.airline#section#create('GS').s:spc)
endif
return 0
endfunction

View File

@@ -0,0 +1,111 @@
" MIT License. Copyright (c) 2013-2021 François-Xavier Carton et al.
" Plugin: https://github.com/prabirshrestha/vim-lsp
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'lsp_loaded', 0)
finish
endif
function! s:airline_lsp_count(cnt, symbol) abort
return a:cnt ? a:symbol. a:cnt : ''
endfunction
function! s:airline_lsp_get_line_number(cnt, type) abort
let result = ''
if a:type ==# 'error'
let result = lsp#get_buffer_first_error_line()
endif
if empty(result)
return ''
endif
let open_lnum_symbol =
\ get(g:, 'airline#extensions#lsp#open_lnum_symbol', '(L')
let close_lnum_symbol =
\ get(g:, 'airline#extensions#lsp#close_lnum_symbol', ')')
return open_lnum_symbol . result . close_lnum_symbol
endfunction
function! airline#extensions#lsp#get(type) abort
if !exists(':LspDeclaration')
return ''
endif
let error_symbol = get(g:, 'airline#extensions#lsp#error_symbol', 'E:')
let warning_symbol = get(g:, 'airline#extensions#lsp#warning_symbol', 'W:')
let show_line_numbers = get(g:, 'airline#extensions#lsp#show_line_numbers', 1)
let is_err = a:type ==# 'error'
let symbol = is_err ? error_symbol : warning_symbol
let num = lsp#get_buffer_diagnostics_counts()[a:type]
if show_line_numbers == 1
return s:airline_lsp_count(num, symbol) . <sid>airline_lsp_get_line_number(num, a:type)
else
return s:airline_lsp_count(num, symbol)
endif
endfunction
function! airline#extensions#lsp#get_warning() abort
return airline#extensions#lsp#get('warning')
endfunction
function! airline#extensions#lsp#get_error() abort
return airline#extensions#lsp#get('error')
endfunction
let s:lsp_progress = []
function! airline#extensions#lsp#progress() abort
if get(w:, 'airline_active', 0)
if exists('*lsp#get_progress')
let s:lsp_progress = lsp#get_progress()
if len(s:lsp_progress) == 0 | return '' | endif
" show only most new progress
let s:lsp_progress = s:lsp_progress[0]
if s:lsp_progress['message'] !=# ''
let percent = ''
if has_key(s:lsp_progress, 'percentage') && s:lsp_progress['percentage'] >= 0
let percent = ' ' . string(s:lsp_progress['percentage']) . '%'
endif
let s:title = s:lsp_progress['title']
let message = airline#util#shorten(s:lsp_progress['message'] . percent, 91, 9)
return s:lsp_progress['server'] . ': ' . s:title . ' ' . message
endif
endif
endif
return ''
endfunction
let s:timer = 0
let s:ignore_time = 0
function! airline#extensions#lsp#update() abort
if !exists('#airline')
" airline disabled
return
endif
if reltimefloat(reltime()) - s:ignore_time >=
\ get(g:, 'airline#extensions#lsp#progress_skip_time', 0.3)
\ || len(s:lsp_progress) == 0
call airline#update_statusline()
let s:ignore_time = reltimefloat(reltime())
endif
endfunction
function! airline#extensions#lsp#init(ext) abort
call airline#parts#define_function('lsp_error_count', 'airline#extensions#lsp#get_error')
call airline#parts#define_function('lsp_warning_count', 'airline#extensions#lsp#get_warning')
call airline#parts#define_function('lsp_progress', 'airline#extensions#lsp#progress')
augroup airline_lsp_progress
autocmd!
autocmd User lsp_progress_updated call airline#extensions#lsp#update()
augroup END
endfunction

View File

@@ -0,0 +1,37 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/neomake/neomake
" vim: et ts=2 sts=2 sw=2
if !exists(':Neomake')
finish
endif
let s:error_symbol = get(g:, 'airline#extensions#neomake#error_symbol', 'E:')
let s:warning_symbol = get(g:, 'airline#extensions#neomake#warning_symbol', 'W:')
function! s:get_counts()
let l:counts = neomake#statusline#LoclistCounts()
if empty(l:counts)
return neomake#statusline#QflistCounts()
else
return l:counts
endif
endfunction
function! airline#extensions#neomake#get_warnings()
let counts = s:get_counts()
let warnings = get(counts, 'W', 0)
return warnings ? s:warning_symbol.warnings : ''
endfunction
function! airline#extensions#neomake#get_errors()
let counts = s:get_counts()
let errors = get(counts, 'E', 0)
return errors ? s:error_symbol.errors : ''
endfunction
function! airline#extensions#neomake#init(ext)
call airline#parts#define_function('neomake_warning_count', 'airline#extensions#neomake#get_warnings')
call airline#parts#define_function('neomake_error_count', 'airline#extensions#neomake#get_errors')
endfunction

View File

@@ -0,0 +1,35 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: http://www.drchip.org/astronaut/vim/#NETRW
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':NetrwSettings')
finish
endif
function! airline#extensions#netrw#apply(...)
if &ft == 'netrw'
let spc = g:airline_symbols.space
call a:1.add_section('airline_a', spc.'netrw'.spc)
if exists('*airline#extensions#branch#get_head')
call a:1.add_section('airline_b', spc.'%{airline#extensions#branch#get_head()}'.spc)
endif
call a:1.add_section('airline_c', spc.'%f'.spc)
call a:1.split()
call a:1.add_section('airline_y', spc.'%{airline#extensions#netrw#sortstring()}'.spc)
return 1
endif
endfunction
function! airline#extensions#netrw#init(ext)
let g:netrw_force_overwrite_statusline = 0
call a:ext.add_statusline_func('airline#extensions#netrw#apply')
endfunction
function! airline#extensions#netrw#sortstring()
let order = (get(g:, 'netrw_sort_direction', 'n') =~ 'n') ? '+' : '-'
return get(g:, 'netrw_sort_by', '') . (g:airline_symbols.space) . '[' . order . ']'
endfunction

View File

@@ -0,0 +1,58 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling, Christian Brabandt et al.
" Plugin: https://github.com/chrisbra/NrrwRgn
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_nrrw_rgn', 0)
finish
endif
function! airline#extensions#nrrwrgn#apply(...)
if exists(":WidenRegion") == 2
let spc = g:airline_symbols.space
if !exists("*nrrwrgn#NrrwRgnStatus()") || empty(nrrwrgn#NrrwRgnStatus())
call a:1.add_section('airline_a', printf('%s[Narrowed%s#%d]', spc, spc, b:nrrw_instn))
let bufname=(get(b:, 'orig_buf', 0) ? bufname(b:orig_buf) : substitute(bufname('%'), '^Nrrwrgn_\zs.*\ze_\d\+$', submatch(0), ''))
call a:1.add_section('airline_c', spc.bufname.spc)
call a:1.split()
else
let dict=nrrwrgn#NrrwRgnStatus()
let vmode = { 'v': 'Char ', 'V': 'Line ', '': 'Block '}
let mode = dict.visual ? vmode[dict.visual] : vmode['V']
let winwidth = airline#util#winwidth()
if winwidth < 80
let mode = mode[0]
endif
let title = (winwidth < 80 ? "Nrrw" : "Narrowed ")
let multi = (winwidth < 80 ? 'M' : 'Multi')
call a:1.add_section('airline_a', printf('[%s%s%s#%d]%s', (dict.multi ? multi : ""),
\ title, mode, b:nrrw_instn, spc))
let name = dict.fullname
if name !=# '[No Name]'
if winwidth > 100
" need some space
let name = fnamemodify(dict.fullname, ':~')
if strlen(name) > 8
" shorten name
let name = substitute(name, '\(.\)[^/\\]*\([/\\]\)', '\1\2', 'g')
endif
else
let name = fnamemodify(dict.fullname, ':t')
endif
endif
let range=(dict.multi ? '' : printf("[%d-%d]", dict.start[1], dict.end[1]))
call a:1.add_section('airline_c', printf("%s %s %s", name, range,
\ dict.enabled ? (&encoding ==? 'utf-8' ? "\u2713" : '') : '!'))
call a:1.split()
call a:1.add_section('airline_x', get(g:, 'airline_section_x').spc)
call a:1.add_section('airline_y', spc.get(g:, 'airline_section_y').spc)
call a:1.add_section('airline_z', spc.get(g:, 'airline_section_z'))
endif
return 1
endif
endfunction
function! airline#extensions#nrrwrgn#init(ext)
call a:ext.add_statusline_func('airline#extensions#nrrwrgn#apply')
endfunction

View File

@@ -0,0 +1,69 @@
" Apache 2.0 license. Copyright (c) 2019-2021 Copyright Neovim contributors.
" Plugin: https://github.com/neovim/nvim-lsp
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !(get(g:, 'airline#extensions#nvimlsp#enabled', 1)
\ && has('nvim')
\ && luaeval('vim.lsp ~= nil'))
finish
endif
function! s:airline_nvimlsp_count(cnt, symbol) abort
return a:cnt ? a:symbol. a:cnt : ''
endfunction
function! airline#extensions#nvimlsp#get(type) abort
if luaeval('vim.tbl_isempty(vim.lsp.buf_get_clients(0))')
return ''
endif
let error_symbol = get(g:, 'airline#extensions#nvimlsp#error_symbol', 'E:')
let warning_symbol = get(g:, 'airline#extensions#nvimlsp#warning_symbol', 'W:')
let show_line_numbers = get(g:, 'airline#extensions#nvimlsp#show_line_numbers', 1)
let is_err = a:type ==# 'Error'
let symbol = is_err ? error_symbol : warning_symbol
if luaeval("pcall(require, 'vim.diagnostic')")
let severity = a:type == 'Warning' ? 'Warn' : a:type
let num = len(v:lua.vim.diagnostic.get(0, { 'severity': severity }))
elseif luaeval("pcall(require, 'vim.lsp.diagnostic')")
let num = v:lua.vim.lsp.diagnostic.get_count(0, a:type)
else
let num = v:lua.vim.lsp.util.buf_diagnostics_count(a:type)
endif
if show_line_numbers == 1 && luaeval("pcall(require, 'vim.diagnostic')") && num > 0
return s:airline_nvimlsp_count(num, symbol) . <sid>airline_nvimlsp_get_line_number(num, a:type)
else
return s:airline_nvimlsp_count(num, symbol)
endif
endfunction
function! s:airline_nvimlsp_get_line_number(cnt, type) abort
let severity = a:type == 'Warning' ? 'Warn' : a:type
let num = v:lua.vim.diagnostic.get(0, { 'severity': severity })[0].lnum
let l:open_lnum_symbol =
\ get(g:, 'airline#extensions#nvimlsp#open_lnum_symbol', '(L')
let l:close_lnum_symbol =
\ get(g:, 'airline#extensions#nvimlsp#close_lnum_symbol', ')')
return open_lnum_symbol . num . close_lnum_symbol
endfunction
function! airline#extensions#nvimlsp#get_warning() abort
return airline#extensions#nvimlsp#get('Warning')
endfunction
function! airline#extensions#nvimlsp#get_error() abort
return airline#extensions#nvimlsp#get('Error')
endfunction
function! airline#extensions#nvimlsp#init(ext) abort
call airline#parts#define_function('nvimlsp_error_count', 'airline#extensions#nvimlsp#get_error')
call airline#parts#define_function('nvimlsp_warning_count', 'airline#extensions#nvimlsp#get_warning')
endfunction

View File

@@ -0,0 +1,23 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/tpope/vim-obsession
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('*ObsessionStatus')
finish
endif
let s:spc = g:airline_symbols.space
if !exists('g:airline#extensions#obsession#indicator_text')
let g:airline#extensions#obsession#indicator_text = '$'
endif
function! airline#extensions#obsession#init(ext)
call airline#parts#define_function('obsession', 'airline#extensions#obsession#get_status')
endfunction
function! airline#extensions#obsession#get_status()
return ObsessionStatus((g:airline#extensions#obsession#indicator_text . s:spc), '')
endfunction

View File

@@ -0,0 +1,45 @@
" MIT License
" Plugin: https://github.com/OmniSharp/omnisharp-vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'OmniSharp_loaded', 0)
finish
endif
function! airline#extensions#omnisharp#server_status(...) abort
if !exists(':OmniSharpGotoDefinition') || !get(g:, 'OmniSharp_server_stdio', 0)
return ''
endif
let host = OmniSharp#GetHost(bufnr('%'))
if type(host.job) != v:t_dict || get(host.job, 'stopped')
return ''
endif
let sln = fnamemodify(host.sln_or_dir, ':t')
if get(host.job, 'loaded', 0)
return sln
endif
try
let projectsloaded = OmniSharp#project#CountLoaded()
let projectstotal = OmniSharp#project#CountTotal()
catch
" The CountLoaded and CountTotal functions are very new - catch the error
" when they don't exist
let projectsloaded = 0
let projectstotal = 0
endtry
return printf('%s(%d/%d)', sln, projectsloaded, projectstotal)
endfunction
function! airline#extensions#omnisharp#init(ext) abort
call airline#parts#define_function('omnisharp', 'airline#extensions#omnisharp#server_status')
augroup airline_omnisharp
autocmd!
autocmd User OmniSharpStarted,OmniSharpReady,OmniSharpStopped AirlineRefresh!
augroup END
endfunction

View File

@@ -0,0 +1,105 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling, Christian Brabandt et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#po#shorten()
" Format and shorte the output of msgfmt
let b:airline_po_stats = substitute(get(b:, 'airline_po_stats', ''), ' \(message\|translation\)s*\.*', '', 'g')
let b:airline_po_stats = substitute(b:airline_po_stats, ', ', '/', 'g')
if exists("g:airline#extensions#po#displayed_limit")
let w:displayed_po_limit = g:airline#extensions#po#displayed_limit
if len(b:airline_po_stats) > w:displayed_po_limit - 1
let b:airline_po_stats = b:airline_po_stats[0:(w:displayed_po_limit - 2)].(&encoding==?'utf-8' ? '…' : '.')
endif
endif
if strlen(get(b:, 'airline_po_stats', '')) >= 30 && airline#util#winwidth() < 150
let fuzzy = ''
let untranslated = ''
let messages = ''
" Shorten [120 translated, 50 fuzzy, 4 untranslated] to [120T/50F/4U]
if b:airline_po_stats =~ 'fuzzy'
let fuzzy = substitute(b:airline_po_stats, '.\{-}\(\d\+\) fuzzy.*', '\1F', '')
if fuzzy == '0F'
let fuzzy = ''
endif
endif
if b:airline_po_stats =~ 'untranslated'
let untranslated = substitute(b:airline_po_stats, '.\{-}\(\d\+\) untranslated.*', '\1U', '')
if untranslated == '0U'
let untranslated = ''
endif
endif
let messages = substitute(b:airline_po_stats, '\(\d\+\) translated.*', '\1T', '')
if messages ==# '0T'
let messages = ''
endif
let b:airline_po_stats = printf('%s%s%s', fuzzy, (empty(fuzzy) || empty(untranslated) ? '' : '/'), untranslated)
if strlen(b:airline_po_stats) < 10
let b:airline_po_stats = messages. (!empty(b:airline_po_stats) && !empty(messages) ? '/':''). b:airline_po_stats
endif
endif
let b:airline_po_stats = '['.b:airline_po_stats. '] '
endfunction
function! airline#extensions#po#on_winenter()
if !exists('#airline')
" airline disabled
return
endif
" only reset cache, if the window size changed
if get(b:, 'airline_winwidth', 0) != airline#util#winwidth()
let b:airline_winwidth = airline#util#winwidth()
" needs re-formatting
unlet! b:airline_po_stats
endif
endfunction
function! s:autocmd_handler()
if exists('#airline')
unlet! b:airline_po_stats
endif
endfunction
function! airline#extensions#po#apply(...)
if &ft ==# 'po'
call airline#extensions#prepend_to_section('z', '%{airline#extensions#po#stats()}')
" Also reset the cache variable, if a window has been split, e.g. the winwidth changed
autocmd airline BufWritePost * call s:autocmd_handler()
autocmd airline WinEnter * call airline#extensions#po#on_winenter()
endif
endfunction
function! airline#extensions#po#stats()
if exists('b:airline_po_stats') && !empty(b:airline_po_stats)
return b:airline_po_stats
endif
" Write stdout to null because we only want to see warnings.
if g:airline#init#is_windows
let cmd = 'msgfmt --statistics -o /NUL '
else
let cmd = 'msgfmt --statistics -o /dev/null -- '
endif
if g:airline#init#vim_async
call airline#async#get_msgfmt_stat(cmd, expand('%:p'))
elseif has("nvim")
call airline#async#nvim_get_msgfmt_stat(cmd, expand('%:p'))
else
let airline_po_stats = system(cmd. shellescape(expand('%:p')))
if v:shell_error
return ''
endif
try
let b:airline_po_stats = split(airline_po_stats, '\n')[0]
catch
let b:airline_po_stats = ''
endtry
call airline#extensions#po#shorten()
endif
return get(b:, 'airline_po_stats', '')
endfunction
function! airline#extensions#po#init(ext)
call a:ext.add_statusline_func('airline#extensions#po#apply')
endfunction

View File

@@ -0,0 +1,32 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/petobens/poet_v
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:spc = g:airline_symbols.space
function! airline#extensions#poetv#init(ext)
call a:ext.add_statusline_func('airline#extensions#poetv#apply')
endfunction
function! airline#extensions#poetv#apply(...)
if &filetype =~# 'python'
if get(g:, 'poetv_loaded', 0)
let statusline = poetv#statusline()
else
let statusline = fnamemodify($VIRTUAL_ENV, ':t')
endif
if !empty(statusline)
call airline#extensions#append_to_section('x',
\ s:spc.g:airline_right_alt_sep.s:spc.statusline)
endif
endif
endfunction
function! airline#extensions#poetv#update()
if &filetype =~# 'python'
call airline#extensions#poetv#apply()
call airline#update_statusline()
endif
endfunction

View File

@@ -0,0 +1,36 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/edkolev/promptline.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':PromptlineSnapshot')
finish
endif
if !exists('airline#extensions#promptline#snapshot_file') || !len('airline#extensions#promptline#snapshot_file')
finish
endif
let s:prompt_snapshot_file = get(g:, 'airline#extensions#promptline#snapshot_file', '')
let s:color_template = get(g:, 'airline#extensions#promptline#color_template', 'normal')
function! airline#extensions#promptline#init(ext)
call a:ext.add_theme_func('airline#extensions#promptline#set_prompt_colors')
endfunction
function! airline#extensions#promptline#set_prompt_colors(palette)
let color_template = has_key(a:palette, s:color_template) ? s:color_template : 'normal'
let mode_palette = a:palette[color_template]
if !has_key(g:, 'promptline_symbols')
let g:promptline_symbols = {
\ 'left' : g:airline_left_sep,
\ 'right' : g:airline_right_sep,
\ 'left_alt' : g:airline_left_alt_sep,
\ 'right_alt' : g:airline_right_alt_sep}
endif
let promptline_theme = promptline#api#create_theme_from_airline(mode_palette)
call promptline#api#create_snapshot_with_theme(s:prompt_snapshot_file, promptline_theme)
endfunction

View File

@@ -0,0 +1,58 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('g:airline#extensions#quickfix#quickfix_text')
let g:airline#extensions#quickfix#quickfix_text = 'Quickfix'
endif
if !exists('g:airline#extensions#quickfix#location_text')
let g:airline#extensions#quickfix#location_text = 'Location'
endif
function! airline#extensions#quickfix#apply(...)
if &buftype == 'quickfix'
let w:airline_section_a = airline#extensions#quickfix#get_type()
let w:airline_section_b = '%{get(w:, "quickfix_title", "")}'
let w:airline_section_c = ''
let w:airline_section_x = ''
endif
endfunction
function! airline#extensions#quickfix#init(ext)
call a:ext.add_statusline_func('airline#extensions#quickfix#apply')
call a:ext.add_inactive_statusline_func('airline#extensions#quickfix#inactive_qf_window')
endfunction
function! airline#extensions#quickfix#inactive_qf_window(...)
if getbufvar(a:2.bufnr, '&filetype') is# 'qf' && !empty(airline#util#getwinvar(a:2.winnr, 'quickfix_title', ''))
call setwinvar(a:2.winnr, 'airline_section_c', '[%{get(w:, "quickfix_title", "")}] %f %m')
endif
endfunction
function! airline#extensions#quickfix#get_type()
if exists("*win_getid") && exists("*getwininfo")
let dict = getwininfo(win_getid())
if len(dict) > 0 && get(dict[0], 'quickfix', 0) && !get(dict[0], 'loclist', 0)
return g:airline#extensions#quickfix#quickfix_text
elseif len(dict) > 0 && get(dict[0], 'quickfix', 0) && get(dict[0], 'loclist', 0)
return g:airline#extensions#quickfix#location_text
endif
endif
redir => buffers
silent ls
redir END
let nr = bufnr('%')
for buf in split(buffers, '\n')
if match(buf, '\v^\s*'.nr) > -1
if match(buf, '\cQuickfix') > -1
return g:airline#extensions#quickfix#quickfix_text
else
return g:airline#extensions#quickfix#location_text
endif
endif
endfor
return ''
endfunction

View File

@@ -0,0 +1,38 @@
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('g:rufo_loaded')
finish
endif
let s:spc = g:airline_symbols.space
if !exists('g:airline#extensions#rufo#symbol')
let g:airline#extensions#rufo#symbol = 'RuFo'
endif
function! airline#extensions#rufo#init(ext)
call airline#parts#define_raw('rufo', '%{airline#extensions#rufo#get_status}')
call a:ext.add_statusline_func('airline#extensions#rufo#apply')
endfunction
function! airline#extensions#rufo#get_status()
let out = ''
if &ft == "ruby" && g:rufo_auto_formatting == 1
let out .= s:spc.g:airline_left_alt_sep.s:spc.g:airline#extensions#rufo#symbol
endif
return out
endfunction
" This function will be invoked just prior to the statusline getting modified.
function! airline#extensions#rufo#apply(...)
" First we check for the filetype.
if &filetype == "ruby"
" section_z.
let w:airline_section_z = get(w:, 'airline_section_z', g:airline_section_z)
" Then we just append this extension to it, optionally using separators.
let w:airline_section_z .= '%{airline#extensions#rufo#get_status()}'
endif
endfunction

View File

@@ -0,0 +1,37 @@
" MIT License. Copyright (c) 2013-2021
" vim: et ts=2 sts=2 sw=2 et
scriptencoding utf-8
function! airline#extensions#scrollbar#calculate() abort
if winwidth(0) > get(g:, 'airline#extensions#scrollbar#minwidth', 200)
\ && get(w:, 'airline_active', 0)
let overwrite = 0
if &encoding ==? 'utf-8' && !get(g:, 'airline_symbols_ascii', 0)
let [left, right, middle] = [ '|', '|', '█']
let overwrite = 1
else
let [left, right, middle] = [ '[', ']', '-']
endif
let spc = get(g:, 'airline_symbols.space', ' ')
let width = 20 " max width, plus one border and indicator
let perc = (line('.') + 0.0) / (line('$') + 0.0)
let before = float2nr(round(perc * width))
if before >= 0 && line('.') == 1
let before = 0
let left = (overwrite ? '' : left)
endif
let after = width - before
if (after <= 1 && line('.') == line('$'))
let after = 0
let right = (overwrite ? '' : right)
endif
return left . repeat(spc, before) . middle . repeat(spc, after) . right
else
return ''
endif
endfunction
function! airline#extensions#scrollbar#init(ext) abort
call airline#parts#define_function('scrollbar', 'airline#extensions#scrollbar#calculate')
endfunction

View File

@@ -0,0 +1,56 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" This extension is inspired by vim-anzu <https://github.com/osyo-manga/vim-anzu>.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('*searchcount')
finish
endif
function! airline#extensions#searchcount#init(ext) abort
call a:ext.add_statusline_func('airline#extensions#searchcount#apply')
endfunction
function! airline#extensions#searchcount#apply(...) abort
call airline#extensions#append_to_section('y',
\ '%{v:hlsearch ? airline#extensions#searchcount#status() : ""}')
endfunction
function! s:search_term()
let show_search_term = get(g:, 'airline#extensions#searchcount#show_search_term', 1)
let search_term_limit = get(g:, 'airline#extensions#searchcount#search_term_limit', 8)
if show_search_term == 0
return ''
endif
" shorten for all width smaller than 300 (this is just a guess)
" this uses a non-breaking space, because it looks like
" a leading space is stripped :/
return "\ua0" . '/' . airline#util#shorten(getreg('/'), 300, search_term_limit)
endfunction
function! airline#extensions#searchcount#status() abort
try
let result = searchcount(#{recompute: 1, maxcount: -1})
if empty(result) || result.total ==# 0
return ''
endif
if result.incomplete ==# 1 " timed out
return printf('%s[?/??]', s:search_term())
elseif result.incomplete ==# 2 " max count exceeded
if result.total > result.maxcount &&
\ result.current > result.maxcount
return printf('%s[>%d/>%d]', s:search_term(),
\ result.current, result.total)
elseif result.total > result.maxcount
return printf('%s[%d/>%d]', s:search_term(),
\ result.current, result.total)
endif
endif
return printf('%s[%d/%d]', s:search_term(),
\ result.current, result.total)
catch
return ''
endtry
endfunction

View File

@@ -0,0 +1,44 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/vim-syntastic/syntastic
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':SyntasticCheck')
finish
endif
let s:error_symbol = get(g:, 'airline#extensions#syntastic#error_symbol', 'E:')
let s:warning_symbol = get(g:, 'airline#extensions#syntastic#warning_symbol', 'W:')
function! airline#extensions#syntastic#get_warning()
return airline#extensions#syntastic#get('warning')
endfunction
function! airline#extensions#syntastic#get_error()
return airline#extensions#syntastic#get('error')
endfunction
function! airline#extensions#syntastic#get(type)
let _backup = get(g:, 'syntastic_stl_format', '')
let is_err = (a:type is# 'error')
if is_err
let g:syntastic_stl_format = get(g:, 'airline#extensions#syntastic#stl_format_err', '%E{[%fe(#%e)]}')
else
let g:syntastic_stl_format = get(g:, 'airline#extensions#syntastic#stl_format_warn', '%W{[%fw(#%w)]}')
endif
let cnt = SyntasticStatuslineFlag()
if !empty(_backup)
let g:syntastic_stl_format = _backup
endif
if empty(cnt)
return ''
else
return (is_err ? s:error_symbol : s:warning_symbol).cnt
endif
endfunction
function! airline#extensions#syntastic#init(ext)
call airline#parts#define_function('syntastic-warn', 'airline#extensions#syntastic#get_warning')
call airline#parts#define_function('syntastic-err', 'airline#extensions#syntastic#get_error')
endfunction

View File

@@ -0,0 +1,483 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2 et
scriptencoding utf-8
let s:taboo = get(g:, 'airline#extensions#taboo#enabled', 1) && get(g:, 'loaded_taboo', 0)
if s:taboo
let g:taboo_tabline = 0
endif
let s:ctrlspace = get(g:, 'CtrlSpaceLoaded', 0)
let s:tabws = get(g:, 'tabws_loaded', 0)
let s:current_tabcnt = -1
" Dictionary functions are not possible in Vim9 Script,
" so use the legacy Vim Script implementation
function! airline#extensions#tabline#init(ext)
if has('gui_running') && match(&guioptions, 'e') > -1
set guioptions-=e
endif
autocmd User AirlineToggledOn call s:toggle_on()
autocmd User AirlineToggledOff call s:toggle_off()
call s:toggle_on()
call a:ext.add_theme_func('airline#extensions#tabline#load_theme')
endfunction
function! airline#extensions#tabline#add_label(dict, type, right)
if get(g:, 'airline#extensions#tabline#show_tab_type', 1)
call a:dict.add_section_spaced('airline_tablabel'. (a:right ? '_right' : ''),
\ get(g:, 'airline#extensions#tabline#'.a:type.'_label', a:type))
endif
endfunction
function! airline#extensions#tabline#add_tab_label(dict)
let show_tab_count = get(g:, 'airline#extensions#tabline#show_tab_count', 1)
if show_tab_count == 2
call a:dict.add_section_spaced('airline_tabmod', printf('%s %d/%d', "tab", tabpagenr(), tabpagenr('$')))
elseif show_tab_count == 1 && tabpagenr('$') > 1
call a:dict.add_section_spaced('airline_tabmod', printf('%s %d/%d', "tab", tabpagenr(), tabpagenr('$')))
endif
endfunction
if !exists(":def") || !airline#util#has_vim9_script()
" Legacy Vim Script Implementation
function! s:toggle_off()
call airline#extensions#tabline#autoshow#off()
call airline#extensions#tabline#tabs#off()
call airline#extensions#tabline#buffers#off()
if s:ctrlspace
call airline#extensions#tabline#ctrlspace#off()
endif
if s:tabws
call airline#extensions#tabline#tabws#off()
endif
endfunction
function! s:toggle_on()
if get(g:, 'airline_statusline_ontop', 0)
call airline#extensions#tabline#enable()
let &tabline='%!airline#statusline('.winnr().')'
return
endif
call airline#extensions#tabline#autoshow#on()
call airline#extensions#tabline#tabs#on()
call airline#extensions#tabline#buffers#on()
if s:ctrlspace
call airline#extensions#tabline#ctrlspace#on()
endif
if s:tabws
call airline#extensions#tabline#tabws#on()
endif
set tabline=%!airline#extensions#tabline#get()
endfunction
function! airline#extensions#tabline#load_theme(palette)
if pumvisible()
return
endif
let colors = get(a:palette, 'tabline', {})
let tablabel = get(colors, 'airline_tablabel', a:palette.normal.airline_b)
" Theme for tabs on the left
let tab = get(colors, 'airline_tab', a:palette.inactive.airline_c)
let tabsel = get(colors, 'airline_tabsel', a:palette.normal.airline_a)
let tabtype = get(colors, 'airline_tabtype', a:palette.visual.airline_a)
let tabfill = get(colors, 'airline_tabfill', a:palette.normal.airline_c)
let tabmod = get(colors, 'airline_tabmod', a:palette.insert.airline_a)
let tabhid = get(colors, 'airline_tabhid', a:palette.normal.airline_c)
if has_key(a:palette, 'normal_modified') && has_key(a:palette.normal_modified, 'airline_c')
let tabmodu = get(colors, 'airline_tabmod_unsel', a:palette.normal_modified.airline_c)
let tabmodu_right = get(colors, 'airline_tabmod_unsel_right', a:palette.normal_modified.airline_c)
else
"Fall back to normal airline_c if modified airline_c isn't present
let tabmodu = get(colors, 'airline_tabmod_unsel', a:palette.normal.airline_c)
let tabmodu_right = get(colors, 'airline_tabmod_unsel_right', a:palette.normal.airline_c)
endif
call airline#highlighter#exec('airline_tablabel', tablabel)
call airline#highlighter#exec('airline_tab', tab)
call airline#highlighter#exec('airline_tabsel', tabsel)
call airline#highlighter#exec('airline_tabtype', tabtype)
call airline#highlighter#exec('airline_tabfill', tabfill)
call airline#highlighter#exec('airline_tabmod', tabmod)
call airline#highlighter#exec('airline_tabmod_unsel', tabmodu)
call airline#highlighter#exec('airline_tabhid', tabhid)
" Theme for tabs on the right
" label on the right
let tablabel_r = get(colors, 'airline_tablabel', a:palette.normal.airline_b)
let tabsel_right = get(colors, 'airline_tabsel_right', a:palette.normal.airline_a)
let tab_right = get(colors, 'airline_tab_right', a:palette.inactive.airline_c)
let tabmod_right = get(colors, 'airline_tabmod_right', a:palette.insert.airline_a)
let tabhid_right = get(colors, 'airline_tabhid_right', a:palette.normal.airline_c)
call airline#highlighter#exec('airline_tablabel_right', tablabel_r)
call airline#highlighter#exec('airline_tab_right', tab_right)
call airline#highlighter#exec('airline_tabsel_right', tabsel_right)
call airline#highlighter#exec('airline_tabmod_right', tabmod_right)
call airline#highlighter#exec('airline_tabhid_right', tabhid_right)
call airline#highlighter#exec('airline_tabmod_unsel_right', tabmodu_right)
endfunction
function! s:update_tabline(forceit)
if get(g:, 'airline#extensions#tabline#disable_refresh', 0)
return
endif
" loading a session file
" On SessionLoadPost, g:SessionLoad variable is still set :/
if !a:forceit && get(g:, 'SessionLoad', 0)
return
endif
let match = expand('<afile>')
if pumvisible()
return
elseif !get(g:, 'airline#extensions#tabline#enabled', 0)
return
" return, if buffer matches ignore pattern or is directory (netrw)
elseif empty(match) || airline#util#ignore_buf(match) || isdirectory(match)
return
endif
call airline#util#doautocmd('BufMRUChange')
call airline#extensions#tabline#redraw()
endfunction
function! airline#extensions#tabline#redraw()
" sometimes, the tabline is not correctly updated see #1580
" so force redraw here
if exists(":redrawtabline") == 2
redrawtabline
else
" Have to set a property equal to itself to get airline to re-eval.
" Setting `let &tabline=&tabline` destroys the cursor position so we
" need something less invasive.
let &ro = &ro
endif
endfunction
function! airline#extensions#tabline#enable()
if &lines > 3
set showtabline=2
endif
endfunction
function! airline#extensions#tabline#get()
let show_buffers = get(g:, 'airline#extensions#tabline#show_buffers', 1)
let show_tabs = get(g:, 'airline#extensions#tabline#show_tabs', 1)
let curtabcnt = tabpagenr('$')
if curtabcnt != s:current_tabcnt
let s:current_tabcnt = curtabcnt
call airline#extensions#tabline#tabs#invalidate()
call airline#extensions#tabline#buffers#invalidate()
call airline#extensions#tabline#ctrlspace#invalidate()
call airline#extensions#tabline#tabws#invalidate()
endif
if !exists('#airline#BufAdd#*')
autocmd airline BufAdd * call <sid>update_tabline(0)
endif
if !exists('#airline#SessionLoadPost')
autocmd airline SessionLoadPost * call <sid>update_tabline(1)
endif
if s:ctrlspace
return airline#extensions#tabline#ctrlspace#get()
elseif s:tabws
return airline#extensions#tabline#tabws#get()
elseif show_buffers && curtabcnt == 1 || !show_tabs
return airline#extensions#tabline#buffers#get()
else
return airline#extensions#tabline#tabs#get()
endif
endfunction
function! airline#extensions#tabline#title(n)
let title = ''
if s:taboo
let title = TabooTabTitle(a:n)
endif
if empty(title) && exists('*gettabvar')
let title = gettabvar(a:n, 'title')
endif
let formatter = get(g:, 'airline#extensions#tabline#tabtitle_formatter')
if empty(title) && formatter !=# '' && exists("*".formatter)
let title = call(formatter, [a:n])
endif
if empty(title)
let buflist = tabpagebuflist(a:n)
let winnr = tabpagewinnr(a:n)
let all_buffers = airline#extensions#tabline#buflist#list()
let curbuf = filter(buflist, 'index(all_buffers, v:val) != -1')
if len(curbuf) == 0
call add(curbuf, tabpagebuflist(a:n)[0])
endif
" a:n: -> buffer number
" curbuf: list of buffers in current tabpage
" we need the buffername in current tab page.
return airline#extensions#tabline#get_buffer_name(curbuf[0], curbuf)
endif
return title
endfunction
function! airline#extensions#tabline#get_buffer_name(nr, ...)
let buffers = a:0 ? a:1 : airline#extensions#tabline#buflist#list()
let formatter = get(g:, 'airline#extensions#tabline#formatter', 'default')
return airline#extensions#tabline#formatters#{formatter}#format(a:nr, buffers)
endfunction
function! airline#extensions#tabline#new_builder()
let builder_context = {
\ 'active' : 1,
\ 'tabline' : 1,
\ 'right_sep' : get(g:, 'airline#extensions#tabline#right_sep' , g:airline_right_sep),
\ 'right_alt_sep' : get(g:, 'airline#extensions#tabline#right_alt_sep', g:airline_right_alt_sep),
\ }
if get(g:, 'airline_powerline_fonts', 0)
let builder_context.left_sep = get(g:, 'airline#extensions#tabline#left_sep' , g:airline_left_sep)
let builder_context.left_alt_sep = get(g:, 'airline#extensions#tabline#left_alt_sep' , g:airline_left_alt_sep)
else
let builder_context.left_sep = get(g:, 'airline#extensions#tabline#left_sep' , ' ')
let builder_context.left_alt_sep = get(g:, 'airline#extensions#tabline#left_alt_sep' , '|')
endif
return airline#extensions#tabline#builder#new(builder_context)
endfunction
function! airline#extensions#tabline#group_of_bufnr(tab_bufs, bufnr)
let cur = bufnr('%')
if cur == a:bufnr
if g:airline_detect_modified && getbufvar(a:bufnr, '&modified')
let group = 'airline_tabmod'
else
let group = 'airline_tabsel'
endif
else
if g:airline_detect_modified && getbufvar(a:bufnr, '&modified')
let group = 'airline_tabmod_unsel'
elseif index(a:tab_bufs, a:bufnr) > -1
let group = 'airline_tab'
else
let group = 'airline_tabhid'
endif
endif
return group
endfunction
finish
else
def s:toggle_off(): void
airline#extensions#tabline#autoshow#off()
airline#extensions#tabline#tabs#off()
airline#extensions#tabline#buffers#off()
if s:ctrlspace
airline#extensions#tabline#ctrlspace#off()
endif
if s:tabws
airline#extensions#tabline#tabws#off()
endif
enddef
def s:toggle_on(): void
if get(g:, 'airline_statusline_ontop', 0)
airline#extensions#tabline#enable()
&tabline = '%!airline#statusline(' .. winnr() .. ')'
return
endif
airline#extensions#tabline#autoshow#on()
airline#extensions#tabline#tabs#on()
airline#extensions#tabline#buffers#on()
if s:ctrlspace
airline#extensions#tabline#ctrlspace#on()
endif
if s:tabws
airline#extensions#tabline#tabws#on()
endif
&tabline = '%!airline#extensions#tabline#get()'
enddef
def airline#extensions#tabline#load_theme(palette: dict<any>): number
# Needs to return a number, because it is implicitly used as extern_funcref
# And funcrefs should return a value (see airline#util#exec_funcrefs())
if pumvisible()
return 0
endif
var colors = get(palette, 'tabline', {})
var tablabel = get(colors, 'airline_tablabel', palette.normal.airline_b)
# Theme for tabs on the left
var tab = get(colors, 'airline_tab', palette.inactive.airline_c)
var tabsel = get(colors, 'airline_tabsel', palette.normal.airline_a)
var tabtype = get(colors, 'airline_tabtype', palette.visual.airline_a)
var tabfill = get(colors, 'airline_tabfill', palette.normal.airline_c)
var tabmod = get(colors, 'airline_tabmod', palette.insert.airline_a)
var tabhid = get(colors, 'airline_tabhid', palette.normal.airline_c)
var tabmodu = tabhid
var tabmodu_right = tabhid
if has_key(palette, 'normal_modified') && has_key(palette.normal_modified, 'airline_c')
tabmodu = get(colors, 'airline_tabmod_unsel', palette.normal_modified.airline_c)
tabmodu_right = get(colors, 'airline_tabmod_unsel_right', palette.normal_modified.airline_c)
else
# Fall back to normal airline_c if modified airline_c isn't present
tabmodu = get(colors, 'airline_tabmod_unsel', palette.normal.airline_c)
tabmodu_right = get(colors, 'airline_tabmod_unsel_right', palette.normal.airline_c)
endif
airline#highlighter#exec('airline_tablabel', tablabel)
airline#highlighter#exec('airline_tab', tab)
airline#highlighter#exec('airline_tabsel', tabsel)
airline#highlighter#exec('airline_tabtype', tabtype)
airline#highlighter#exec('airline_tabfill', tabfill)
airline#highlighter#exec('airline_tabmod', tabmod)
airline#highlighter#exec('airline_tabmod_unsel', tabmodu)
airline#highlighter#exec('airline_tabmod_unsel_right', tabmodu_right)
airline#highlighter#exec('airline_tabhid', tabhid)
# Theme for tabs on the right
var tablabel_r = get(colors, 'airline_tablabel', palette.normal.airline_b)
var tabsel_right = get(colors, 'airline_tabsel_right', palette.normal.airline_a)
var tab_right = get(colors, 'airline_tab_right', palette.inactive.airline_c)
var tabmod_right = get(colors, 'airline_tabmod_right', palette.insert.airline_a)
var tabhid_right = get(colors, 'airline_tabhid_right', palette.normal.airline_c)
airline#highlighter#exec('airline_tablabel_right', tablabel_r)
airline#highlighter#exec('airline_tab_right', tab_right)
airline#highlighter#exec('airline_tabsel_right', tabsel_right)
airline#highlighter#exec('airline_tabmod_right', tabmod_right)
airline#highlighter#exec('airline_tabhid_right', tabhid_right)
return 0
enddef
def s:update_tabline(forceit: number): void
if get(g:, 'airline#extensions#tabline#disable_refresh', 0)
return
endif
# loading a session file
# On SessionLoadPost, g:SessionLoad variable is still set :/
if !forceit && get(g:, 'SessionLoad', 0)
return
endif
var match = expand('<afile>')
if pumvisible()
return
elseif !get(g:, 'airline#extensions#tabline#enabled', 0)
return
# return, if buffer matches ignore pattern or is directory (netrw)
elseif empty(match) || airline#util#ignore_buf(match) || isdirectory(match)
return
endif
airline#util#doautocmd('BufMRUChange')
airline#extensions#tabline#redraw()
enddef
def airline#extensions#tabline#redraw(): void
# redrawtabline should always be available
:redrawtabline
enddef
def airline#extensions#tabline#enable(): void
if &lines > 3
&showtabline = 2
endif
enddef
def airline#extensions#tabline#get(): string
var show_buffers = get(g:, 'airline#extensions#tabline#show_buffers', 1)
var show_tabs = get(g:, 'airline#extensions#tabline#show_tabs', 1)
var curtabcnt = tabpagenr('$')
if curtabcnt != s:current_tabcnt
s:current_tabcnt = curtabcnt
airline#extensions#tabline#tabs#invalidate()
airline#extensions#tabline#buffers#invalidate()
airline#extensions#tabline#ctrlspace#invalidate()
airline#extensions#tabline#tabws#invalidate()
endif
if !exists('#airline#BufAdd#*')
autocmd airline BufAdd * call <sid>update_tabline(0)
endif
if !exists('#airline#SessionLoadPost')
autocmd airline SessionLoadPost * call <sid>update_tabline(1)
endif
if s:ctrlspace
return airline#extensions#tabline#ctrlspace#get()
elseif s:tabws
return airline#extensions#tabline#tabws#get()
elseif show_buffers && curtabcnt == 1 || !show_tabs
return airline#extensions#tabline#buffers#get()
else
return airline#extensions#tabline#tabs#get()
endif
enddef
def airline#extensions#tabline#title(n: number): string
var title = ''
if get(g:, 'airline#extensions#taboo#enabled', 1) &&
get(g:, 'loaded_taboo', 0) && exists("*TabooTabTitle")
title = call("TabooTabTitle", [n])
endif
if empty(title)
title = gettabvar(n, 'title')
endif
var formatter = get(g:, 'airline#extensions#tabline#tabtitle_formatter', '')
if empty(title) && !empty(formatter) && exists("*" .. formatter)
title = call(formatter, [n])
endif
if empty(title)
var buflist = tabpagebuflist(n)
var winnr = tabpagewinnr(n)
var all_buffers = airline#extensions#tabline#buflist#list()
var curbuf = filter(buflist, (_, v) => index(all_buffers, v) != -1)
if len(curbuf) == 0
add(curbuf, tabpagebuflist(n)[0])
endif
return airline#extensions#tabline#get_buffer_name(curbuf[0], curbuf)
endif
return title
enddef
def airline#extensions#tabline#get_buffer_name(nr: number, buffers = airline#extensions#tabline#buflist#list()): string
var Formatter = 'airline#extensions#tabline#formatters#' .. get(g:, 'airline#extensions#tabline#formatter', 'default') .. '#format'
return call(Formatter, [ nr, buffers] )
enddef
def airline#extensions#tabline#new_builder(): dict<any>
var builder_context = {
'active': 1,
'tabline': 1,
'right_sep': get(g:, 'airline#extensions#tabline#right_sep', g:airline_right_sep),
'right_alt_sep': get(g:, 'airline#extensions#tabline#right_alt_sep', g:airline_right_alt_sep),
'left_sep': get(g:, 'airline#extensions#tabline#left_sep', g:airline_left_sep),
'left_alt_sep': get(g:, 'airline#extensions#tabline#left_alt_sep', g:airline_left_alt_sep),
}
return airline#extensions#tabline#builder#new(builder_context)
enddef
def airline#extensions#tabline#group_of_bufnr(tab_bufs: list<number>, bufnr: number): string
var cur = bufnr('%')
var group = ''
if cur == bufnr
if g:airline_detect_modified && getbufvar(bufnr, '&modified')
group = 'airline_tabmod'
else
group = 'airline_tabsel'
endif
else
if g:airline_detect_modified && getbufvar(bufnr, '&modified')
group = 'airline_tabmod_unsel'
elseif index(tab_bufs, bufnr) > -1
group = 'airline_tab'
else
group = 'airline_tabhid'
endif
endif
return group
enddef
endif

View File

@@ -0,0 +1,53 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:show_buffers = get(g:, 'airline#extensions#tabline#show_buffers', 1)
let s:buf_min_count = get(g:, 'airline#extensions#tabline#buffer_min_count', 0)
let s:tab_min_count = get(g:, 'airline#extensions#tabline#tab_min_count', 0)
function! airline#extensions#tabline#autoshow#off()
if exists('s:original_tabline')
let &tabline = s:original_tabline
let &showtabline = s:original_showtabline
endif
augroup airline_tabline_autoshow
autocmd!
augroup END
endfunction
function! airline#extensions#tabline#autoshow#on()
let [ s:original_tabline, s:original_showtabline ] = [ &tabline, &showtabline ]
augroup airline_tabline_autoshow
autocmd!
if s:buf_min_count <= 0 && s:tab_min_count <= 1
call airline#extensions#tabline#enable()
else
if s:show_buffers == 1
autocmd BufEnter * call <sid>show_tabline(s:buf_min_count, len(airline#extensions#tabline#buflist#list()))
autocmd BufUnload * call <sid>show_tabline(s:buf_min_count, len(airline#extensions#tabline#buflist#list()) - 1)
else
autocmd TabNew,TabClosed * call <sid>show_tabline(s:tab_min_count, tabpagenr('$'))
endif
endif
" Invalidate cache. This has to come after the BufUnload for
" s:show_buffers, to invalidate the cache for BufEnter.
autocmd BufLeave,BufAdd,BufUnload * call airline#extensions#tabline#buflist#invalidate()
augroup END
endfunction
function! s:show_tabline(min_count, total_count)
if a:total_count >= a:min_count
if &showtabline != 2 && &lines > 3
set showtabline=2
endif
else
if &showtabline != 0
set showtabline=0
endif
endif
endfunction

View File

@@ -0,0 +1,267 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:spc = g:airline_symbols.space
let s:current_bufnr = -1
let s:current_modified = 0
let s:current_tabline = ''
let s:current_visible_buffers = []
let s:number_map = {
\ '0': '⁰',
\ '1': '¹',
\ '2': '²',
\ '3': '³',
\ '4': '⁴',
\ '5': '⁵',
\ '6': '⁶',
\ '7': '⁷',
\ '8': '⁸',
\ '9': '⁹'
\ }
let s:number_map = &encoding == 'utf-8'
\ ? get(g:, 'airline#extensions#tabline#buffer_idx_format', s:number_map)
\ : {}
function! airline#extensions#tabline#buffers#off()
augroup airline_tabline_buffers
autocmd!
augroup END
endfunction
function! airline#extensions#tabline#buffers#on()
let terminal_event = has("nvim") ? 'TermOpen' : 'TerminalOpen'
augroup airline_tabline_buffers
autocmd!
autocmd BufDelete * call airline#extensions#tabline#buflist#clean()
if exists("##".terminal_event)
exe 'autocmd '. terminal_event. ' * call airline#extensions#tabline#buflist#clean()'
endif
autocmd User BufMRUChange call airline#extensions#tabline#buflist#clean()
augroup END
endfunction
function! airline#extensions#tabline#buffers#invalidate()
let s:current_bufnr = -1
endfunction
function! airline#extensions#tabline#buffers#get()
try
call <sid>map_keys()
catch
" no-op
endtry
let cur = bufnr('%')
if cur == s:current_bufnr && &columns == s:column_width
if !g:airline_detect_modified || getbufvar(cur, '&modified') == s:current_modified
return s:current_tabline
endif
endif
let b = airline#extensions#tabline#new_builder()
let tab_bufs = tabpagebuflist(tabpagenr())
let show_buf_label_first = 0
if get(g:, 'airline#extensions#tabline#buf_label_first', 0)
let show_buf_label_first = 1
endif
if show_buf_label_first
call airline#extensions#tabline#add_label(b, 'buffers', 0)
endif
let b.tab_bufs = tabpagebuflist(tabpagenr())
let b.overflow_group = 'airline_tabhid'
let b.buffers = airline#extensions#tabline#buflist#list()
if get(g:, 'airline#extensions#tabline#current_first', 0)
if index(b.buffers, cur) > -1
call remove(b.buffers, index(b.buffers, cur))
endif
let b.buffers = [cur] + b.buffers
endif
function! b.get_group(i) dict
let bufnum = get(self.buffers, a:i, -1)
if bufnum == -1
return ''
endif
let group = airline#extensions#tabline#group_of_bufnr(self.tab_bufs, bufnum)
if bufnum == bufnr('%')
let s:current_modified = (group == 'airline_tabmod') ? 1 : 0
endif
return group
endfunction
if has("tablineat")
function! b.get_pretitle(i) dict
let bufnum = get(self.buffers, a:i, -1)
return '%'.bufnum.'@airline#extensions#tabline#buffers#clickbuf@'
endfunction
function! b.get_posttitle(i) dict
return '%X'
endfunction
endif
function! b.get_title(i) dict
let bufnum = get(self.buffers, a:i, -1)
let group = self.get_group(a:i)
let pgroup = self.get_group(a:i - 1)
" always add a space when powerline_fonts are used
" or for the very first item
if get(g:, 'airline_powerline_fonts', 0) || a:i == 0
let space = s:spc
else
let space= (pgroup == group ? s:spc : '')
endif
if get(g:, 'airline#extensions#tabline#buffer_idx_mode', 0)
if len(s:number_map) > 0
return space. s:get_number(a:i) . '%(%{airline#extensions#tabline#get_buffer_name('.bufnum.')}%)' . s:spc
else
return '['.(a:i+1).s:spc.'%(%{airline#extensions#tabline#get_buffer_name('.bufnum.')}%)'.']'
endif
else
return space.'%(%{airline#extensions#tabline#get_buffer_name('.bufnum.')}%)'.s:spc
endif
endfunction
let current_buffer = max([index(b.buffers, cur), 0])
let last_buffer = len(b.buffers) - 1
call b.insert_titles(current_buffer, 0, last_buffer)
call b.add_section('airline_tabfill', '')
call b.split()
call b.add_section('airline_tabfill', '')
if !show_buf_label_first
call airline#extensions#tabline#add_label(b, 'buffers', 1)
endif
call airline#extensions#tabline#add_tab_label(b)
let s:current_bufnr = cur
let s:column_width = &columns
let s:current_tabline = b.build()
let s:current_visible_buffers = copy(b.buffers)
" Do not remove from s:current_visible_buffers, this breaks s:select_tab()
"if b._right_title <= last_buffer
" call remove(s:current_visible_buffers, b._right_title, last_buffer)
"endif
"if b._left_title > 0
" call remove(s:current_visible_buffers, 0, b._left_title)
"endif
return s:current_tabline
endfunction
function! s:get_number(index)
if len(s:number_map) == 0
return a:index
endif
let bidx_mode = get(g:, 'airline#extensions#tabline#buffer_idx_mode', 0)
let number_format = bidx_mode > 1 ? '%02d' : '%d'
let l:count = bidx_mode == 2 ? a:index+11 : a:index+1
return join(map(split(printf(number_format, l:count), '\zs'),
\ 'get(s:number_map, v:val, "")'), '')
endfunction
function! s:select_tab(buf_index)
" no-op when called in 'keymap_ignored_filetypes'
if count(get(g:, 'airline#extensions#tabline#keymap_ignored_filetypes',
\ ['vimfiler', 'nerdtree']), &ft)
return
endif
let idx = a:buf_index
if s:current_visible_buffers[0] == -1
let idx = idx + 1
endif
let buf = get(s:current_visible_buffers, idx, 0)
if buf != 0
exec 'b!' . buf
endif
endfunction
function! s:jump_to_tab(offset)
let l = airline#extensions#tabline#buflist#list()
let i = index(l, bufnr('%'))
if i > -1
exec 'b!' . l[(i + a:offset) % len(l)]
endif
endfunction
function! s:map_keys()
let bidx_mode = get(g:, 'airline#extensions#tabline#buffer_idx_mode', 1)
if bidx_mode > 0
if bidx_mode == 1
for i in range(1, 10)
exe printf('noremap <silent> <Plug>AirlineSelectTab%d :call <SID>select_tab(%d)<CR>', i%10, i-1)
endfor
else
let start_idx = bidx_mode == 2 ? 11 : 1
for i in range(start_idx, 99)
exe printf('noremap <silent> <Plug>AirlineSelectTab%02d :call <SID>select_tab(%d)<CR>', i, i-start_idx)
endfor
endif
noremap <silent> <Plug>AirlineSelectPrevTab :<C-u>call <SID>jump_to_tab(-v:count1)<CR>
noremap <silent> <Plug>AirlineSelectNextTab :<C-u>call <SID>jump_to_tab(v:count1)<CR>
" Enable this for debugging
" com! AirlineBufferList :echo map(copy(s:current_visible_buffers), {i,k -> k.": ".bufname(k)})
endif
endfunction
function! airline#extensions#tabline#buffers#clickbuf(minwid, clicks, button, modifiers) abort
" Clickable buffers
" works only in recent NeoVim with has('tablineat')
" single mouse button click without modifiers pressed
if a:clicks == 1 && a:modifiers !~# '[^ ]'
if a:button is# 'l'
" left button - switch to buffer
try
silent execute 'buffer' a:minwid
catch
call airline#util#warning("Cannot switch buffer, current buffer is modified! See :h 'hidden'")
endtry
elseif a:button is# 'm'
" middle button - delete buffer
if get(g:, 'airline#extensions#tabline#middle_click_preserves_windows', 0) == 0 || winnr('$') == 1
" just simply delete the clicked buffer. This will cause windows
" associated with the clicked buffer to be closed.
silent execute 'bdelete' a:minwid
else
" find windows displaying the clicked buffer and open an new
" buffer in them.
let current_window = bufwinnr("%")
let window_number = bufwinnr(a:minwid)
let last_window_visited = -1
" Set to 1 if the clicked buffer was open in any windows.
let buffer_in_window = 0
" Find the next window with the clicked buffer open. If bufwinnr()
" returns the same window number, this is because we clicked a new
" buffer, and then tried editing a new buffer. Vim won't create a
" new empty buffer for the same window, so we get the same window
" number from bufwinnr(). In this case we just give up and don't
" delete the buffer.
" This could be made cleaner if we could check if the clicked buffer
" is a new buffer, but I don't know if there is a way to do that.
while window_number != -1 && window_number != last_window_visited
let buffer_in_window = 1
silent execute window_number . 'wincmd w'
silent execute 'enew'
let last_window_visited = window_number
let window_number = bufwinnr(a:minwid)
endwhile
silent execute current_window . 'wincmd w'
if window_number != last_window_visited || buffer_in_window == 0
silent execute 'bdelete' a:minwid
endif
endif
endif
endif
endfunction

View File

@@ -0,0 +1,85 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#tabline#buflist#invalidate()
unlet! s:current_buffer_list
endfunction
function! airline#extensions#tabline#buflist#clean()
if !exists('#airline')
" airline disabled
return
endif
call airline#extensions#tabline#buflist#invalidate()
call airline#extensions#tabline#buffers#invalidate()
endfunction
" paths in excludes list
function! s:ExcludePaths(nr, exclude_paths)
let bname = bufname(a:nr)
if empty(bname)
return 0
endif
let bpath = fnamemodify(bname, ":p")
for f in a:exclude_paths
if bpath =~# f | return 1 | endif
endfor
endfunction
" other types to exclude
function! s:ExcludeOther(nr, exclude_preview)
if (getbufvar(a:nr, 'current_syntax') == 'qf') ||
\ (a:exclude_preview && getbufvar(a:nr, '&bufhidden') == 'wipe'
\ && getbufvar(a:nr, '&buftype') == 'nofile')
return 1 | endif
endfunction
function! airline#extensions#tabline#buflist#list()
if exists('s:current_buffer_list')
return s:current_buffer_list
endif
let exclude_buffers = get(g:, 'airline#extensions#tabline#exclude_buffers', [])
let exclude_paths = get(g:, 'airline#extensions#tabline#excludes', [])
let exclude_preview = get(g:, 'airline#extensions#tabline#exclude_preview', 1)
let list = (exists('g:did_bufmru') && g:did_bufmru) ? BufMRUList() : range(1, bufnr("$"))
let buffers = []
" If this is too slow, we can switch to a different algorithm.
" Basically branch 535 already does it, but since it relies on
" BufAdd autocommand, I'd like to avoid this if possible.
for nr in list
if buflisted(nr)
" Do not add to the bufferlist, if either
" 1) bufnr is exclude_buffers list
" 2) buffername matches one of exclude_paths patterns
" 3) buffer is a quickfix buffer
" 4) when excluding preview windows:
" 'bufhidden' == wipe
" 'buftype' == nofile
" 5) ignore buffers matching airline#extensions#tabline#ignore_bufadd_pat
" check buffer numbers first
if index(exclude_buffers, nr) >= 0
continue
" check paths second
elseif !empty(exclude_paths) && s:ExcludePaths(nr, exclude_paths)
continue
" ignore buffers matching airline#extensions#tabline#ignore_bufadd_pat
elseif airline#util#ignore_buf(bufname(nr))
continue
" check other types last
elseif s:ExcludeOther(nr, exclude_preview)
continue
endif
call add(buffers, nr)
endif
endfor
let s:current_buffer_list = buffers
return buffers
endfunction

View File

@@ -0,0 +1,232 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:prototype = {}
" Set the point in the tabline where the builder should insert the titles.
"
" Subsequent calls will overwrite the previous ones, so only the last call
" determines to location to insert titles.
"
" NOTE: The titles are not inserted until |build| is called, so that the
" remaining contents of the tabline can be taken into account.
"
" Callers should define at least |get_title| and |get_group| on the host
" object before calling |build|.
function! s:prototype.insert_titles(current, first, last) dict
let self._first_title = a:first " lowest index
let self._last_title = a:last " highest index
let self._left_title = a:current " next index to add on the left
let self._right_title = a:current + 1 " next index to add on the right
let self._left_position = self.get_position() " left end of titles
let self._right_position = self._left_position " right end of the titles
endfunction
" Insert a title for entry number |index|, of group |group| at position |pos|,
" if there is space for it. Returns 1 if it is inserted, 0 otherwise
"
" |force| inserts the title even if there isn't enough space left for it.
" |sep_size| adjusts the size change that the title is considered to take up,
" to account for changes to the separators
"
" The title is defined by |get_title| on the hosting object, called with
" |index| as its only argument.
" |get_pretitle| and |get_posttitle| may be defined on the host object to
" insert some formatting before or after the title. These should be 0-width.
"
" This method updates |_right_position| and |_remaining_space| on the host
" object, if the title is inserted.
function! s:prototype.try_insert_title(index, group, pos, sep_size, force) dict
let title = self.get_title(a:index)
let title_size = s:tabline_evaluated_length(title) + a:sep_size
if a:force || self._remaining_space >= title_size
let pos = a:pos
if has_key(self, "get_pretitle")
call self.insert_raw(self.get_pretitle(a:index), pos)
let self._right_position += 1
let pos += 1
endif
call self.insert_section(a:group, title, pos)
let self._right_position += 1
let pos += 1
if has_key(self, "get_posttitle")
call self.insert_raw(self.get_posttitle(a:index), pos)
let self._right_position += 1
let pos += 1
endif
let self._remaining_space -= title_size
return 1
endif
return 0
endfunction
function! s:get_separator_change(new_group, old_group, end_group, sep_size, alt_sep_size)
return s:get_separator_change_with_end(a:new_group, a:old_group, a:end_group, a:end_group, a:sep_size, a:alt_sep_size)
endfunction
" Compute the change in size of the tabline caused by separators
"
" This should be kept up-to-date with |s:get_transitioned_separator| and
" |s:get_separator| in autoload/airline/builder.vim
function! s:get_separator_change_with_end(new_group, old_group, new_end_group, old_end_group, sep_size, alt_sep_size)
let sep_change = 0
if !empty(a:new_end_group) " Separator between title and the end
let sep_change += airline#builder#should_change_group(a:new_group, a:new_end_group) ? a:sep_size : a:alt_sep_size
endif
if !empty(a:old_group) " Separator between the title and the one adjacent
let sep_change += airline#builder#should_change_group(a:new_group, a:old_group) ? a:sep_size : a:alt_sep_size
if !empty(a:old_end_group) " Remove mis-predicted separator
let sep_change -= airline#builder#should_change_group(a:old_group, a:old_end_group) ? a:sep_size : a:alt_sep_size
endif
endif
return sep_change
endfunction
" This replaces the build function of the |airline#builder#new| object, to
" insert titles as specified by the last call to |insert_titles| before
" passing to the original build function.
"
" Callers should define at least |get_title| and |get_group| on the host
" object if |insert_titles| has been called on it.
function! s:prototype.build() dict
if has_key(self, '_left_position') && self._first_title <= self._last_title
let self._remaining_space = &columns - s:tabline_evaluated_length(self._build())
let center_active = get(g:, 'airline#extensions#tabline#center_active', 0)
let sep_size = s:tabline_evaluated_length(self._context.left_sep)
let alt_sep_size = s:tabline_evaluated_length(self._context.left_alt_sep)
let outer_left_group = airline#builder#get_prev_group(self._sections, self._left_position)
let outer_right_group = airline#builder#get_next_group(self._sections, self._right_position)
let overflow_marker = get(g:, 'airline#extensions#tabline#overflow_marker', g:airline_symbols.ellipsis)
let overflow_marker_size = s:tabline_evaluated_length(overflow_marker)
" Allow space for the markers before we begin filling in titles.
if self._left_title > self._first_title
let self._remaining_space -= overflow_marker_size +
\ s:get_separator_change(self.overflow_group, "", outer_left_group, sep_size, alt_sep_size)
endif
if self._left_title < self._last_title
let self._remaining_space -= overflow_marker_size +
\ s:get_separator_change(self.overflow_group, "", outer_right_group, sep_size, alt_sep_size)
endif
" Add the current title
let group = self.get_group(self._left_title)
if self._left_title == self._first_title
let sep_change = s:get_separator_change(group, "", outer_left_group, sep_size, alt_sep_size)
else
let sep_change = s:get_separator_change(group, "", self.overflow_group, sep_size, alt_sep_size)
endif
if self._left_title == self._last_title
let sep_change += s:get_separator_change(group, "", outer_right_group, sep_size, alt_sep_size)
else
let sep_change += s:get_separator_change(group, "", self.overflow_group, sep_size, alt_sep_size)
endif
let left_group = group
let right_group = group
let self._left_title -=
\ self.try_insert_title(self._left_title, group, self._left_position, sep_change, 1)
if get(g:, 'airline#extensions#tabline#current_first', 0)
" always have current title first
let self._left_position += 1
endif
if !center_active && self._right_title <= self._last_title
" Add the title to the right
let group = self.get_group(self._right_title)
if self._right_title == self._last_title
let sep_change = s:get_separator_change_with_end(group, right_group, outer_right_group, self.overflow_group, sep_size, alt_sep_size) - overflow_marker_size
else
let sep_change = s:get_separator_change(group, right_group, self.overflow_group, sep_size, alt_sep_size)
endif
let right_group = group
let self._right_title +=
\ self.try_insert_title(self._right_title, group, self._right_position, sep_change, 1)
endif
while self._remaining_space > 0
let done = 0
if self._left_title >= self._first_title
" Insert next title to the left
let group = self.get_group(self._left_title)
if self._left_title == self._first_title
let sep_change = s:get_separator_change_with_end(group, left_group, outer_left_group, self.overflow_group, sep_size, alt_sep_size) - overflow_marker_size
else
let sep_change = s:get_separator_change(group, left_group, self.overflow_group, sep_size, alt_sep_size)
endif
let left_group = group
let done = self.try_insert_title(self._left_title, group, self._left_position, sep_change, 0)
let self._left_title -= done
endif
" If center_active is set, this |if| operates as an independent |if|,
" otherwise as an |elif|.
if self._right_title <= self._last_title && (center_active || !done)
" Insert next title to the right
let group = self.get_group(self._right_title)
if self._right_title == self._last_title
let sep_change = s:get_separator_change_with_end(group, right_group, outer_right_group, self.overflow_group, sep_size, alt_sep_size) - overflow_marker_size
else
let sep_change = s:get_separator_change(group, right_group, self.overflow_group, sep_size, alt_sep_size)
endif
let right_group = group
let done = self.try_insert_title(self._right_title, group, self._right_position, sep_change, 0)
let self._right_title += done
endif
if !done
break
endif
endwhile
if self._left_title >= self._first_title
if get(g:, 'airline#extensions#tabline#current_first', 0)
let self._left_position -= 1
endif
call self.insert_section(self.overflow_group, overflow_marker, self._left_position)
let self._right_position += 1
endif
if self._right_title <= self._last_title
call self.insert_section(self.overflow_group, overflow_marker, self._right_position)
endif
endif
return self._build()
endfunction
let s:prototype.overflow_group = 'airline_tab'
" Extract the text content a tabline will render. (Incomplete).
"
" See :help 'statusline' for the list of fields.
function! s:evaluate_tabline(tabline)
let tabline = a:tabline
let tabline = substitute(tabline, '%{\([^}]\+\)}', '\=eval(submatch(1))', 'g')
let tabline = substitute(tabline, '%#[^#]\+#', '', 'g')
let tabline = substitute(tabline, '%(\([^)]\+\)%)', '\1', 'g')
let tabline = substitute(tabline, '%\d\+[TX]', '', 'g')
let tabline = substitute(tabline, '%=', '', 'g')
let tabline = substitute(tabline, '%\d*\*', '', 'g')
if has('tablineat')
let tabline = substitute(tabline, '%@[^@]\+@', '', 'g')
endif
return tabline
endfunction
function! s:tabline_evaluated_length(tabline)
return airline#util#strchars(s:evaluate_tabline(a:tabline))
endfunction
function! airline#extensions#tabline#builder#new(context)
let builder = airline#builder#new(a:context)
let builder._build = builder.build
call extend(builder, s:prototype, 'force')
return builder
endfunction

View File

@@ -0,0 +1,169 @@
" MIT License. Copyright (c) 2016-2021 Kevin Sapper et al.
" Plugin: https://github.com/szw/vim-ctrlspace
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:current_bufnr = -1
let s:current_modified = 0
let s:current_tabnr = -1
let s:current_tabline = ''
let s:highlight_groups = ['hid', 0, '', 'sel', 'mod_unsel', 0, 'mod_unsel', 'mod']
function! airline#extensions#tabline#ctrlspace#off()
augroup airline_tabline_ctrlspace
autocmd!
augroup END
endfunction
function! airline#extensions#tabline#ctrlspace#on()
augroup airline_tabline_ctrlspace
autocmd!
autocmd BufDelete * call airline#extensions#tabline#ctrlspace#invalidate()
augroup END
endfunction
function! airline#extensions#tabline#ctrlspace#invalidate()
if !exists('#airline')
return
endif
let s:current_bufnr = -1
let s:current_tabnr = -1
endfunction
function! airline#extensions#tabline#ctrlspace#add_buffer_section(builder, cur_tab, cur_buf, pull_right)
let pos_extension = (a:pull_right ? '_right' : '')
let buffer_list = []
for bufferindex in sort(keys(ctrlspace#api#Buffers(a:cur_tab)), 'N')
for buffer in ctrlspace#api#BufferList(a:cur_tab)
if buffer['index'] == bufferindex
call add(buffer_list, buffer)
endif
endfor
endfor
" add by tenfy(tenfyzhong@qq.com)
" if the current buffer no in the buffer list
" return false and no redraw tabline.
" Fixes #1515. if there a BufEnter autocmd execute redraw. The tabline may no update.
let bufnr_list = map(copy(buffer_list), 'v:val["index"]')
if index(bufnr_list, a:cur_buf) == -1 && a:cur_tab == s:current_tabnr
return 0
endif
let s:current_modified = getbufvar(a:cur_buf, '&modified')
for buffer in buffer_list
let group = 'airline_tab'
\ .s:highlight_groups[(4 * buffer.modified) + (2 * buffer.visible) + (a:cur_buf == buffer.index)]
\ .pos_extension
let buf_name = '%(%{airline#extensions#tabline#get_buffer_name('.buffer.index.')}%)'
if has("tablineat")
let buf_name = '%'.buffer.index.'@airline#extensions#tabline#buffers#clickbuf@'.buf_name.'%X'
endif
call a:builder.add_section_spaced(group, buf_name)
endfor
" add by tenfy(tenfyzhong@qq.com)
" if the selected buffer was updated
" return true
return 1
endfunction
function! airline#extensions#tabline#ctrlspace#add_tab_section(builder, pull_right)
let pos_extension = (a:pull_right ? '_right' : '')
let tab_list = ctrlspace#api#TabList()
for tab in tab_list
let group = 'airline_tab'
\ .s:highlight_groups[(4 * tab.modified) + (3 * tab.current)]
\ .pos_extension
if get(g:, 'airline#extensions#tabline#ctrlspace_show_tab_nr', 0) == 0
call a:builder.add_section_spaced(group, '%'.tab.index.'T'.tab.title.ctrlspace#api#TabBuffersNumber(tab.index).'%T')
else
call a:builder.add_section_spaced(group, '%'.(tab.index).'T'.(tab.index).(g:airline_symbols.space).(tab.title).ctrlspace#api#TabBuffersNumber(tab.index).'%T')
endif
endfor
endfunction
function! airline#extensions#tabline#ctrlspace#get()
let cur_buf = bufnr('%')
let buffer_label = get(g:, 'airline#extensions#tabline#buffers_label', 'buffers')
let tab_label = get(g:, 'airline#extensions#tabline#tabs_label', 'tabs')
let switch_buffers_and_tabs = get(g:, 'airline#extensions#tabline#switch_buffers_and_tabs', 0)
try
call airline#extensions#tabline#tabs#map_keys()
endtry
let cur_tab = tabpagenr()
if cur_buf == s:current_bufnr && cur_tab == s:current_tabnr
if !g:airline_detect_modified || getbufvar(cur_buf, '&modified') == s:current_modified
return s:current_tabline
endif
endif
let builder = airline#extensions#tabline#new_builder()
let show_buffers = get(g:, 'airline#extensions#tabline#show_buffers', 1)
let show_tabs = get(g:, 'airline#extensions#tabline#show_tabs', 1)
let AppendBuffers = function('airline#extensions#tabline#ctrlspace#add_buffer_section', [builder, cur_tab, cur_buf])
let AppendTabs = function('airline#extensions#tabline#ctrlspace#add_tab_section', [builder])
let AppendLabel = function(builder.add_section_spaced, ['airline_tabtype'], builder)
" <= 1: |{Tabs} <tab|
" == 2: |{Buffers} <buffers|
" == 3: |buffers> {Buffers} {Tabs} <tabs|
let showing_mode = (2 * show_buffers) + (show_tabs)
let ignore_update = 0
" Add left tabline content
if showing_mode <= 1 " Tabs only mode
call AppendTabs(0)
elseif showing_mode == 2 " Buffers only mode
let ignore_update = !AppendBuffers(0)
else
if !switch_buffers_and_tabs
call AppendLabel(buffer_label)
let ignore_update = !AppendBuffers(0)
else
call AppendLabel(tab_label)
call AppendTabs(0)
endif
endif
if ignore_update | return s:current_tabline | endif
call builder.add_section('airline_tabfill', '')
call builder.split()
call builder.add_section('airline_tabfill', '')
" Add right tabline content
if showing_mode <= 1 " Tabs only mode
call AppendLabel(tab_label)
elseif showing_mode == 2 " Buffers only mode
call AppendLabel(buffer_label)
else
if !switch_buffers_and_tabs
call AppendTabs(1)
call AppendLabel(tab_label)
else
let ignore_update = AppendBuffers(1)
call AppendLabel(buffer_label)
endif
endif
if ignore_update | return s:current_tabline | endif
let s:current_bufnr = cur_buf
let s:current_tabnr = cur_tab
let s:current_tabline = builder.build()
return s:current_tabline
endfunction

View File

@@ -0,0 +1,85 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2 et
scriptencoding utf-8
if !exists(":def") || !airline#util#has_vim9_script()
function! airline#extensions#tabline#formatters#default#format(bufnr, buffers)
let fnametruncate = get(g:, 'airline#extensions#tabline#fnametruncate', 0)
let fmod = get(g:, 'airline#extensions#tabline#fnamemod', ':~:.')
let _ = ''
let name = bufname(a:bufnr)
if empty(name)
let _ = '[No Name]'
elseif name =~ 'term://'
" Neovim Terminal
let _ = substitute(name, '\(term:\)//.*:\(.*\)', '\1 \2', '')
else
if get(g:, 'airline#extensions#tabline#fnamecollapse', 1)
" Does not handle non-ascii characters like Cyrillic: 'D/Учёба/t.c'
"let _ .= substitute(fnamemodify(name, fmod), '\v\w\zs.{-}\ze(\\|/)', '', 'g')
let _ = pathshorten(fnamemodify(name, fmod))
else
let _ = fnamemodify(name, fmod)
endif
if a:bufnr != bufnr('%') && fnametruncate && strlen(_) > fnametruncate
let _ = airline#util#strcharpart(_, 0, fnametruncate)
endif
endif
return airline#extensions#tabline#formatters#default#wrap_name(a:bufnr, _)
endfunction
function! airline#extensions#tabline#formatters#default#wrap_name(bufnr, buffer_name)
let buf_nr_format = get(g:, 'airline#extensions#tabline#buffer_nr_format', '%s: ')
let buf_nr_show = get(g:, 'airline#extensions#tabline#buffer_nr_show', 0)
let _ = buf_nr_show ? printf(buf_nr_format, a:bufnr) : ''
let _ .= substitute(a:buffer_name, '\\', '/', 'g')
if getbufvar(a:bufnr, '&modified') == 1
let _ .= g:airline_symbols.modified
endif
return _
endfunction
finish
else
" Vim9 Script implementation
def airline#extensions#tabline#formatters#default#format(bufnr: number, buffers: list<number>): string
var fnametruncate = get(g:, 'airline#extensions#tabline#fnametruncate', 0)
var fmod = get(g:, 'airline#extensions#tabline#fnamemod', ':~:.')
var result = ''
var name = bufname(bufnr)
if empty(name)
result = '[No Name]'
elseif name =~ 'term://'
# Neovim Terminal
result = substitute(name, '\(term:\)//.*:\(.*\)', '\1 \2', '')
else
if get(g:, 'airline#extensions#tabline#fnamecollapse', 1)
result = pathshorten(fnamemodify(name, fmod))
else
result = fnamemodify(name, fmod)
endif
if bufnr != bufnr('%') && fnametruncate && strlen(result) > fnametruncate
result = airline#util#strcharpart(result, 0, fnametruncate)
endif
endif
return airline#extensions#tabline#formatters#default#wrap_name(bufnr, result)
enddef
def airline#extensions#tabline#formatters#default#wrap_name(bufnr: number, buffer_name: string): string
var buf_nr_format = get(g:, 'airline#extensions#tabline#buffer_nr_format', '%s: ')
var buf_nr_show = get(g:, 'airline#extensions#tabline#buffer_nr_show', 0)
var result = buf_nr_show ? printf(buf_nr_format, bufnr) : ''
result ..= substitute(buffer_name, '\\', '/', 'g')
if getbufvar(bufnr, '&modified')
result ..= g:airline_symbols.modified
endif
return result
enddef
endif

View File

@@ -0,0 +1,15 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#tabline#formatters#jsformatter#format(bufnr, buffers)
let buf = bufname(a:bufnr)
let filename = fnamemodify(buf, ':t')
if filename ==# 'index.js' || filename ==# 'index.jsx' || filename ==# 'index.ts' || filename ==# 'index.tsx' || filename ==# 'index.vue'
return fnamemodify(buf, ':p:h:t') . '/i'
else
return airline#extensions#tabline#formatters#unique_tail_improved#format(a:bufnr, a:buffers)
endif
endfunction

View File

@@ -0,0 +1,21 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#tabline#formatters#short_path#format(bufnr, buffers)
let fmod = get(g:, 'airline#extensions#tabline#fnamemod', ':p:h:t')
let _ = ''
let name = bufname(a:bufnr)
if empty(name)
let _ .= '[No Name]'
elseif name =~ 'term://'
" Neovim Terminal
let _ = substitute(name, '\(term:\)//.*:\(.*\)', '\1 \2', '')
else
let _ .= fnamemodify(name, fmod) . '/' . fnamemodify(name, ':t')
endif
return airline#extensions#tabline#formatters#default#wrap_name(a:bufnr, _)
endfunction

View File

@@ -0,0 +1,36 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#tabline#formatters#short_path_improved#format(bufnr, buffers) abort
let name = bufname(a:bufnr)
if empty(name)
return airline#extensions#tabline#formatters#default#wrap_name(a:bufnr, '[No Name]')
endif
let tail = s:tail(a:bufnr)
let tails = s:tails(a:bufnr, a:buffers)
if has_key(tails, tail)
" Use short path for duplicates
return airline#extensions#tabline#formatters#short_path#format(a:bufnr, a:buffers)
endif
" Use tail for unique filenames
return airline#extensions#tabline#formatters#default#wrap_name(a:bufnr, tail)
endfunction
function! s:tails(self, buffers) abort
let tails = {}
for nr in a:buffers
if nr != a:self
let tails[s:tail(nr)] = 1
endif
endfor
return tails
endfunction
function! s:tail(bufnr) abort
return fnamemodify(bufname(a:bufnr), ':t')
endfunction

View File

@@ -0,0 +1,20 @@
" MIT License. Copyright (c) 2017-2021 Christian Brabandt et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#tabline#formatters#tabnr#format(tab_nr, buflist)
let spc=g:airline_symbols.space
let tab_nr_type = get(g:, 'airline#extensions#tabline#tab_nr_type', 0)
if tab_nr_type == 0 " nr of splits
" TODO: This doesn't seem to be the actual number of splits,
" but seems to behave like what users expect.
return spc. len(tabpagebuflist(a:buflist[0]))
elseif tab_nr_type == 1 " tab number
" Return only the current tab number
return spc. a:tab_nr
else " tab_nr_type == 2 splits and tab number
" return the tab number followed by the number of buffers (in the tab)
return spc. a:tab_nr. spc. len(tabpagebuflist(a:buflist[0]))
endif
endfunction

View File

@@ -0,0 +1,46 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#tabline#formatters#unique_tail#format(bufnr, buffers)
let duplicates = {}
let tails = {}
let map = {}
for nr in a:buffers
let name = bufname(nr)
if empty(name)
let map[nr] = airline#extensions#tabline#formatters#default#wrap_name(nr, '[No Name]')
else
if name =~ 'term://'
" Neovim Terminal
let tail = substitute(name, '\(term:\)//.*:\(.*\)', '\1 \2', '')
else
let tail = fnamemodify(name, ':s?/\+$??:t')
endif
if has_key(tails, tail)
let duplicates[nr] = nr
endif
let tails[tail] = 1
let map[nr] = airline#extensions#tabline#formatters#default#wrap_name(nr, tail)
endif
endfor
let fmod = get(g:, 'airline#extensions#tabline#fnamemod', ':p:.')
for nr in values(duplicates)
let name = bufname(nr)
let fnamecollapse = get(g:, 'airline#extensions#tabline#fnamecollapse', 1)
if fnamecollapse
let map[nr] = airline#extensions#tabline#formatters#default#wrap_name(nr, substitute(fnamemodify(name, fmod), '\v\w\zs.{-}\ze(\\|/)', '', 'g'))
else
let map[nr] = airline#extensions#tabline#formatters#default#wrap_name(nr, fnamemodify(name, fmod))
endif
endfor
if has_key(map, a:bufnr)
return map[a:bufnr]
endif
" if we get here, the buffer list isn't in sync with the selected buffer yet, fall back to the default
return airline#extensions#tabline#formatters#default#format(a:bufnr, a:buffers)
endfunction

View File

@@ -0,0 +1,91 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:skip_symbol = '…'
function! airline#extensions#tabline#formatters#unique_tail_improved#format(bufnr, buffers)
if len(a:buffers) <= 1 " don't need to compare bufnames if has less than one buffer opened
return airline#extensions#tabline#formatters#default#format(a:bufnr, a:buffers)
endif
let curbuf_tail = fnamemodify(bufname(a:bufnr), ':t')
let do_deduplicate = 0
let path_tokens = {}
for nr in a:buffers
let name = bufname(nr)
if !empty(name) && nr != a:bufnr && fnamemodify(name, ':t') == curbuf_tail " only perform actions if curbuf_tail isn't unique
let do_deduplicate = 1
let tokens = reverse(split(substitute(fnamemodify(name, ':p:h'), '\\', '/', 'g'), '/'))
let token_index = 0
for token in tokens
if token == '' | continue | endif
if token == '.' | break | endif
if !has_key(path_tokens, token_index)
let path_tokens[token_index] = {}
endif
let path_tokens[token_index][token] = 1
let token_index += 1
endfor
endif
endfor
if do_deduplicate == 1
let path = []
let token_index = 0
for token in reverse(split(substitute(fnamemodify(bufname(a:bufnr), ':p:h'), '\\', '/', 'g'), '/'))
if token == '.' | break | endif
let duplicated = 0
let uniq = 1
let single = 1
if has_key(path_tokens, token_index)
let duplicated = 1
if len(keys(path_tokens[token_index])) > 1 | let single = 0 | endif
if has_key(path_tokens[token_index], token) | let uniq = 0 | endif
endif
call insert(path, {'token': token, 'duplicated': duplicated, 'uniq': uniq, 'single': single})
let token_index += 1
endfor
let buf_name = [curbuf_tail]
let has_uniq = 0
let has_skipped = 0
for token1 in reverse(path)
if !token1['duplicated'] && len(buf_name) > 1
call insert(buf_name, s:skip_symbol)
let has_skipped = 0
break
endif
if has_uniq == 1
call insert(buf_name, s:skip_symbol)
let has_skipped = 0
break
endif
if token1['uniq'] == 0 && token1['single'] == 1
let has_skipped = 1
else
if has_skipped == 1
call insert(buf_name, s:skip_symbol)
let has_skipped = 0
endif
call insert(buf_name, token1['token'])
endif
if token1['uniq'] == 1
let has_uniq = 1
endif
endfor
if has_skipped == 1
call insert(buf_name, s:skip_symbol)
endif
return airline#extensions#tabline#formatters#default#wrap_name(a:bufnr, join(buf_name, '/'))
else
return airline#extensions#tabline#formatters#default#format(a:bufnr, a:buffers)
endif
endfunction

View File

@@ -0,0 +1,141 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:spc = g:airline_symbols.space
let s:current_bufnr = -1
let s:current_tabnr = -1
let s:current_modified = 0
function! airline#extensions#tabline#tabs#off()
augroup airline_tabline_tabs
autocmd!
augroup END
endfunction
function! airline#extensions#tabline#tabs#on()
augroup airline_tabline_tabs
autocmd!
autocmd BufDelete * call airline#extensions#tabline#tabs#invalidate()
augroup END
endfunction
function! airline#extensions#tabline#tabs#invalidate()
if exists('#airline')
let s:current_bufnr = -1
endif
endfunction
function! airline#extensions#tabline#tabs#get()
let curbuf = bufnr('%')
let curtab = tabpagenr()
try
call airline#extensions#tabline#tabs#map_keys()
catch
" no-op
endtry
if curbuf == s:current_bufnr && curtab == s:current_tabnr && &columns == s:column_width
if !g:airline_detect_modified || getbufvar(curbuf, '&modified') == s:current_modified
return s:current_tabline
endif
endif
let s:filtered_buflist = airline#extensions#tabline#buflist#list()
let b = airline#extensions#tabline#new_builder()
call airline#extensions#tabline#add_label(b, 'tabs', 0)
function! b.get_group(i) dict
let curtab = tabpagenr()
let group = 'airline_tab'
if a:i == curtab
let group = 'airline_tabsel'
if g:airline_detect_modified
for bi in tabpagebuflist(curtab)
if index(s:filtered_buflist,bi) != -1
if getbufvar(bi, '&modified')
let group = 'airline_tabmod'
endif
endif
endfor
endif
let s:current_modified = (group == 'airline_tabmod') ? 1 : 0
endif
return group
endfunction
function! b.get_title(i) dict
let val = '%('
if get(g:, 'airline#extensions#tabline#show_tab_nr', 1)
let val .= airline#extensions#tabline#tabs#tabnr_formatter(a:i, tabpagebuflist(a:i))
endif
return val.'%'.a:i.'T %{airline#extensions#tabline#title('.a:i.')} %)'
endfunction
call b.insert_titles(curtab, 1, tabpagenr('$'))
call b.add_section('airline_tabfill', '')
call b.split()
call b.add_section('airline_tabfill', '')
if get(g:, 'airline#extensions#tabline#show_close_button', 1)
call b.add_section('airline_tab_right', ' %999X'.
\ get(g:, 'airline#extensions#tabline#close_symbol', 'X').'%X ')
endif
if get(g:, 'airline#extensions#tabline#show_splits', 1) == 1
let buffers = tabpagebuflist(curtab)
for nr in buffers
if index(s:filtered_buflist,nr) != -1
let group = airline#extensions#tabline#group_of_bufnr(buffers, nr) . "_right"
call b.add_section_spaced(group, '%(%{airline#extensions#tabline#get_buffer_name('.nr.')}%)')
endif
endfor
if get(g:, 'airline#extensions#tabline#show_buffers', 1)
call airline#extensions#tabline#add_label(b, 'buffers', 1)
endif
endif
call airline#extensions#tabline#add_tab_label(b)
let s:current_bufnr = curbuf
let s:current_tabnr = curtab
let s:column_width = &columns
let s:current_tabline = b.build()
return s:current_tabline
endfunction
function! airline#extensions#tabline#tabs#map_keys()
if maparg('<Plug>AirlineSelectTab1', 'n') is# ':1tabn<CR>'
return
endif
let bidx_mode = get(g:, 'airline#extensions#tabline#buffer_idx_mode', 1)
if bidx_mode == 1
for i in range(1, 10)
exe printf('noremap <silent> <Plug>AirlineSelectTab%d :%dtabn<CR>', i%10, i)
endfor
else
for i in range(11, 99)
exe printf('noremap <silent> <Plug>AirlineSelectTab%d :%dtabn<CR>', i, i-10)
endfor
endif
noremap <silent> <Plug>AirlineSelectPrevTab gT
" tabn {count} goes to count tab does not go {count} tab pages forward!
noremap <silent> <Plug>AirlineSelectNextTab :<C-U>exe repeat(':tabn\|', v:count1)<cr>
endfunction
function! airline#extensions#tabline#tabs#tabnr_formatter(nr, i) abort
let formatter = get(g:, 'airline#extensions#tabline#tabnr_formatter', 'tabnr')
try
return airline#extensions#tabline#formatters#{formatter}#format(a:nr, a:i)
catch /^Vim\%((\a\+)\)\=:E117/ " catch E117, unknown function
" Function not found
return call(formatter, [a:nr, a:i])
catch
" something went wrong, return an empty string
return ""
endtry
endfunction

View File

@@ -0,0 +1,156 @@
" MIT License. Copyright (c) 2016-2021 Kevin Sapper et al.
" PLugin: https://github.com/s1341/vim-tabws
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:current_bufnr = -1
let s:current_modified = 0
let s:current_tabnr = -1
let s:current_tabline = ''
let s:highlight_groups = ['hid', 0, '', 'sel', 'mod_unsel', 0, 'mod_unsel', 'mod']
function! airline#extensions#tabline#tabws#off()
augroup airline_tabline_tabws
autocmd!
augroup END
endfunction
function! airline#extensions#tabline#tabws#on()
augroup airline_tabline_tabws
autocmd!
autocmd BufDelete * call airline#extensions#tabline#tabws#invalidate()
augroup END
endfunction
function! airline#extensions#tabline#tabws#invalidate()
if exists('#airline')
let s:current_bufnr = -1
let s:current_tabnr = -1
endif
endfunction
function! airline#extensions#tabline#tabws#add_buffer_section(builder, cur_tab, cur_buf, pull_right)
let pos_extension = (a:pull_right ? '_right' : '')
let bufnr_list = tabws#getbuffersfortab(a:cur_tab)
if index(bufnr_list, a:cur_buf) == -1 && a:cur_tab == s:current_tabnr
return 0
endif
let s:current_modified = getbufvar(a:cur_buf, '&modified')
let visible_list = tabpagebuflist(a:cur_tab)
for buffer in bufnr_list
let group = 'airline_tab'
\ .s:highlight_groups[(4 * getbufvar(buffer, '&modified')) + (2 * (index(visible_list, buffer) != -1)) + (a:cur_buf == buffer)]
\ .pos_extension
let buf_name = '%(%{airline#extensions#tabline#get_buffer_name('.buffer.')}%)'
if has("tablineat")
let buf_name = '%'.buffer.'@airline#extensions#tabline#buffers#clickbuf@'.buf_name.'%X'
endif
call a:builder.add_section_spaced(group, buf_name)
endfor
" add by tenfy(tenfyzhong@qq.com)
" if the selected buffer was updated
" return true
return 1
endfunction
function! airline#extensions#tabline#tabws#add_tab_section(builder, pull_right)
let pos_extension = (a:pull_right ? '_right' : '')
for tab in range(1, tabpagenr('$'))
let current = tab == tabpagenr()
let group = 'airline_tab'
\ .s:highlight_groups[(3 * current)]
\ .pos_extension
if get(g:, 'airline#extensions#tabline#tabws_show_tab_nr', 0) == 0
call a:builder.add_section_spaced(group, '%'.tab.'T'.tabws#gettabname(tab).'%T')
else
call a:builder.add_section_spaced(group, '%'.tab.'T'.tab.(g:airline_symbols.space).tabws#gettabname(tab).'%T')
endif
endfor
endfunction
function! airline#extensions#tabline#tabws#get()
let cur_buf = bufnr('%')
let buffer_label = get(g:, 'airline#extensions#tabline#buffers_label', 'buffers')
let tab_label = get(g:, 'airline#extensions#tabline#tabs_label', 'tabs')
let switch_buffers_and_tabs = get(g:, 'airline#extensions#tabline#switch_buffers_and_tabs', 0)
try
call airline#extensions#tabline#tabs#map_keys()
endtry
let cur_tab = tabpagenr()
if cur_buf == s:current_bufnr && cur_tab == s:current_tabnr
if !g:airline_detect_modified || getbufvar(cur_buf, '&modified') == s:current_modified
return s:current_tabline
endif
endif
let builder = airline#extensions#tabline#new_builder()
let show_buffers = get(g:, 'airline#extensions#tabline#show_buffers', 1)
let show_tabs = get(g:, 'airline#extensions#tabline#show_tabs', 1)
let AppendBuffers = function('airline#extensions#tabline#tabws#add_buffer_section', [builder, cur_tab, cur_buf])
let AppendTabs = function('airline#extensions#tabline#tabws#add_tab_section', [builder])
let AppendLabel = function(builder.add_section_spaced, ['airline_tabtype'], builder)
" <= 1: |{Tabs} <tab|
" == 2: |{Buffers} <buffers|
" == 3: |buffers> {Buffers} {Tabs} <tabs|
let showing_mode = (2 * show_buffers) + (show_tabs)
let ignore_update = 0
" Add left tabline content
if showing_mode <= 1 " Tabs only mode
call AppendTabs(0)
elseif showing_mode == 2 " Buffers only mode
let ignore_update = !AppendBuffers(0)
else
if !switch_buffers_and_tabs
call AppendLabel(buffer_label)
let ignore_update = !AppendBuffers(0)
else
call AppendLabel(tab_label)
call AppendTabs(0)
endif
endif
if ignore_update | return s:current_tabline | endif
call builder.add_section('airline_tabfill', '')
call builder.split()
call builder.add_section('airline_tabfill', '')
" Add right tabline content
if showing_mode <= 1 " Tabs only mode
call AppendLabel(tab_label)
elseif showing_mode == 2 " Buffers only mode
call AppendLabel(buffer_label)
else
if !switch_buffers_and_tabs
call AppendTabs(1)
call AppendLabel(tab_label)
else
let ignore_update = AppendBuffers(1)
call AppendLabel(buffer_label)
endif
endif
if ignore_update | return s:current_tabline | endif
let s:current_bufnr = cur_buf
let s:current_tabnr = cur_tab
let s:current_tabline = builder.build()
return s:current_tabline
endfunction

View File

@@ -0,0 +1,404 @@
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" xTabline - Reduced version for vim-airline
" Plugin: https://github.com/mg979/vim-xtabline
" MIT License Copyright (C) 2018-2021 Gianmaria Bajo <mg1979.git@gmail.com>
" tabpagecd:
" expanded version by mg979
" MIT License Copyright (C) 2012-2013 Kana Natsuno <http://whileimautomaton.net/>
" MIT License Copyright (C) 2018-2021 Gianmaria Bajo <mg1979.git@gmail.com>
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#init()
let s:state = 0
" initialize mappings
call airline#extensions#tabline#xtabline#maps()
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Variables
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
let g:loaded_xtabline = 1
let s:most_recent = -1
let s:xtabline_filtering = 1
let t:xtl_excluded = get(g:, 'airline#extensions#tabline#exclude_buffers', [])
let t:xtl_accepted = []
let g:xtabline_include_previews = get(g:, 'xtabline_include_previews', 1)
let g:xtabline_alt_action = get(g:, 'xtabline_alt_action', "buffer #")
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Autocommands
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
augroup plugin-xtabline
autocmd!
autocmd TabNew * call s:Do('new')
autocmd TabEnter * call s:Do('enter')
autocmd TabLeave * call s:Do('leave')
autocmd TabClosed * call s:Do('close')
autocmd BufEnter * if exists('#airline') | let g:xtabline_changing_buffer = 0 | endif
autocmd BufAdd,BufDelete,BufWrite * call airline#extensions#tabline#xtabline#filter_buffers()
augroup END
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Commands
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
com! XTabReopen call airline#extensions#tabline#xtabline#reopen_last_tab()
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Mappings
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#maps()
if !exists('g:xtabline_disable_keybindings')
fun! s:mapkeys(keys, plug)
if empty(mapcheck(a:keys)) && !hasmapto(a:plug)
silent! execute 'nmap <unique> '.a:keys.' '.a:plug
endif
endfun
call s:mapkeys('<F5>','<Plug>XTablineToggleTabs')
call s:mapkeys('<leader><F5>','<Plug>XTablineToggleFiltering')
call s:mapkeys('<BS>','<Plug>XTablineSelectBuffer')
call s:mapkeys(']l','<Plug>XTablineNextBuffer')
call s:mapkeys('[l','<Plug>XTablinePrevBuffer')
call s:mapkeys('<leader>tr','<Plug>XTablineReopen')
endif
nnoremap <unique> <script> <Plug>XTablineToggleTabs <SID>ToggleTabs
nnoremap <silent> <SID>ToggleTabs :call airline#extensions#tabline#xtabline#toggle_tabs()<cr>
nnoremap <unique> <script> <Plug>XTablineToggleFiltering <SID>ToggleFiltering
nnoremap <silent> <SID>ToggleFiltering :call airline#extensions#tabline#xtabline#toggle_buffers()<cr>
nnoremap <unique> <script> <Plug>XTablineSelectBuffer <SID>SelectBuffer
nnoremap <silent> <expr> <SID>SelectBuffer g:xtabline_changing_buffer ? "\<C-c>" : ":<C-u>call airline#extensions#tabline#xtabline#select_buffer(v:count)\<cr>"
nnoremap <unique> <script> <Plug>XTablineNextBuffer <SID>NextBuffer
nnoremap <silent> <expr> <SID>NextBuffer airline#extensions#tabline#xtabline#next_buffer(v:count1)
nnoremap <unique> <script> <Plug>XTablinePrevBuffer <SID>PrevBuffer
nnoremap <silent> <expr> <SID>PrevBuffer airline#extensions#tabline#xtabline#prev_buffer(v:count1)
nnoremap <unique> <script> <Plug>XTablineReopen <SID>ReopenLastTab
nnoremap <silent> <SID>ReopenLastTab :XTabReopen<cr>
if get(g:, 'xtabline_cd_commands', 0)
map <unique> <leader>cdc <Plug>XTablineCdCurrent
map <unique> <leader>cdd <Plug>XTablineCdDown1
map <unique> <leader>cd2 <Plug>XTablineCdDown2
map <unique> <leader>cd3 <Plug>XTablineCdDown3
map <unique> <leader>cdh <Plug>XTablineCdHome
nnoremap <unique> <script> <Plug>XTablineCdCurrent :cd %:p:h<cr>:call airline#util#doautocmd('BufAdd')<cr>:pwd<cr>
nnoremap <unique> <script> <Plug>XTablineCdDown1 :cd %:p:h:h<cr>:call airline#util#doautocmd('BufAdd')<cr>:pwd<cr>
nnoremap <unique> <script> <Plug>XTablineCdDown2 :cd %:p:h:h:h<cr>:call airline#util#doautocmd('BufAdd')<cr>:pwd<cr>
nnoremap <unique> <script> <Plug>XTablineCdDown3 :cd %:p:h:h:h:h<cr>:call airline#util#doautocmd('BufAdd')<cr>:pwd<cr>
nnoremap <unique> <script> <Plug>XTablineCdHome :cd ~<cr>:call airline#util#doautocmd('BufAdd')<cr>:pwd<cr>
endif
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Commands functions
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#toggle_tabs()
"""Toggle between tabs/buffers tabline."""
if tabpagenr("$") == 1 | call airline#util#warning("There is only one tab.") | return | endif
if g:airline#extensions#tabline#show_tabs
let g:airline#extensions#tabline#show_tabs = 0
call airline#util#warning("Showing buffers")
else
let g:airline#extensions#tabline#show_tabs = 1
call airline#util#warning("Showing tabs")
endif
doautocmd BufAdd
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#toggle_buffers()
"""Toggle buffer filtering in the tabline."""
if s:xtabline_filtering
let s:xtabline_filtering = 0
let g:airline#extensions#tabline#exclude_buffers = []
call airline#util#warning("Buffer filtering turned off")
doautocmd BufAdd
else
let s:xtabline_filtering = 1
call airline#extensions#tabline#xtabline#filter_buffers()
call airline#util#warning("Buffer filtering turned on")
doautocmd BufAdd
endif
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#reopen_last_tab()
"""Reopen the last closed tab."""
if !exists('s:most_recently_closed_tab')
call airline#util#warning("No recent tabs.")
return
endif
let tab = s:most_recently_closed_tab
tabnew
let empty = bufnr("%")
let t:cwd = tab['cwd']
cd `=t:cwd`
let t:name = tab['name']
for buf in tab['buffers'] | execute "badd ".buf | endfor
execute "edit ".tab['buffers'][0]
execute "bdelete ".empty
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#filter_buffers()
"""Filter buffers so that only the ones within the tab's cwd will show up.
" 'accepted' is a list of buffer numbers, for quick access.
" 'excluded' is a list of buffer numbers, it will be used by Airline to hide buffers.
if !exists('#airline')
" airline disabled
return
endif
if !s:xtabline_filtering | return | endif
let g:airline#extensions#tabline#exclude_buffers = []
let t:xtl_excluded = g:airline#extensions#tabline#exclude_buffers
let t:xtl_accepted = [] | let accepted = t:xtl_accepted
let previews = g:xtabline_include_previews
" bufnr(0) is the alternate buffer
for buf in range(1, bufnr("$"))
if !buflisted(buf) | continue | endif
" get the path
let path = expand("#".buf.":p")
" confront with the cwd
if !previews && path =~ "^".getcwd()
call add(accepted, buf)
elseif previews && path =~ getcwd()
call add(accepted, buf)
else
call add(t:xtl_excluded, buf)
endif
endfor
call s:RefreshTabline()
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#next_buffer(nr)
"""Switch to next visible buffer."""
if ( s:NotEnoughBuffers() || !s:xtabline_filtering ) | return | endif
let accepted = t:xtl_accepted
let ix = index(accepted, bufnr("%"))
let target = ix + a:nr
let total = len(accepted)
if ix == -1
" not in index, go back to most recent or back to first
if s:most_recent == -1 || s:most_recent >= total
let s:most_recent = 0
endif
elseif target >= total
" over last buffer
while target >= total | let target -= total | endwhile
let s:most_recent = target
else
let s:most_recent = target
endif
return ":buffer " . accepted[s:most_recent] . "\<cr>"
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#prev_buffer(nr)
"""Switch to previous visible buffer."""
if ( s:NotEnoughBuffers() || !s:xtabline_filtering ) | return | endif
let accepted = t:xtl_accepted
let ix = index(accepted, bufnr("%"))
let target = ix - a:nr
let total = len(accepted)
if ix == -1
" not in index, go back to most recent or back to first
if s:most_recent == -1 || s:most_recent >= total
let s:most_recent = 0
endif
elseif target < 0
" before first buffer
while target < 0 | let target += total | endwhile
let s:most_recent = target
else
let s:most_recent = target
endif
return ":buffer " . accepted[s:most_recent] . "\<cr>"
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#select_buffer(nr)
"""Switch to visible buffer in the tabline with [count]."""
if ( a:nr == 0 || !s:xtabline_filtering ) | execute g:xtabline_alt_action | return | endif
let accepted = t:xtl_accepted
if (a:nr > len(accepted)) || s:NotEnoughBuffers() || accepted[a:nr - 1] == bufnr("%")
return
else
let g:xtabline_changing_buffer = 1
execute "buffer ".accepted[a:nr - 1]
endif
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:TabBuffers()
"""Return a list of buffers names for this tab."""
return map(copy(t:xtl_accepted), 'bufname(v:val)')
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Helper functions
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:NotEnoughBuffers()
"""Just return if there aren't enough buffers."""
if len(t:xtl_accepted) < 2
if index(t:xtl_accepted, bufnr("%")) == -1
return
elseif !len(t:xtl_accepted)
call airline#util#warning("No available buffers for this tab.")
else
call airline#util#warning("No other available buffers for this tab.")
endif
return 1
endif
endfunction
function! s:RefreshTabline()
call airline#extensions#tabline#buflist#invalidate()
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" TabPageCd
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" tabpagecd - Turn :cd into :tabpagecd, to use one tab page per project
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:InitCwds()
if !exists('g:xtab_cwds') | let g:xtab_cwds = [] | endif
while len(g:xtab_cwds) < tabpagenr("$")
call add(g:xtab_cwds, getcwd())
endwhile
let s:state = 1
let t:cwd = getcwd()
let s:last_tab = 0
call airline#extensions#tabline#xtabline#filter_buffers()
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! airline#extensions#tabline#xtabline#update_obsession()
let string = 'let g:xtab_cwds = '.string(g:xtab_cwds).' | call airline#extensions#tabline#xtabline#update_obsession()'
if !exists('g:obsession_append')
let g:obsession_append = [string]
else
call filter(g:obsession_append, 'v:val !~# "^let g:xtab_cwds"')
call add(g:obsession_append, string)
endif
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
function! s:Do(action)
if !exists('#airline')
" airline disabled
return
endif
let arg = a:action
if !s:state | call s:InitCwds() | return | endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
if arg == 'new'
call insert(g:xtab_cwds, getcwd(), tabpagenr()-1)
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
elseif arg == 'enter'
let t:cwd =g:xtab_cwds[tabpagenr()-1]
cd `=t:cwd`
call airline#extensions#tabline#xtabline#filter_buffers()
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
elseif arg == 'leave'
let t:cwd = getcwd()
let g:xtab_cwds[tabpagenr()-1] = t:cwd
let s:last_tab = tabpagenr() - 1
if !exists('t:name') | let t:name = t:cwd | endif
let s:most_recent_tab = {'cwd': t:cwd, 'name': t:name, 'buffers': s:TabBuffers()}
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
elseif arg == 'close'
let s:most_recently_closed_tab = copy(s:most_recent_tab)
call remove(g:xtab_cwds, s:last_tab)
endif
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
call airline#extensions#tabline#xtabline#update_obsession()
endfunction
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

View File

@@ -0,0 +1,64 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/majutsushi/tagbar
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':TagbarToggle')
finish
endif
let s:spc = g:airline_symbols.space
let s:init=0
" Arguments: current, sort, fname
function! airline#extensions#tagbar#get_status(...)
let builder = airline#builder#new({ 'active': a:1 })
call builder.add_section('airline_a', s:spc.'Tagbar'.s:spc)
call builder.add_section('airline_b', s:spc.a:2.s:spc)
call builder.add_section('airline_c', s:spc.a:3.s:spc)
return builder.build()
endfunction
function! airline#extensions#tagbar#inactive_apply(...)
if getwinvar(a:2.winnr, '&filetype') == 'tagbar'
return -1
endif
endfunction
let s:airline_tagbar_last_lookup_time = 0
let s:airline_tagbar_last_lookup_val = ''
function! airline#extensions#tagbar#currenttag()
if get(w:, 'airline_active', 0)
if !s:init
try
" try to load the plugin, if filetypes are disabled,
" this will cause an error, so try only once
let a = tagbar#currenttag('%s', '', '')
catch
endtry
unlet! a
let s:init=1
endif
let cursize = getfsize(fnamemodify(bufname('%'), ':p'))
if cursize > 0 && cursize > get(g:, 'airline#extensions#tagbar#max_filesize', 1024 * 1024)
return ''
endif
let flags = get(g:, 'airline#extensions#tagbar#flags', '')
" function tagbar#currenttag does not exist, if filetype is not enabled
if s:airline_tagbar_last_lookup_time != localtime() && exists("*tagbar#currenttag")
let s:airline_tagbar_last_lookup_val = tagbar#currenttag('%s', '', flags,
\ get(g:, 'airline#extensions#tagbar#searchmethod', 'nearest-stl'))
let s:airline_tagbar_last_lookup_time = localtime()
endif
return s:airline_tagbar_last_lookup_val
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'
call airline#parts#define_function('tagbar', 'airline#extensions#tagbar#currenttag')
endfunction

View File

@@ -0,0 +1,37 @@
" MIT License. Copyright (c) 2021 DEMAREST Maxime (maxime@indelog.fr)
" Plugin: https://github.com/yegappan/taglist/
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':TlistShowTag')
finish
endif
function! airline#extensions#taglist#currenttag()
" Update tag list if taglist is not loaded (else we get an empty tag name)
" Load yegappan/taglist and vim-scripts/taglist.vim only once.
let tlist_updated = 0
if !exists('*taglist#Tlist_Get_Tagname_By_Line()') && !exists('*Tlist_Get_Tagname_By_Line()')
TlistUpdate
let tlist_updated = 1
endif
if !tlist_updated && exists('*Tlist_Get_Filenames()')
let tlist_filenames = Tlist_Get_Filenames()
if stridx(type(tlist_filenames) == type([]) ? join(tlist_filenames, '\n') : tlist_filenames, expand('%:p')) < 0
TlistUpdate
endif
endif
" Is this function is not present it'means you use the old vertsion of
" tag list : https://github.com/vim-scripts/taglist.vim.
" Please use the new version : https://github.com/yegappan/taglist.
if exists('*taglist#Tlist_Get_Tagname_By_Line()')
return taglist#Tlist_Get_Tagname_By_Line()
else
return ''
endif
endfunction
function! airline#extensions#taglist#init(ext)
call airline#parts#define_function('taglist', 'airline#extensions#taglist#currenttag')
endfunction

View File

@@ -0,0 +1,80 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
call airline#parts#define_function('tmode', 'airline#extensions#term#termmode')
call airline#parts#define('terminal', {'text': get(g:airline_mode_map, 't', 't'), 'accent': 'bold'})
let s:spc = g:airline_symbols.space
let s:section_a = airline#section#create_left(['terminal', 'tmode'])
let s:section_z = airline#section#create(['linenr', 'maxlinenr'])
function! airline#extensions#term#apply(...) abort
if &buftype ==? 'terminal' || bufname(a:2.bufnr)[0] ==? '!'
call a:1.add_section_spaced('airline_a', s:section_a)
call a:1.add_section_spaced('airline_b', s:neoterm_id(a:2.bufnr))
call a:1.add_section('airline_term', s:spc.s:termname(a:2.bufnr))
call a:1.split()
call a:1.add_section('airline_y', '')
call a:1.add_section_spaced('airline_z', s:section_z)
return 1
endif
endfunction
function! airline#extensions#term#inactive_apply(...) abort
if getbufvar(a:2.bufnr, '&buftype') ==? 'terminal'
call a:1.add_section_spaced('airline_a', s:section_a)
call a:1.add_section_spaced('airline_b', s:neoterm_id(a:2.bufnr))
call a:1.add_section('airline_term', s:spc.s:termname(a:2.bufnr))
call a:1.split()
call a:1.add_section('airline_y', '')
call a:1.add_section_spaced('airline_z', s:section_z)
return 1
endif
endfunction
function! airline#extensions#term#termmode() abort
let mode = airline#parts#mode()[0]
if mode ==? 'T' || mode ==? '-'
" We don't need to output T, the statusline already says "TERMINAL".
" Also we don't want to output "-" on an inactive statusline.
let mode = ''
endif
return mode
endfunction
function! s:termname(bufnr) abort
let bufname = bufname(a:bufnr)
if has('nvim')
" Get rid of the leading "term", working dir and process ID.
" Afterwards, remove the possibly added neoterm ID.
return substitute(matchstr(bufname, 'term.*:\zs.*'),
\ ';#neoterm-\d\+', '', '')
else
if bufname =~? 'neoterm-\d\+'
" Do not return a redundant buffer name, when this is a neoterm terminal.
return ''
endif
" Get rid of the leading "!".
if bufname[0] ==? '!'
return bufname[1:]
else
return bufname
endif
endif
endfunction
function! s:neoterm_id(bufnr) abort
let id = getbufvar(a:bufnr, 'neoterm_id')
if id !=? ''
let id = 'neoterm-'.id
endif
return id
endfunction
function! airline#extensions#term#init(ext) abort
call a:ext.add_statusline_func('airline#extensions#term#apply')
call a:ext.add_inactive_statusline_func('airline#extensions#term#inactive_apply')
endfunction

View File

@@ -0,0 +1,28 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/edkolev/tmuxline.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':Tmuxline')
finish
endif
let s:tmuxline_snapshot_file = get(g:, 'airline#extensions#tmuxline#snapshot_file', '')
let s:color_template = get(g:, 'airline#extensions#tmuxline#color_template', 'normal')
function! airline#extensions#tmuxline#init(ext)
call a:ext.add_theme_func('airline#extensions#tmuxline#set_tmux_colors')
endfunction
function! airline#extensions#tmuxline#set_tmux_colors(palette)
let color_template = has_key(a:palette, s:color_template) ? s:color_template : 'normal'
let mode_palette = a:palette[color_template]
let tmuxline_theme = tmuxline#api#create_theme_from_airline(mode_palette)
call tmuxline#api#set_theme(tmuxline_theme)
if strlen(s:tmuxline_snapshot_file)
call tmuxline#api#snapshot(s:tmuxline_snapshot_file)
endif
endfunction

View File

@@ -0,0 +1,29 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/mbbill/undotree
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists(':UndotreeToggle')
finish
endif
function! airline#extensions#undotree#apply(...)
if exists('t:undotree')
if &ft == 'undotree'
if exists('*t:undotree.GetStatusLine')
call airline#extensions#apply_left_override('undo', '%{exists("t:undotree") ? t:undotree.GetStatusLine() : ""}')
else
call airline#extensions#apply_left_override('undotree', '%f')
endif
endif
if &ft == 'diff' && exists('*t:diffpanel.GetStatusLine')
call airline#extensions#apply_left_override('diff', '%{exists("t:diffpanel") ? t:diffpanel.GetStatusLine() : ""}')
endif
endif
endfunction
function! airline#extensions#undotree#init(ext)
call a:ext.add_statusline_func('airline#extensions#undotree#apply')
endfunction

View File

@@ -0,0 +1,25 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling, Christian Brabandt et al.
" Plugin: https://github.com/chrisbra/unicode.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_unicodePlugin', 0)
finish
endif
function! airline#extensions#unicode#apply(...)
if exists(':UnicodeTable') == 2 && bufname('') =~# '/UnicodeTable.txt'
call airline#parts#define('unicode', {
\ 'text': '[UnicodeTable]',
\ 'accent': 'bold' })
let w:airline_section_a = airline#section#create(['unicode'])
let w:airline_section_b = ''
let w:airline_section_c = ' '
let w:airline_section_y = ''
endif
endfunction
function! airline#extensions#unicode#init(ext)
call a:ext.add_statusline_func('airline#extensions#unicode#apply')
endfunction

View File

@@ -0,0 +1,25 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/Shougo/unite.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_unite', 0)
finish
endif
function! airline#extensions#unite#apply(...)
if &ft == 'unite'
call a:1.add_section('airline_a', ' Unite ')
call a:1.add_section('airline_b', ' %{get(unite#get_context(), "buffer_name", "")} ')
call a:1.add_section('airline_c', ' %{unite#get_status_string()} ')
call a:1.split()
call a:1.add_section('airline_y', ' %{get(unite#get_context(), "real_buffer_name", "")} ')
return 1
endif
endfunction
function! airline#extensions#unite#init(ext)
let g:unite_force_overwrite_statusline = 0
call a:ext.add_statusline_func('airline#extensions#unite#apply')
endfunction

View File

@@ -0,0 +1,27 @@
" MIT License. Copyright (c) 2021 DEMAREST Maxime (maxime@indelog.fr)
" Plugin: https://github.com/yegappan/lsp
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('*lsp#lsp#ErrorCount')
finish
endif
let s:error_symbol = get(g:, 'airline#extensions#vim9lsp#error_symbol', 'E:')
let s:warning_symbol = get(g:, 'airline#extensions#vim9lsp#warning_symbol', 'W:')
function! airline#extensions#vim9lsp#get_warnings() abort
let res = get(lsp#lsp#ErrorCount(), 'Warn', 0)
return res > 0 ? s:warning_symbol . res : ''
endfunction
function! airline#extensions#vim9lsp#get_errors() abort
let res = get(lsp#lsp#ErrorCount(), 'Error', 0)
return res > 0 ? s:error_symbol . res : ''
endfunction
function! airline#extensions#vim9lsp#init(ext) abort
call airline#parts#define_function('vim9lsp_warning_count', 'airline#extensions#vim9lsp#get_warnings')
call airline#parts#define_function('vim9lsp_error_count', 'airline#extensions#vim9lsp#get_errors')
endfunction

View File

@@ -0,0 +1,30 @@
" MIT License. Copyright (c) 2016-2021 Jerome Reybert et al.
" Plugin: https://github.com/jreybert/vimagit
" vim: et ts=2 sts=2 sw=2
" This plugin replaces the whole section_a when in vimagit buffer
scriptencoding utf-8
if !get(g:, 'loaded_magit', 0)
finish
endif
let s:commit_mode = {'ST': 'STAGING', 'CC': 'COMMIT', 'CA': 'AMEND'}
function! airline#extensions#vimagit#init(ext) abort
call a:ext.add_statusline_func('airline#extensions#vimagit#apply')
endfunction
function! airline#extensions#vimagit#get_mode() abort
if ( exists("*magit#get_current_mode") )
return magit#get_current_mode()
else
return get(s:commit_mode, b:magit_current_commit_mode, '???')
endif
endfunction
function! airline#extensions#vimagit#apply(...) abort
if ( &filetype == 'magit' )
let w:airline_section_a = '%{airline#extensions#vimagit#get_mode()}'
endif
endfunction

View File

@@ -0,0 +1,30 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/cdelledonne/vim-cmake
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#vimcmake#init(ext) abort
call a:ext.add_statusline_func('airline#extensions#vimcmake#apply')
call a:ext.add_inactive_statusline_func('airline#extensions#vimcmake#inactive_apply')
endfunction
function! airline#extensions#vimcmake#apply(...) abort
if &filetype ==# 'vimcmake'
let spc = g:airline_symbols.space
call a:1.add_section('airline_a', spc.'CMake'.spc)
call a:1.add_section('airline_b', spc.'%{cmake#statusline#GetBuildInfo(1)}'.spc)
call a:1.add_section('airline_c', spc.'%{cmake#statusline#GetCmdInfo()}'.spc)
return 1
endif
endfunction
function! airline#extensions#vimcmake#inactive_apply(...) abort
if getbufvar(a:2.bufnr, '&filetype') ==# 'vimcmake'
let spc = g:airline_symbols.space
call a:1.add_section('airline_a', spc.'[CMake]')
call a:1.add_section('airline_b', spc.'%{cmake#statusline#GetBuildInfo(0)}')
call a:1.add_section('airline_c', spc.'%{cmake#statusline#GetCmdInfo()}')
return 1
endif
endfunction

View File

@@ -0,0 +1,84 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/lervag/vimtex
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:spc = g:airline_symbols.space
function! s:SetDefault(var, val)
if !exists(a:var)
execute 'let ' . a:var . '=' . string(a:val)
endif
endfunction
" Left and right delimiters (added only when status string is not empty)
call s:SetDefault( 'g:airline#extensions#vimtex#left', "{")
call s:SetDefault( 'g:airline#extensions#vimtex#right', "}")
" The current tex file is the main project file
call s:SetDefault( 'g:airline#extensions#vimtex#main', "" )
"
" The current tex file is a subfile of the project
" and the compilation is set for the main file
call s:SetDefault( 'g:airline#extensions#vimtex#sub_main', "m")
"
" The current tex file is a subfile of the project
" and the compilation is set for this subfile
call s:SetDefault( 'g:airline#extensions#vimtex#sub_local', "l")
"
" Compilation is running and continuous compilation is off
call s:SetDefault( 'g:airline#extensions#vimtex#compiled', "c₁")
" Compilation is running and continuous compilation is on
call s:SetDefault( 'g:airline#extensions#vimtex#continuous', "c")
" Viewer is opened
call s:SetDefault( 'g:airline#extensions#vimtex#viewer', "v")
function! airline#extensions#vimtex#init(ext)
call airline#parts#define_raw('vimtex', '%{airline#extensions#vimtex#get_scope()}')
call a:ext.add_statusline_func('airline#extensions#vimtex#apply')
endfunction
function! airline#extensions#vimtex#apply(...)
if exists("b:vimtex")
let w:airline_section_x = get(w:, 'airline_section_x', g:airline_section_x)
let w:airline_section_x.=s:spc.g:airline_left_alt_sep.s:spc.'%{airline#extensions#vimtex#get_scope()}'
endif
endfunction
function! airline#extensions#vimtex#get_scope()
let l:status = ''
let vt_local = get(b:, 'vimtex_local', {})
if empty(vt_local)
let l:status .= g:airline#extensions#vimtex#main
else
if get(vt_local, 'active')
let l:status .= g:airline#extensions#vimtex#sub_local
else
let l:status .= g:airline#extensions#vimtex#sub_main
endif
endif
if get(get(get(b:, 'vimtex', {}), 'viewer', {}), 'xwin_id')
let l:status .= g:airline#extensions#vimtex#viewer
endif
let l:compiler = get(get(b:, 'vimtex', {}), 'compiler', {})
if !empty(l:compiler)
if has_key(l:compiler, 'is_running') && b:vimtex.compiler.is_running()
if get(l:compiler, 'continuous')
let l:status .= g:airline#extensions#vimtex#continuous
else
let l:status .= g:airline#extensions#vimtex#compiled
endif
endif
endif
if !empty(l:status)
let l:status = g:airline#extensions#vimtex#left . l:status . g:airline#extensions#vimtex#right
endif
return l:status
endfunction

View File

@@ -0,0 +1,32 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/jmcantrell/vim-virtualenv
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
let s:spc = g:airline_symbols.space
function! airline#extensions#virtualenv#init(ext)
call a:ext.add_statusline_func('airline#extensions#virtualenv#apply')
endfunction
function! airline#extensions#virtualenv#apply(...)
if match(get(g:, 'airline#extensions#virtualenv#ft', ['python']), &filetype) > -1
if get(g:, 'virtualenv_loaded', 0)
let statusline = virtualenv#statusline()
else
let statusline = fnamemodify($VIRTUAL_ENV, ':t')
endif
if !empty(statusline)
call airline#extensions#append_to_section('x',
\ s:spc.g:airline_right_alt_sep.s:spc.statusline)
endif
endif
endfunction
function! airline#extensions#virtualenv#update()
if match(get(g:, 'airline#extensions#virtualenv#ft', ['python']), &filetype) > -1
call airline#extensions#virtualenv#apply()
call airline#update_statusline()
endif
endfunction

View File

@@ -0,0 +1,18 @@
" MIT License. Copyright (c) 2021 s1341 (github@shmarya.net)
" Plugin: https://github.com/liuchengxu/vista.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_vista', 0)
finish
endif
function! airline#extensions#vista#currenttag() abort
if get(w:, 'airline_active', 0)
return airline#util#shorten(get(b:, 'vista_nearest_method_or_function', ''), 91, 9)
endif
endfunction
function! airline#extensions#vista#init(ext) abort
call airline#parts#define_function('vista', 'airline#extensions#vista#currenttag')
endfunction

View File

@@ -0,0 +1,199 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
" http://got-ravings.blogspot.com/2008/10/vim-pr0n-statusline-whitespace-flags.html
scriptencoding utf-8
let s:show_message = get(g:, 'airline#extensions#whitespace#show_message', 1)
let s:symbol = get(g:, 'airline#extensions#whitespace#symbol', g:airline_symbols.whitespace)
let s:default_checks = ['indent', 'trailing', 'mixed-indent-file', 'conflicts']
let s:enabled = get(g:, 'airline#extensions#whitespace#enabled', 1)
let s:skip_check_ft = {'make': ['indent', 'mixed-indent-file'],
\ 'csv': ['indent', 'mixed-indent-file'],
\ 'mail': ['trailing']}
function! s:check_mixed_indent()
let indent_algo = get(g:, 'airline#extensions#whitespace#mixed_indent_algo', 0)
if indent_algo == 1
" [<tab>]<space><tab>
" spaces before or between tabs are not allowed
let t_s_t = '(^\t* +\t\s*\S)'
" <tab>(<space> x count)
" count of spaces at the end of tabs should be less than tabstop value
let t_l_s = '(^\t+ {' . &ts . ',}' . '\S)'
return search('\v' . t_s_t . '|' . t_l_s, 'nw')
elseif indent_algo == 2
return search('\v(^\t* +\t\s*\S)', 'nw', 0, 500)
else
return search('\v(^\t+ +)|(^ +\t+)', 'nw', 0, 500)
endif
endfunction
function! s:check_mixed_indent_file()
let c_like_langs = get(g:, 'airline#extensions#c_like_langs',
\ [ 'arduino', 'c', 'cpp', 'cuda', 'go', 'javascript', 'ld', 'php' ])
if index(c_like_langs, &ft) > -1
" for C-like languages: allow /** */ comment style with one space before the '*'
let head_spc = '\v(^ +\*@!)'
else
let head_spc = '\v(^ +)'
endif
let indent_tabs = search('\v(^\t+)', 'nw')
let indent_spc = search(head_spc, 'nw')
if indent_tabs > 0 && indent_spc > 0
return printf("%d:%d", indent_tabs, indent_spc)
else
return ''
endif
endfunction
function! s:conflict_marker()
" Checks for git conflict markers
let annotation = '\%([0-9A-Za-z_.:]\+\)\?'
if match(['rst', 'markdown', 'rmd'], &ft) >= 0
" rst filetypes use '=======' as header
let pattern = '^\%(\%(<\{7} '.annotation. '\)\|\%(>\{7\} '.annotation.'\)\)$'
else
let pattern = '^\%(\%(<\{7} '.annotation. '\)\|\%(=\{7\}\)\|\%(>\{7\} '.annotation.'\)\)$'
endif
return search(pattern, 'nw')
endfunction
function! airline#extensions#whitespace#check()
let max_lines = get(g:, 'airline#extensions#whitespace#max_lines', 20000)
if &readonly || !&modifiable || !s:enabled || line('$') > max_lines
\ || get(b:, 'airline_whitespace_disabled', 0)
return ''
endif
let skip_check_ft = extend(s:skip_check_ft,
\ get(g:, 'airline#extensions#whitespace#skip_indent_check_ft', {}), 'force')
if !exists('b:airline_whitespace_check')
let b:airline_whitespace_check = ''
let checks = get(b:, 'airline_whitespace_checks', get(g:, 'airline#extensions#whitespace#checks', s:default_checks))
let trailing = 0
let check = 'trailing'
if index(checks, check) > -1 && index(get(skip_check_ft, &ft, []), check) < 0
try
let regexp = get(b:, 'airline_whitespace_trailing_regexp',
\ get(g:, 'airline#extensions#whitespace#trailing_regexp', '\s$'))
let trailing = search(regexp, 'nw')
catch
call airline#util#warning(printf('Whitespace: error occurred evaluating "%s"', regexp))
echomsg v:exception
return ''
endtry
endif
let mixed = 0
let check = 'indent'
if index(checks, check) > -1 && index(get(skip_check_ft, &ft, []), check) < 0
let mixed = s:check_mixed_indent()
endif
let mixed_file = ''
let check = 'mixed-indent-file'
if index(checks, check) > -1 && index(get(skip_check_ft, &ft, []), check) < 0
let mixed_file = s:check_mixed_indent_file()
endif
let long = 0
if index(checks, 'long') > -1 && &tw > 0
let long = search('\%>'.&tw.'v.\+', 'nw')
endif
let conflicts = 0
if index(checks, 'conflicts') > -1
let conflicts = s:conflict_marker()
endif
if trailing != 0 || mixed != 0 || long != 0 || !empty(mixed_file) || conflicts != 0
let b:airline_whitespace_check = s:symbol
if strlen(s:symbol) > 0
let space = (g:airline_symbols.space)
else
let space = ''
endif
if s:show_message
if trailing != 0
let trailing_fmt = get(g:, 'airline#extensions#whitespace#trailing_format', '[%s]trailing')
let b:airline_whitespace_check .= space.printf(trailing_fmt, trailing)
endif
if mixed != 0
let mixed_indent_fmt = get(g:, 'airline#extensions#whitespace#mixed_indent_format', '[%s]mixed-indent')
let b:airline_whitespace_check .= space.printf(mixed_indent_fmt, mixed)
endif
if long != 0
let long_fmt = get(g:, 'airline#extensions#whitespace#long_format', '[%s]long')
let b:airline_whitespace_check .= space.printf(long_fmt, long)
endif
if !empty(mixed_file)
let mixed_indent_file_fmt = get(g:, 'airline#extensions#whitespace#mixed_indent_file_format', '[%s]mix-indent-file')
let b:airline_whitespace_check .= space.printf(mixed_indent_file_fmt, mixed_file)
endif
if conflicts != 0
let conflicts_fmt = get(g:, 'airline#extensions#whitespace#conflicts_format', '[%s]conflicts')
let b:airline_whitespace_check .= space.printf(conflicts_fmt, conflicts)
endif
endif
endif
endif
return airline#util#shorten(b:airline_whitespace_check, 120, 9)
endfunction
function! airline#extensions#whitespace#toggle()
if s:enabled
augroup airline_whitespace
autocmd!
augroup END
augroup! airline_whitespace
let s:enabled = 0
else
call airline#extensions#whitespace#init()
let s:enabled = 1
endif
if exists("g:airline#extensions#whitespace#enabled")
let g:airline#extensions#whitespace#enabled = s:enabled
if s:enabled && match(g:airline_section_warning, '#whitespace#check') < 0
let g:airline_section_warning .= airline#section#create(['whitespace'])
call airline#update_statusline()
endif
endif
call airline#util#warning(printf('Whitespace checking: %s',(s:enabled ? 'Enabled' : 'Disabled')))
endfunction
function! airline#extensions#whitespace#disable()
if s:enabled
call airline#extensions#whitespace#toggle()
endif
endfunction
function! airline#extensions#whitespace#init(...)
call airline#parts#define_function('whitespace', 'airline#extensions#whitespace#check')
unlet! b:airline_whitespace_check
augroup airline_whitespace
autocmd!
autocmd CursorHold,BufWritePost * call <sid>ws_refresh()
augroup END
endfunction
function! s:ws_refresh()
if !exists('#airline')
" airline disabled
return
endif
if get(b:, 'airline_ws_changedtick', 0) == b:changedtick
return
endif
unlet! b:airline_whitespace_check
if get(g:, 'airline_skip_empty_sections', 0)
exe ':AirlineRefresh!'
endif
let b:airline_ws_changedtick = b:changedtick
endfunction

View File

@@ -0,0 +1,30 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" Plugin: https://github.com/wesQ3/vim-windowswap
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('g:loaded_windowswap')
finish
endif
let s:spc = g:airline_symbols.space
if !exists('g:airline#extensions#windowswap#indicator_text')
let g:airline#extensions#windowswap#indicator_text = 'WS'
endif
function! airline#extensions#windowswap#init(ext)
call airline#parts#define_function('windowswap', 'airline#extensions#windowswap#get_status')
endfunction
function! airline#extensions#windowswap#get_status()
" use new tab-aware api if WS is up to date
let s:mark = exists('*WindowSwap#IsCurrentWindowMarked') ?
\WindowSwap#IsCurrentWindowMarked() :
\(WindowSwap#HasMarkedWindow() && WindowSwap#GetMarkedWindowNum() == winnr())
if s:mark
return g:airline#extensions#windowswap#indicator_text.s:spc
endif
return ''
endfunction

View File

@@ -0,0 +1,128 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2 fdm=marker
scriptencoding utf-8
" get wordcount {{{1
if exists('*wordcount')
function! s:get_wordcount(visual_mode_active)
if get(g:, 'actual_curbuf', '') != bufnr('')
return
endif
if &filetype ==# 'tex' && exists('b:vimtex') && get(g:, 'airline#extensions#vimtex#wordcount', 0)
" We're in a TeX file and vimtex is a plugin, so use vimtex's wordcount...
if a:visual_mode_active
" not useful?
return
else
return vimtex#misc#wordcount()
endif
else
let query = a:visual_mode_active ? 'visual_words' : 'words'
return get(wordcount(), query, 0)
endif
endfunction
else " Pull wordcount from the g_ctrl-g stats
function! s:get_wordcount(visual_mode_active)
let pattern = a:visual_mode_active
\ ? '^.\D*\d\+\D\+\d\+\D\+\zs\d\+'
\ : '^.\D*\%(\d\+\D\+\)\{5}\zs\d\+'
let save_status = v:statusmsg
if !a:visual_mode_active && col('.') == col('$')
let save_pos = getpos('.')
execute "silent normal! g\<c-g>"
call setpos('.', save_pos)
else
execute "silent normal! g\<c-g>"
endif
let stats = v:statusmsg
let v:statusmsg = save_status
return str2nr(matchstr(stats, pattern))
endfunction
endif
" format {{{1
let s:formatter = get(g:, 'airline#extensions#wordcount#formatter', 'default')
" wrapper function for compatibility; redefined below for old-style formatters
function! s:format_wordcount(wordcount)
return airline#extensions#wordcount#formatters#{s:formatter}#to_string(a:wordcount)
endfunction
" check user-defined formatter exists with appropriate functions, otherwise
" fall back to default
if s:formatter !=# 'default'
execute 'runtime! autoload/airline/extensions/wordcount/formatters/'.s:formatter.'.vim'
if !exists('*airline#extensions#wordcount#formatters#{s:formatter}#to_string')
if !exists('*airline#extensions#wordcount#formatters#{s:formatter}#format')
let s:formatter = 'default'
else
" redefine for backwords compatibility
function! s:format_wordcount(_)
if mode() ==? 'v'
return b:airline_wordcount
else
return airline#extensions#wordcount#formatters#{s:formatter}#format()
endif
endfunction
endif
endif
endif
" update {{{1
let s:wordcount_cache = 0 " cache wordcount for performance when force_update=0
function! s:update_wordcount(force_update)
let wordcount = s:get_wordcount(0)
if wordcount != s:wordcount_cache || a:force_update
let s:wordcount_cache = wordcount
let b:airline_wordcount = s:format_wordcount(wordcount)
endif
endfunction
function airline#extensions#wordcount#get()
if get(g:, 'airline#visual_active', 0)
return s:format_wordcount(s:get_wordcount(1))
else
if get(b:, 'airline_changedtick', 0) != b:changedtick
call s:update_wordcount(0)
let b:airline_changedtick = b:changedtick
endif
return get(b:, 'airline_wordcount', '')
endif
endfunction
" airline functions {{{1
" default filetypes:
function! airline#extensions#wordcount#apply(...)
let filetypes = get(g:, 'airline#extensions#wordcount#filetypes',
\ ['asciidoc', 'help', 'mail', 'markdown', 'rmd', 'nroff', 'org', 'rst', 'plaintex', 'tex', 'text'])
" export current filetypes settings to global namespace
let g:airline#extensions#wordcount#filetypes = filetypes
" Check if filetype needs testing
if did_filetype()
" correctly test for compound filetypes (e.g. markdown.pandoc)
let ft = substitute(&filetype, '\.', '\\|', 'g')
" Select test based on type of "filetypes": new=list, old=string
if type(filetypes) == get(v:, 't_list', type([]))
\ ? match(filetypes, '\<'. ft. '\>') > -1 || index(filetypes, 'all') > -1
\ : match(&filetype, filetypes) > -1
let b:airline_changedtick = -1
call s:update_wordcount(1) " force update: ensures initial worcount exists
elseif exists('b:airline_wordcount') " cleanup when filetype is removed
unlet b:airline_wordcount
endif
endif
if exists('b:airline_wordcount')
call airline#extensions#prepend_to_section(
\ 'z', '%{airline#extensions#wordcount#get()}')
endif
endfunction
function! airline#extensions#wordcount#init(ext)
call a:ext.add_statusline_func('airline#extensions#wordcount#apply')
endfunction

View File

@@ -0,0 +1,47 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#wordcount#formatters#default#update_fmt(...)
let s:fmt = get(g:, 'airline#extensions#wordcount#formatter#default#fmt', '%s words')
let s:fmt_short = get(g:, 'airline#extensions#wordcount#formatter#default#fmt_short', s:fmt == '%s words' ? '%sW' : s:fmt)
endfunction
" Reload format when statusline is rebuilt
call airline#extensions#wordcount#formatters#default#update_fmt()
if index(g:airline_statusline_funcrefs, function('airline#extensions#wordcount#formatters#default#update_fmt')) == -1
" only add it, if not already done
call airline#add_statusline_funcref(function('airline#extensions#wordcount#formatters#default#update_fmt'))
endif
if match(get(v:, 'lang', ''), '\v\cC|en') > -1
let s:decimal_group = ','
elseif match(get(v:, 'lang', ''), '\v\cde|dk|fr|pt') > -1
let s:decimal_group = '.'
else
let s:decimal_group = ''
endif
function! airline#extensions#wordcount#formatters#default#to_string(wordcount)
if airline#util#winwidth() > 85
if a:wordcount > 999
" Format number according to locale, e.g. German: 1.245 or English: 1,245
let wordcount = substitute(a:wordcount, '\d\@<=\(\(\d\{3\}\)\+\)$', s:decimal_group.'&', 'g')
else
let wordcount = a:wordcount
endif
let str = printf(s:fmt, wordcount)
else
let str = printf(s:fmt_short, a:wordcount)
endif
let str .= g:airline_symbols.space
if !empty(g:airline_right_alt_sep)
let str .= g:airline_right_alt_sep . g:airline_symbols.space
endif
return str
endfunction

View File

@@ -0,0 +1,47 @@
" MIT License. Copyright (c) 2013-2021 Bailey Ling et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
function! airline#extensions#wordcount#formatters#readingtime#update_fmt(...) abort
let s:fmt = get(g:, 'airline#extensions#wordcount#formatter#readingtime#fmt', 'About %s minutes')
let s:fmt_short = get(g:, 'airline#extensions#wordcount#formatter#readingtime#fmt_short', s:fmt ==# 'About %s minutes' ? '%sW' : s:fmt)
endfunction
" Reload format when statusline is rebuilt
call airline#extensions#wordcount#formatters#readingtime#update_fmt()
if index(g:airline_statusline_funcrefs, function('airline#extensions#wordcount#formatters#readingtime#update_fmt')) == -1
" only add it, if not already done
call airline#add_statusline_funcref(function('airline#extensions#wordcount#formatters#readingtime#update_fmt'))
endif
if match(get(v:, 'lang', ''), '\v\cC|en') > -1
let s:decimal_group = ','
elseif match(get(v:, 'lang', ''), '\v\cde|dk|fr|pt') > -1
let s:decimal_group = '.'
else
let s:decimal_group = ''
endif
function! airline#extensions#wordcount#formatters#readingtime#to_string(wordcount) abort
if airline#util#winwidth() > 85
if a:wordcount > 999
" Format number according to locale, e.g. German: 1.245 or English: 1,245
let wordcount = substitute(a:wordcount, '\d\@<=\(\(\d\{3\}\)\+\)$', s:decimal_group.'&', 'g')
else
let wordcount = a:wordcount
endif
let str = printf(s:fmt, ceil(wordcount / 200.0))
else
let str = printf(s:fmt_short, ceil(a:wordcount / 200.0))
endif
let str .= g:airline_symbols.space
if !empty(g:airline_right_alt_sep)
let str .= g:airline_right_alt_sep . g:airline_symbols.space
endif
return str
endfunction

View File

@@ -0,0 +1,29 @@
" MIT License. Copyright (c) 2017-2021 YoungHoon Rhiu et al.
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !exists('g:XkbSwitchLib') && !exists('*FcitxCurrentIM')
finish
endif
function! airline#extensions#xkblayout#status()
if exists('g:XkbSwitchLib')
let keyboard_layout = libcall(g:XkbSwitchLib, 'Xkb_Switch_getXkbLayout', '')
let keyboard_layout = get(split(keyboard_layout, '\.'), -1, '')
else
" substitute keyboard-us to us
let keyboard_layout = substitute(FcitxCurrentIM(), 'keyboard-', '', 'g')
endif
let short_codes = get(g:, 'airline#extensions#xkblayout#short_codes', {'2SetKorean': 'KR', 'Chinese': 'CN', 'Japanese': 'JP'})
if has_key(short_codes, keyboard_layout)
let keyboard_layout = short_codes[keyboard_layout]
endif
return keyboard_layout
endfunction
function! airline#extensions#xkblayout#init(ext)
call airline#parts#define_function('xkblayout', 'airline#extensions#xkblayout#status')
endfunction

View File

@@ -0,0 +1,42 @@
" MIT License. Copyright (c) 2015-2021 Evgeny Firsov et al.
" Plugin: https://github.com/ycm-core/YouCompleteMe
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
if !get(g:, 'loaded_youcompleteme', 0)
finish
endif
let s:spc = g:airline_symbols.space
let s:error_symbol = get(g:, 'airline#extensions#ycm#error_symbol', 'E:')
let s:warning_symbol = get(g:, 'airline#extensions#ycm#warning_symbol', 'W:')
function! airline#extensions#ycm#init(ext)
call airline#parts#define_function('ycm_error_count', 'airline#extensions#ycm#get_error_count')
call airline#parts#define_function('ycm_warning_count', 'airline#extensions#ycm#get_warning_count')
endfunction
function! airline#extensions#ycm#get_error_count() abort
if exists("*youcompleteme#GetErrorCount")
let cnt = youcompleteme#GetErrorCount()
if cnt != 0
return s:error_symbol.cnt
endif
endif
return ''
endfunction
function! airline#extensions#ycm#get_warning_count()
if exists("*youcompleteme#GetWarningCount")
let cnt = youcompleteme#GetWarningCount()
if cnt != 0
return s:warning_symbol.cnt.s:spc
endif
endif
return ''
endfunction

View File

@@ -0,0 +1,27 @@
" MIT License. Copyright (c) 2021 Dmitry Geurkov (d.geurkov@gmail.com)
" Plugin: https://github.com/troydm/zoomwintab.vim
" vim: et ts=2 sts=2 sw=2
scriptencoding utf-8
" Avoid installing twice
if exists('g:loaded_vim_airline_zoomwintab')
finish
endif
let g:loaded_vim_airline_zoomwintab = 1
let s:zoomwintab_status_zoomed_in =
\ get(g:, 'airline#extensions#zoomwintab#status_zoomed_in', g:airline_left_alt_sep.' Zoomed')
let s:zoomwintab_status_zoomed_out =
\ get(g:, 'airline#extensions#zoomwintab#status_zoomed_out', '')
function! airline#extensions#zoomwintab#apply(...) abort
call airline#extensions#prepend_to_section('gutter',
\ exists('t:zoomwintab') ? s:zoomwintab_status_zoomed_in : s:zoomwintab_status_zoomed_out)
endfunction
function! airline#extensions#zoomwintab#init(ext) abort
call a:ext.add_statusline_func('airline#extensions#zoomwintab#apply')
endfunction