Hello, and apologies if this isn't the right place to post this question
but if it isn't I hope you'll help me out and point me in the right
direction.
I'm trying to make a custom tabline. I want the tabline to display "M",
"A", etc when a file's git status is modified, added, etc., but that part
isn't the focus of my question.
I'm trying to replicate the existing tabline functionality and I notice
that if a tab has 3 windows, the number 3 will be displayed before the name
of the file in the active window. I've nearly got that replicated But I'm
using the "#Title#" highlight group and it's not quite working. The
background color doesn't change correctly as compared to the original.
Should I make a custom highlight group here? I might publish this and I'd
like to find a solution that works with multiple color schemes instead of
just hardcoding my own thing.
Below is the relevant section of my vimrc. You can replicate the issue as
follows:
1. Copy the below code into a custom .vimrc
2. Run vim with vim -u .vimrc
3. Make a new tab with :tabnew
4. Split the tab with :vs
5. Move back and forth between the tabs with gt in command mode
6. Use \t and \y to use the default tabline and the custom tabline
respectively, and after setting this cycle through the tabs again and the
issue will be clear.
Thanks for your time and attention,
Nickolai
Reproducible .vimrc:
vim9script
runtime defaults.vim # Maintain the default behavior of remembering cursor
position
def g:MyTabLabel(n: number): string
var buflist = tabpagebuflist(n)
var winnr = tabpagewinnr(n)
var buffer_name = bufname(buflist[winnr - 1])
var name = "[No Name]"
if buffer_name != ""
name = fnamemodify(buffer_name, ':~:.')
endif
var gst = split(system('git status --porcelain=v1 ' .. name))
if len(gst) == 2
if gst[0] == '??'
gst[0] = 'U'
endif
return name .. ' ' .. gst[0]
endif
return name
enddef
def g:MyTabLine(): string
var s = ''
for i in range(tabpagenr('$'))
# select the highlighting
var highlight_g = '%#TabLine#'
if i + 1 == tabpagenr()
highlight_g = '%#TabLineSel#'
endif
s ..= highlight_g
# set the tab page number (for mouse clicks)
s ..= '%' .. (i + 1) .. 'T'
# Put the number of windows in this tab
var num_windows = tabpagewinnr(i + 1, '$')
if num_windows > 1
s ..= '%#Title# ' .. num_windows .. '' ..
highlight_g
endif
# the label is made by MyTabLabel
s ..= ' %{MyTabLabel(' .. (i + 1) .. ')} '
endfor
# after the last tab fill with TabLineFill and reset tab page nr
s ..= '%#TabLineFill#%T'
# right align the label to close the current tab page
if tabpagenr('$') > 1
s ..= '%=%#TabLine#%999Xclose'
endif
return s
enddef
set tabline=%!MyTabLine()
map <leader>t :set tabline=<CR>
map <leader>y :set tabline=%!MyTabLine()<CR>
map <leader>r :source .vimrc<CR>
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/bd03da6c-d8be-47b3-a539-3fd64219f72en%40googlegroups.com.