Created
September 19, 2012 07:35
-
-
Save kien/3748204 to your computer and use it in GitHub Desktop.
dyn tabline + unique bufname
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
" 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