function! BufTabline() redir => bufsRaw silent buffers redir END let bufs = [] for buf in split(bufsRaw, "\n")[:16] let leftIdx = stridx(buf, '"') let rightIdx = strridx(buf, '"') let filename = substitute(buf[leftIdx + 1 : rightIdx - 1], "%", "%%", "g") let linenum = split(buf[rightIdx:], " ")[-1] let attrs = split(buf[:leftIdx-1], '\s\+') let attrs = map(attrs, 'substitute(v:val, "%", "%%", "g")') let attrs = (len(attrs) == 1) ? attrs[0] : attrs[0] . ":" . join(attrs[1:], "") let attrs = "%#TabLine#" . attrs . "%*" if len(filename) > 20 | let filename = "<" . filename[-(20-1):] | endif let hl = (match(attrs, "%%") == -1) ? "%#TabLine#:" : "%#TabLineSel#" let bufs = add(bufs, attrs . hl . filename . ":" . linenum . "%*") endfor return join(bufs, " ") endfunction set showtabline=2 set tabline=%!BufTabline()