aboutsummaryrefslogtreecommitdiff
path: root/vim
diff options
context:
space:
mode:
authorCamil Staps2022-11-03 10:42:38 +0100
committerCamil Staps2022-11-03 10:42:38 +0100
commitc0fc2db457af8cb09d337fbbfb689a4c5b6842b4 (patch)
treef88e095b4ec7f7222d6a14e2073650e82195717a /vim
parentAdd markdown preview plugin for vim (diff)
Vim: add custom tabline to shorten paths in nitrile-packages
Diffstat (limited to 'vim')
-rw-r--r--vim/.vimrc119
1 files changed, 119 insertions, 0 deletions
diff --git a/vim/.vimrc b/vim/.vimrc
index 144bee5..27055a6 100644
--- a/vim/.vimrc
+++ b/vim/.vimrc
@@ -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