mirror of
https://github.com/vim-airline/vim-airline.git
synced 2026-08-12 19:06:56 +08:00
whitespace: support multiline statusline for warnings
Add a new airline_section_warning2 that displays whitespace warnings on a second statusline line when Vim supports the statuslineopt option (Vim 9.2.0083+) and g:airline_multiline is set. The second line only appears when there are actual whitespace issues, avoiding an empty second line when the buffer is clean. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
7fe264257e
commit
ee44d57525
@@ -6,7 +6,7 @@ scriptencoding utf-8
|
|||||||
let g:airline_statusline_funcrefs = get(g:, 'airline_statusline_funcrefs', [])
|
let g:airline_statusline_funcrefs = get(g:, 'airline_statusline_funcrefs', [])
|
||||||
let g:airline_inactive_funcrefs = get(g:, 'airline_inactive_statusline_funcrefs', [])
|
let g:airline_inactive_funcrefs = get(g:, 'airline_inactive_statusline_funcrefs', [])
|
||||||
|
|
||||||
let s:sections = ['a','b','c','gutter','x','y','z', 'error', 'warning']
|
let s:sections = ['a','b','c','gutter','x','y','z', 'error', 'warning', 'warning2']
|
||||||
let s:contexts = {}
|
let s:contexts = {}
|
||||||
let s:core_funcrefs = [
|
let s:core_funcrefs = [
|
||||||
\ function('airline#extensions#apply'),
|
\ function('airline#extensions#apply'),
|
||||||
|
|||||||
@@ -11,10 +11,11 @@ let s:section_truncate_width = get(g:, 'airline#extensions#default#section_trunc
|
|||||||
\ 'z': 45,
|
\ 'z': 45,
|
||||||
\ 'warning': 80,
|
\ 'warning': 80,
|
||||||
\ 'error': 80,
|
\ 'error': 80,
|
||||||
|
\ 'warning2': 80,
|
||||||
\ })
|
\ })
|
||||||
let s:layout = get(g:, 'airline#extensions#default#layout', [
|
let s:layout = get(g:, 'airline#extensions#default#layout', [
|
||||||
\ [ 'a', 'b', 'c' ],
|
\ [ 'a', 'b', 'c' ],
|
||||||
\ [ 'x', 'y', 'z', 'warning', 'error' ]
|
\ [ 'x', 'y', 'z', 'warning', 'error', 'warning2' ]
|
||||||
\ ])
|
\ ])
|
||||||
|
|
||||||
function! s:get_section(winnr, key, ...)
|
function! s:get_section(winnr, key, ...)
|
||||||
@@ -32,9 +33,24 @@ function! s:get_section(winnr, key, ...)
|
|||||||
return empty(text) ? '' : prefix.text.suffix
|
return empty(text) ? '' : prefix.text.suffix
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:eval_section_empty(content)
|
||||||
|
let exprlist = []
|
||||||
|
call substitute(a:content, '%{\([^}]*\)}', '\=add(exprlist, submatch(1))', 'g')
|
||||||
|
for expr in exprlist
|
||||||
|
try
|
||||||
|
if !empty(eval(expr))
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
catch
|
||||||
|
return 0
|
||||||
|
endtry
|
||||||
|
endfor
|
||||||
|
return 1
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! s:build_sections(builder, context, keys)
|
function! s:build_sections(builder, context, keys)
|
||||||
for key in a:keys
|
for key in a:keys
|
||||||
if (key == 'warning' || key == 'error') && !a:context.active
|
if (key == 'warning' || key == 'error' || key == 'warning2') && !a:context.active
|
||||||
continue
|
continue
|
||||||
endif
|
endif
|
||||||
call s:add_section(a:builder, a:context, key)
|
call s:add_section(a:builder, a:context, key)
|
||||||
@@ -49,21 +65,30 @@ if s:section_use_groups && (v:version >= 704 || (v:version >= 703 && has('patch8
|
|||||||
\ (v:version == 704 && !has("patch1511"))
|
\ (v:version == 704 && !has("patch1511"))
|
||||||
" i have no idea why the warning section needs special treatment, but it's
|
" i have no idea why the warning section needs special treatment, but it's
|
||||||
" needed to prevent separators from showing up
|
" needed to prevent separators from showing up
|
||||||
if ((a:key == 'error' || a:key == 'warning') && empty(s:get_section(a:context.winnr, a:key)))
|
if ((a:key == 'error' || a:key == 'warning' || a:key == 'warning2')
|
||||||
|
\ && empty(s:get_section(a:context.winnr, a:key)))
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
if condition
|
if a:key == 'warning2' && airline#util#has_multiline()
|
||||||
call a:builder.add_raw('%(')
|
let section = s:get_section(a:context.winnr, a:key)
|
||||||
endif
|
if !s:eval_section_empty(section)
|
||||||
call a:builder.add_section('airline_'.a:key, s:get_section(a:context.winnr, a:key))
|
call a:builder.add_raw('%@%#airline_warning#'.section)
|
||||||
if condition
|
endif
|
||||||
call a:builder.add_raw('%)')
|
else
|
||||||
|
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
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
else
|
else
|
||||||
" older version don't like the use of %(%)
|
" older version don't like the use of %(%)
|
||||||
function! s:add_section(builder, context, key)
|
function! s:add_section(builder, context, key)
|
||||||
if ((a:key == 'error' || a:key == 'warning') && empty(s:get_section(a:context.winnr, a:key)))
|
if ((a:key == 'error' || a:key == 'warning')
|
||||||
|
\ && empty(s:get_section(a:context.winnr, a:key)))
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
if a:key == 'warning'
|
if a:key == 'warning'
|
||||||
|
|||||||
@@ -161,6 +161,9 @@ function! airline#extensions#whitespace#check()
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
if airline#util#has_multiline()
|
||||||
|
return b:airline_whitespace_check
|
||||||
|
endif
|
||||||
return airline#util#shorten(b:airline_whitespace_check, 120, 9)
|
return airline#util#shorten(b:airline_whitespace_check, 120, 9)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
@@ -178,8 +181,16 @@ function! airline#extensions#whitespace#toggle()
|
|||||||
|
|
||||||
if exists("g:airline#extensions#whitespace#enabled")
|
if exists("g:airline#extensions#whitespace#enabled")
|
||||||
let g:airline#extensions#whitespace#enabled = s:enabled
|
let g:airline#extensions#whitespace#enabled = s:enabled
|
||||||
if s:enabled && match(g:airline_section_warning, '#whitespace#check') < 0
|
if s:enabled
|
||||||
let g:airline_section_warning .= airline#section#create(['whitespace'])
|
if airline#util#has_multiline() && exists('g:airline_section_warning2')
|
||||||
|
if match(g:airline_section_warning2, '#whitespace#check') < 0
|
||||||
|
let g:airline_section_warning2 .= airline#section#create(['whitespace'])
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
if match(g:airline_section_warning, '#whitespace#check') < 0
|
||||||
|
let g:airline_section_warning .= airline#section#create(['whitespace'])
|
||||||
|
endif
|
||||||
|
endif
|
||||||
call airline#update_statusline()
|
call airline#update_statusline()
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
@@ -211,7 +222,7 @@ function! s:ws_refresh()
|
|||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
unlet! b:airline_whitespace_check
|
unlet! b:airline_whitespace_check
|
||||||
if get(g:, 'airline_skip_empty_sections', 0)
|
if get(g:, 'airline_skip_empty_sections', 0) || airline#util#has_multiline()
|
||||||
exe ':AirlineRefresh!'
|
exe ':AirlineRefresh!'
|
||||||
endif
|
endif
|
||||||
let b:airline_ws_changedtick = b:changedtick
|
let b:airline_ws_changedtick = b:changedtick
|
||||||
|
|||||||
@@ -294,7 +294,16 @@ function! airline#init#sections()
|
|||||||
if !exists('g:airline_section_error')
|
if !exists('g:airline_section_error')
|
||||||
let g:airline_section_error = airline#section#create(['ycm_error_count', 'syntastic-err', 'eclim', 'neomake_error_count', 'ale_error_count', 'lsp_error_count', 'nvimlsp_error_count', 'languageclient_error_count', 'coc_error_count', 'vim9lsp_error_count'])
|
let g:airline_section_error = airline#section#create(['ycm_error_count', 'syntastic-err', 'eclim', 'neomake_error_count', 'ale_error_count', 'lsp_error_count', 'nvimlsp_error_count', 'languageclient_error_count', 'coc_error_count', 'vim9lsp_error_count'])
|
||||||
endif
|
endif
|
||||||
if !exists('g:airline_section_warning')
|
if airline#util#has_multiline()
|
||||||
let g:airline_section_warning = airline#section#create(['ycm_warning_count', 'syntastic-warn', 'neomake_warning_count', 'ale_warning_count', 'lsp_warning_count', 'nvimlsp_warning_count', 'languageclient_warning_count', 'whitespace', 'coc_warning_count', 'vim9lsp_warning_count'])
|
if !exists('g:airline_section_warning')
|
||||||
|
let g:airline_section_warning = airline#section#create(['ycm_warning_count', 'syntastic-warn', 'neomake_warning_count', 'ale_warning_count', 'lsp_warning_count', 'nvimlsp_warning_count', 'languageclient_warning_count', 'coc_warning_count', 'vim9lsp_warning_count'])
|
||||||
|
endif
|
||||||
|
if !exists('g:airline_section_warning2')
|
||||||
|
let g:airline_section_warning2 = airline#section#create(['whitespace'])
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
if !exists('g:airline_section_warning')
|
||||||
|
let g:airline_section_warning = airline#section#create(['ycm_warning_count', 'syntastic-warn', 'neomake_warning_count', 'ale_warning_count', 'lsp_warning_count', 'nvimlsp_warning_count', 'languageclient_warning_count', 'whitespace', 'coc_warning_count', 'vim9lsp_warning_count'])
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|||||||
@@ -250,3 +250,9 @@ function! airline#util#has_vim9_script()
|
|||||||
\ get(g:, "airline_experimental", 0))
|
\ get(g:, "airline_experimental", 0))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! airline#util#has_multiline()
|
||||||
|
" Returns true, if Vim supports multiline statusline (Vim 9.2.0083)
|
||||||
|
return (exists("+statuslineopt") &&
|
||||||
|
\ get(g:, "airline_multiline", 0))
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
|||||||
@@ -57,6 +57,8 @@ this: >
|
|||||||
+---------------------------------------------------------------------------+
|
+---------------------------------------------------------------------------+
|
||||||
| A | B | C X | Y | Z | [...] |
|
| A | B | C X | Y | Z | [...] |
|
||||||
+---------------------------------------------------------------------------+
|
+---------------------------------------------------------------------------+
|
||||||
|
| [...] |
|
||||||
|
+---------------------------------------------------------------------------+
|
||||||
|
|
||||||
The statusline is the colored line at the bottom, which contains the sections
|
The statusline is the colored line at the bottom, which contains the sections
|
||||||
(possibly in different colors):
|
(possibly in different colors):
|
||||||
@@ -82,6 +84,7 @@ section meaning (example)~
|
|||||||
<
|
<
|
||||||
[...] additional sections (warning/errors/statistics)
|
[...] additional sections (warning/errors/statistics)
|
||||||
from external plugins (e.g. YCM/syntastic/...)
|
from external plugins (e.g. YCM/syntastic/...)
|
||||||
|
Can be shown on a second line optionally.
|
||||||
|
|
||||||
For a better look, those sections can be colored differently, depending on
|
For a better look, those sections can be colored differently, depending on
|
||||||
the mode and whether the current file is 'modified'
|
the mode and whether the current file is 'modified'
|
||||||
@@ -124,6 +127,9 @@ values):
|
|||||||
" Currently: Enable Vim9 Script implementation
|
" Currently: Enable Vim9 Script implementation
|
||||||
let g:airline_experimental = 1
|
let g:airline_experimental = 1
|
||||||
|
|
||||||
|
* enable multiline feature (requires Vim 9.2.0083) >
|
||||||
|
let g:airline_multiline = 1
|
||||||
|
|
||||||
* the separator used on the left side >
|
* the separator used on the left side >
|
||||||
let g:airline_left_sep='>'
|
let g:airline_left_sep='>'
|
||||||
<
|
<
|
||||||
@@ -445,6 +451,7 @@ window.
|
|||||||
languageclient_error_count)
|
languageclient_error_count)
|
||||||
let g:airline_section_warning (ycm_warning_count, syntastic-warn,
|
let g:airline_section_warning (ycm_warning_count, syntastic-warn,
|
||||||
languageclient_warning_count, whitespace)
|
languageclient_warning_count, whitespace)
|
||||||
|
let g:airline_section_warning2 (whitespace) [optional]
|
||||||
|
|
||||||
" [*] This section needs at least the fugitive extension or else
|
" [*] This section needs at least the fugitive extension or else
|
||||||
" it will remain empty
|
" it will remain empty
|
||||||
|
|||||||
@@ -203,6 +203,9 @@ function! s:airline_toggle()
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
if airline#util#has_multiline() && &statuslineopt !~ 'maxheight:'
|
||||||
|
set statuslineopt+=maxheight:2
|
||||||
|
endif
|
||||||
if s:airline_initialized
|
if s:airline_initialized
|
||||||
call s:on_window_changed('Init')
|
call s:on_window_changed('Init')
|
||||||
endif
|
endif
|
||||||
|
|||||||
Reference in New Issue
Block a user