mirror of
https://github.com/vim-airline/vim-airline.git
synced 2026-04-28 01:15:29 +08:00
7fe264257e
Add a new tabpanel extension that provides airline-styled formatting for Vim's vertical tab panel feature. Uses airline tabline highlight groups (TabPanelFill, TabPanelSel, TabPanel) and refreshes them on theme changes. Requires a Vim version with 'tabpanel' support. Extension implemented using Vim9Script so not Neovim compatible fixes: #2724 closes: #2746 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
119 lines
2.5 KiB
VimL
119 lines
2.5 KiB
VimL
vim9script
|
|
|
|
# MIT License. Copyright (c) 2013-2026 Christian Brabandt et al.
|
|
# vim: et ts=2 sts=2 sw=2
|
|
|
|
scriptencoding utf-8
|
|
|
|
var spc = g:airline_symbols.space
|
|
|
|
def IsTabModified(tabnr: number): bool
|
|
if !g:airline_detect_modified
|
|
return false
|
|
endif
|
|
for bi in tabpagebuflist(tabnr)
|
|
if getbufvar(bi, '&modified')
|
|
return true
|
|
endif
|
|
endfor
|
|
return false
|
|
enddef
|
|
|
|
export def Get(): string
|
|
var tabnr = g:actual_curtabpage
|
|
var curtab = tabpagenr()
|
|
var label = ''
|
|
|
|
if tabnr == 1
|
|
label ..= '%#airline_tabfill#'
|
|
label ..= get(g:, 'airline#extensions#tabpanel#label', '[tabs]') .. "\n"
|
|
endif
|
|
|
|
var buflist = tabpagebuflist(tabnr)
|
|
var winnr = tabpagewinnr(tabnr)
|
|
var bufnr = buflist[winnr - 1]
|
|
var title = fnamemodify(bufname(bufnr), ':t')
|
|
if empty(title)
|
|
title = '[No Name]'
|
|
endif
|
|
|
|
if tabnr == curtab
|
|
if IsTabModified(tabnr)
|
|
label ..= '%#airline_tabmod#'
|
|
else
|
|
label ..= '%#airline_tabsel#'
|
|
endif
|
|
else
|
|
if IsTabModified(tabnr)
|
|
label ..= '%#airline_tabmod_unsel#'
|
|
else
|
|
label ..= '%#airline_tab#'
|
|
endif
|
|
endif
|
|
|
|
if get(g:, 'airline#extensions#tabline#show_tab_nr', 1)
|
|
label ..= spc .. tabnr
|
|
label ..= spc
|
|
endif
|
|
|
|
label ..= title .. spc
|
|
return label
|
|
enddef
|
|
|
|
def LinkHighlights(): void
|
|
highlight! link TabPanelFill airline_tabfill
|
|
highlight! link TabPanelSel airline_tabsel
|
|
highlight! link TabPanel airline_tab
|
|
enddef
|
|
|
|
export def LoadTheme(_: dict<any>): number
|
|
LinkHighlights()
|
|
return 0
|
|
enddef
|
|
|
|
def Enable(): void
|
|
LinkHighlights()
|
|
&tabpanel = '%!airline#extensions#tabpanel#Get()'
|
|
var cols = get(g:, 'airline#extensions#tabpanel#columns', 20)
|
|
var align = get(g:, 'airline#extensions#tabpanel#align', '')
|
|
var opts = 'columns:' .. cols
|
|
if !empty(align)
|
|
opts ..= ',align:' .. align
|
|
endif
|
|
&tabpanelopt = opts
|
|
&showtabpanel = 2
|
|
enddef
|
|
|
|
def Disable(): void
|
|
highlight! link TabPanelFill NONE
|
|
highlight! link TabPanelSel NONE
|
|
highlight! link TabPanel NONE
|
|
&tabpanel = ''
|
|
&tabpanelopt = ''
|
|
&showtabpanel = 0
|
|
enddef
|
|
|
|
export def Init(ext: dict<any>): void
|
|
if !exists('+tabpanel')
|
|
return
|
|
endif
|
|
|
|
autocmd_add([{
|
|
group: 'airline_tabpanel',
|
|
event: 'User',
|
|
pattern: 'AirlineToggledOn',
|
|
cmd: 'Enable()',
|
|
replace: true,
|
|
}])
|
|
autocmd_add([{
|
|
group: 'airline_tabpanel',
|
|
event: 'User',
|
|
pattern: 'AirlineToggledOff',
|
|
cmd: 'Disable()',
|
|
replace: true,
|
|
}])
|
|
|
|
ext.add_theme_func('airline#extensions#tabpanel#LoadTheme')
|
|
Enable()
|
|
enddef
|