Skip to content

Instantly share code, notes, and snippets.

@kien
Created September 19, 2012 07:35
Show Gist options
  • Save kien/3748204 to your computer and use it in GitHub Desktop.
Save kien/3748204 to your computer and use it in GitHub Desktop.
dyn tabline + unique bufname
" Unique Bufname {{{
fu! s:update_buflist(bufnr)
let bufname = bufname(str2nr(a:bufnr))
if bufname == ''
retu
en
let slash = exists('+ssl') && !&ssl ? '\' : '/'
" Check if the new buffer has a duplicate
let bufname = fnamemodify(bufname, ':t')
if exists('s:buflist_short') && exists('s:buflist') && !count(s:buflist_short, bufname)
cal extend(s:buflist, { a:bufnr : bufname })
cal extend(s:buflist_short, { a:bufnr : bufname })
retu
en
" Get the buffer list
let buflist = {}
let buflist_fname = {}
for bufnr in range(1, bufnr('$'))
let bufname = bufname(bufnr)
if bufname != '' && getbufvar(bufnr, '&bt') == ''
cal extend(buflist, { bufnr : reverse(split(fnamemodify(bufname, ':p'), slash)) })
cal extend(buflist_fname, { bufnr : fnamemodify(bufname, ':t') })
en
endfo
let s:buflist_short = copy(buflist_fname)
if buflist == {}
let s:buflist = {}
retu
en
" Maximum number of elements
let max = 0
for elements in values(buflist)
let clen = len(elements)
let max = clen > max ? clen : max
endfo
" For each element
let pos = 0
let uniques = []
wh pos < max && len(uniques) < len(buflist)
" For each buffer
for [bufnr, elements] in items(filter(copy(buflist), 'index(uniques, v:key) < 0'))
" Get the current element
let celement = get(elements, pos, '')
if celement == ''
brea
en
" If valid, add it to the list
cal extend(buflist_fname, { bufnr : ( pos > 0 ? celement.slash : '' ).buflist_fname[bufnr] })
" Get the elements with the same pos from the other buffers with the same name
let othereles = []
for each in values(filter(copy(buflist), 'v:key != bufnr && v:val[0] == elements[0]'))
let otherele = get(each, pos, '')
if otherele != ''
cal add(othereles, otherele)
en
endfo
" Add to the found list
if index(othereles, celement) < 0
cal add(uniques, bufnr)
en
endfo
for key in keys(buflist)
let buflist[key][0] = buflist_fname[key]
endfo
let pos += 1
endw
cal map(buflist_fname, 's:pathshorten(v:val, 40, slash)')
let s:buflist = buflist_fname
endf
fu! s:set_bufname_var()
if exists('s:buflist') && has_key(s:buflist, bufnr('%'))
let b:unique_bufname = s:buflist[bufnr('%')]
en
endf
fu! s:pathshorten(str, len, slash)
if strlen(a:str) > a:len
let paths = split(a:str, a:slash)
if len(paths) > 2
let max = a:len - strlen(paths[-1]) - 1
let path = join(paths[1:-2], a:slash)
let path = matchstr(path, '^.\{'.min([( max / 3 ), 10]).'}').'…'
\ .matchstr(path, '.\{'.min([( max / 3 - 1 ), 10]).'}$')
retu join([paths[0], path, paths[-1]], a:slash)
en
en
retu a:str
endf
aug UniqueBufname
au!
au VimEnter,BufReadPost * cal s:update_buflist(expand('<abuf>', 1))
au WinEnter,BufEnter * cal s:set_bufname_var()
aug END
"}}}
" Tabline {{{
fu! s:largest_win()
let winnr = winnr()
let dim = [( winwidth(winnr) * winheight(winnr) ), winnr]
if !getbufvar(winbufnr(winnr), '&mod')
for winnr in range(1, winnr('$'))
let cdim = winwidth(winnr) * winheight(winnr)
let bufnr = winbufnr(winnr)
if bufname(bufnr) != '' && getbufvar(bufnr, '&bt') == ''
let dim = cdim > dim[0] ? [cdim, winnr] : dim
en
endfo
en
let t:largest_win = dim[1]
endf
aug LargestTabWin
au!
au TabLeave * cal s:largest_win()
au TabEnter * unl! t:largest_win
aug END
fu! MyTabLine(...)
let [str, int, tb, len, maxw] = ['', 1, tabpagenr(), 0, &co]
for int in range(1, tabpagenr('$'))
if int == 26
brea
en
let largest_win = gettabvar(int, 'largest_win')
let winnr = largest_win != '' ? largest_win : tabpagewinnr(int)
let bufnr = tabpagebuflist(int)[winnr - 1]
let bufname = getbufvar(bufnr, 'unique_bufname')
if bufname == ''
let bufname = bufname(bufnr)
let bufname = bufname == ''
\ ? ( a:0 ? '[#]' : '[No Name]' )
\ : fnamemodify(bufname, ':t')
en
let pref = int.( getbufvar(bufnr, '&mod') ? ' +' : '' )
if a:0
let len += strlen(pref) + 6
let text = ' '.pref.' '.strpart(fnamemodify(bufname, ':t'), 0, 3).' '
el
let len += strlen(pref) + strlen(bufname) + 3
let text = ' '.pref.' '.bufname.' '
en
if a:0 && ( len + 1 ) >= maxw
brea
en
if !a:0 && ( len + 1 ) >= maxw
let str = MyTabLine(1)
el
let str .= '%'.int.'T'.( int == tb ? '%1*%#TabLineSel#' : '%2*%#TabLine#' ).text
en
endfo
if !a:0
let str .= '%T%#TabLineFill#%=' . ( tabpagenr('$') > 1 ? '%999XX' : 'X' )
en
retu str
endf
se tabline=%!MyTabLine()
"}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment