diff options
author | Camil Staps | 2022-11-03 10:42:38 +0100 |
---|---|---|
committer | Camil Staps | 2022-11-03 10:42:38 +0100 |
commit | c0fc2db457af8cb09d337fbbfb689a4c5b6842b4 (patch) | |
tree | f88e095b4ec7f7222d6a14e2073650e82195717a /vim | |
parent | Add markdown preview plugin for vim (diff) |
Vim: add custom tabline to shorten paths in nitrile-packages
Diffstat (limited to 'vim')
-rw-r--r-- | vim/.vimrc | 119 |
1 files changed, 119 insertions, 0 deletions
@@ -244,3 +244,122 @@ command! -range Pv :silent :r !xsel -o -s " Emulate the default statusline: https://unix.stackexchange.com/a/243667 set statusline+=%=%(%l,%c%V\ %=\ %P%) + +" Shorten paths in nitrile-packages/*/PACKAGE/lib in tabline, for Clean +set tabline=%!TabLine() + +function TabLine() + " First generate all the titles + let titles = [] + let total_size = 0 + + for i in range(tabpagenr('$')) + let titles += [s:TabLabel(i+1)] + let total_size += len(titles[i]) + endfor + + " Add at least the title of the current tab + let after = tabpagenr() + let before = after - 2 + let s = '%' . after . 'T%#TabLineSel# ' . titles[before+1] . '%#TabLine#' + let selected_size = len(titles[before+1]) + let max_size = &columns - 8 + + " Continue adding titles after and before the current tab as long as it + " fits on the screen + while 1 + let break = 1 + + if after < len(titles) && selected_size + len(titles[after]) < max_size + " set the tab page number (for mouse clicks) + let s .= ' %' . (after+1) . 'T' . titles[after] + let selected_size += len(titles[after]) + 1 + let after += 1 + let break = 0 + endif + + if before >= 0 && selected_size + len(titles[before]) < max_size + let s = '%' . (before+1) . 'T' . titles[before] . ' ' . s + let selected_size += len(titles[before]) + 1 + let before -= 1 + let break = 0 + endif + + if break + break + endif + endwhile + + let s .= '%T' + + " If not all titles were shown, add spaces and guillements on either side + " of the tabline + if before != -1 + let s = ' ' . s + let selected_size += 3 + endif + if after != len(titles) + let s .= ' ' + let selected_size += 3 + endif + + if before != -1 || after != len(titles) + while selected_size < &columns + if after != len(titles) + let s .= '»' + let selected_size += 1 + endif + + if before != -1 && selected_size < &columns + let s = '«' . s + let selected_size += 1 + endif + endwhile + endif + + let s = '%#TabLine#' . s + + return s +endfunction + +function s:TabLabel(n) + let buflist = tabpagebuflist(a:n) + let winnr = tabpagewinnr(a:n) + + let flags = '' + " Number of windows in tab + if len(buflist) > 1 + let flags .= len(buflist) + endif + " Append asterisk if any window has changes + for b in buflist + if getbufinfo(b)[0].changed + let flags .= '*' + break + endif + endfor + + " Filename + let name = bufname(buflist[winnr-1]) + if name == '' + let name = 'ε' + else + " When this is a file from a Nitrile package, just display the file + " name and add 'pkg' to the flags + let nitrile_pattern = '.*/nitrile-packages/[^/]*/[^/]*/lib/\(.*\)' + let nitrile_match = match(name, nitrile_pattern) + + if match(name, nitrile_pattern) >= 0 + let flags .= flags == '' ? 'pkg' : ',pkg' + let name = substitute(name, nitrile_pattern, '\1', '') + else + let name = pathshorten(name) + endif + endif + + if flags != '' + return '[' . flags . '] ' . name + else + return name + endif +endfunction |