diff options
| -rw-r--r-- | .config/nvim/init.lua | 129 | ||||
| -rw-r--r-- | .vimrc | 130 |
2 files changed, 162 insertions, 97 deletions
diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index ca19030..af9fe6a 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -1128,40 +1128,30 @@ function vimrc.statusline.build() local winid = vim.g.statusline_winid local bufnr = vim.fn.winbufnr(winid) local is_active = winid == vim.fn.win_getid() + local left if is_active then local mode, mode_hl = vimrc.statusline.mode() - local ro = vimrc.statusline.readonly(bufnr) - local fname = vimrc.statusline.filename(bufnr) - local mod = vimrc.statusline.modified(bufnr) - local linenum = vimrc.statusline.linenum(winid) - local fenc = vimrc.statusline.fenc_ff(bufnr) - local ft = vimrc.statusline.filetype(bufnr) - return string.format( - '%%#statusLineMode%s# %s %%#statusLine# %s%s%s %%= %s | %s | %s ', - mode_hl, - mode, - ro and ro .. ' ' or '', - fname, - mod and ' ' .. mod or '', - linenum, - fenc, - ft) + left = string.format('%%#statusLineMode%s# %s %%#statusLine#', mode_hl, mode) else - local ro = vimrc.statusline.readonly(bufnr) - local fname = vimrc.statusline.filename(bufnr) - local mod = vimrc.statusline.modified(bufnr) - local linenum = vimrc.statusline.linenum(winid) - local fenc = vimrc.statusline.fenc_ff(bufnr) - local ft = vimrc.statusline.filetype(bufnr) - return string.format( - ' %s%s%s %%= %s | %s | %s ', - ro and ro .. ' ' or '', - fname, - mod and ' ' .. mod or '', - linenum, - fenc, - ft) + left = '' end + local ro = vimrc.statusline.readonly(bufnr) + local fname = vimrc.statusline.filename(bufnr) + local mod = vimrc.statusline.modified(bufnr) + local linenum = vimrc.statusline.linenum(winid) + local fenc = vimrc.statusline.fenc(bufnr) + local ff = vimrc.statusline.ff(bufnr) + local ft = vimrc.statusline.filetype(bufnr) + return string.format( + '%s %s%s%s %%= %s %s%s %s ', + left, + ro and ro .. ' ' or '', + fname, + mod and ' ' .. mod or '', + linenum, + fenc, + ff, + ft) end function vimrc.statusline.mode() @@ -1228,9 +1218,51 @@ function vimrc.statusline.filename(bufnr) local name = vim.fn.bufname(bufnr) if name == '' then return '[No Name]' - else - return name end + + local other_paths = {} + for b = 1, vim.fn.bufnr('$') do + if vim.fn.bufexists(b) and b ~= bufnr then + other_paths[#other_paths+1] = vim.fn.split(vim.fn.bufname(b), '[\\/]') + end + end + local this_path = vim.fn.split(name, '[\\/]') + local i = 0 + while true do + local this_path_part = this_path[#this_path+i] or '' + local unique = true + local no_parts_remained = true + for _, other_path in ipairs(other_paths) do + local other_path_part = other_path[#other_path+i] or '' + if vim.stricmp(this_path_part, other_path_part) == 0 then + unique = false + break + end + if other_path_part ~= '' then + no_parts_remained = false + end + end + if unique then + break + end + if this_path_part == '' and no_parts_remained then + break + end + i = i - 1 + end + + local ret = '' + for k = i, 0 do + if #this_path < 1-k then + break + end + if k == i or k == #this_path then + ret = ret .. '/' .. this_path[#this_path+k] + else + ret = ret .. '/' .. vim.fn.matchlist(this_path[#this_path+k], '.')[1] + end + end + return ret:sub(2) end function vimrc.statusline.modified(bufnr) @@ -1249,9 +1281,8 @@ function vimrc.statusline.linenum(winid) return vim.fn.line('.', winid) .. '/' .. vim.fn.line('$', winid) end -function vimrc.statusline.fenc_ff(bufnr) +function vimrc.statusline.fenc(bufnr) local fenc = vim.fn.getbufvar(bufnr, '&fileencoding') - local ff = vim.fn.getbufvar(bufnr, '&fileformat') local bom = vim.fn.getbufvar(bufnr, '&bomb') -- BOMB!! if fenc == '' then @@ -1259,30 +1290,31 @@ function vimrc.statusline.fenc_ff(bufnr) fenc = fencs[1] or vim.o.encoding end if fenc == 'utf-8' then - fenc = bom == 1 and 'U8[BOM]' or 'U8' + return bom == 1 and 'U8[BOM]' or 'U8' elseif fenc == 'utf-16' then - fenc = 'U16[BE]' + return 'U16[BE]' elseif fenc == 'utf-16le' then - fenc = 'U16[LE]' + return 'U16[LE]' elseif fenc == 'ucs-4' then - fenc = 'U32[BE]' + return 'U32[BE]' elseif fenc == 'ucs-4le' then - fenc = 'U32[LE]' + return 'U32[LE]' else - fenc = fenc:upper() + return fenc:upper() end +end +function vimrc.statusline.ff(bufnr) + local ff = vim.fn.getbufvar(bufnr, '&fileformat') if ff == 'unix' then - ff = '' + return '' elseif ff == 'dos' then - ff = ' (CRLF)' + return ' (CRLF)' elseif ff == 'mac' then - ff = ' (CR)' + return ' (CR)' else - ff = ' (Unknown)' + return ' (Unknown)' end - - return fenc .. ff end function vimrc.statusline.filetype(bufnr) @@ -1306,10 +1338,9 @@ function vimrc.tabline.build() local buflist = vim.fn.tabpagebuflist(tabnr) local bufnr = buflist[vim.fn.tabpagewinnr(tabnr)] tal = tal .. string.format( - '%%#%s# %s%s ', + '%%#%s# %s ', is_active and 'TabLineSel' or 'TabLine', - vimrc.statusline.filename(bufnr), - #buflist == 1 and '' or '+') + vimrc.statusline.filename(bufnr)) end return tal .. '%#TabLineFill#' end @@ -1199,38 +1199,27 @@ function! Statusline_build() abort let is_active = winid ==# win_getid() if is_active let [mode, mode_hl] = s:statusline_mode() - let ro = s:statusline_readonly(bufnr) - let fname = s:statusline_filename(bufnr) - let mod = s:statusline_modified(bufnr) - let linenum = s:statusline_linenum(winid) - let fenc = s:statusline_fenc_ff(bufnr) - let ft = s:statusline_filetype(bufnr) - return printf( - \ '%%#statusLineMode%s# %s %%#statusLine# %s%s%s %%= %s | %s | %s ', - \ mode_hl, - \ mode, - \ empty(ro) ? '' : ro . ' ', - \ fname, - \ empty(mod) ? '' : ' ' . mod, - \ linenum, - \ fenc, - \ ft) + let left = printf('%%#statusLineMode%s# %s %%#StatusLine#', mode_hl, mode) else - let ro = s:statusline_readonly(bufnr) - let fname = s:statusline_filename(bufnr) - let mod = s:statusline_modified(bufnr) - let linenum = s:statusline_linenum(winid) - let fenc = s:statusline_fenc_ff(bufnr) - let ft = s:statusline_filetype(bufnr) - return printf( - \ ' %s%s%s %%= %s | %s | %s ', - \ empty(ro) ? '' : ro . ' ', - \ fname, - \ empty(mod) ? '' : ' ' . mod, - \ linenum, - \ fenc, - \ ft) + let left = '' endif + let ro = s:statusline_readonly(bufnr) + let fname = s:statusline_filename(bufnr) + let mod = s:statusline_modified(bufnr) + let linenum = s:statusline_linenum(winid) + let fenc = s:statusline_fenc(bufnr) + let ff = s:statusline_ff(bufnr) + let ft = s:statusline_filetype(bufnr) + return printf( + \ '%s %s%s%s %%= %s %s%s %s ', + \ left, + \ empty(ro) ? '' : ro . ' ', + \ fname, + \ empty(mod) ? '' : ' ' . mod, + \ linenum, + \ fenc, + \ ff, + \ ft) endfunction function! s:statusline_mode() abort @@ -1288,7 +1277,53 @@ endfunction function! s:statusline_filename(bufnr) abort let name = bufname(a:bufnr) - return empty(name) ? '[No Name]' : name + if empty(name) + return '[No Name]' + endif + + let other_paths = [] + for b in range(1, bufnr('$')) + if bufexists(b) && b !=# a:bufnr + call add(other_paths, split(bufname(b), '[\/]')) + endif + endfor + let this_path = split(name, '[\/]') + let i = -1 + while v:true + let this_path_part = get(this_path, i, '') + let unique = v:true + let no_parts_remained = v:true + for other_path in other_paths + let other_path_part = get(other_path, i, '') + if this_path_part ==? other_path_part + let unique = v:false + break + endif + if other_path_part !=# '' + let no_parts_remained = v:false + endif + endfor + if unique + break + endif + if this_path_part ==# '' && no_parts_remained + break + endif + let i -= 1 + endwhile + + let ret = '' + for k in range(i, -1) + if len(this_path) < -k + continue + endif + if k ==# i || k == -1 + let ret .= '/' . this_path[k] + else + let ret .= '/' . matchlist(this_path[k], '.')[0] + endif + endfor + return ret[1:-1] endfunction function! s:statusline_modified(bufnr) abort @@ -1307,9 +1342,8 @@ function! s:statusline_linenum(winid) abort return line('.', a:winid) . '/' . line('$', a:winid) endfunction -function! s:statusline_fenc_ff(bufnr) abort +function! s:statusline_fenc(bufnr) abort let fenc = getbufvar(a:bufnr, '&fileencoding') - let ff = getbufvar(a:bufnr, '&fileformat') let bom = getbufvar(a:bufnr, '&bomb') " BOMB!! if fenc ==# '' @@ -1317,30 +1351,31 @@ function! s:statusline_fenc_ff(bufnr) abort let fenc = get(fencs, 0, &encoding) endif if fenc ==# 'utf-8' - let fenc = bom ? 'U8[BOM]' : 'U8' + return bom ? 'U8[BOM]' : 'U8' elseif fenc ==# 'utf-16' - let fenc = 'U16[BE]' + return 'U16[BE]' elseif fenc ==# 'utf-16le' - let fenc = 'U16[LE]' + return 'U16[LE]' elseif fenc ==# 'ucs-4' - let fenc = 'U32[BE]' + return 'U32[BE]' elseif fenc ==# 'ucs-4le' - let fenc = 'U32[LE]' + return 'U32[LE]' else - let fenc = toupper(fenc) + return toupper(fenc) endif +endfunction +function! s:statusline_ff(bufnr) abort + let ff = getbufvar(a:bufnr, '&fileformat') if ff ==# 'unix' - let ff = '' + return '' elseif ff ==# 'dos' - let ff = ' (CRLF)' + return ' (CRLF)' elseif ff ==# 'mac' - let ff = ' (CR)' + return ' (CR)' else - let ff = ' (Unknown)' + return ' (Unknown)' endif - - return fenc . ff endfunction function! s:statusline_filetype(bufnr) abort @@ -1361,10 +1396,9 @@ function! Tabline_build() abort let buflist = tabpagebuflist(tabnr) let bufnr = buflist[tabpagewinnr(tabnr) - 1] let tal .= printf( - \ '%%#%s# %s%s ', + \ '%%#%s# %s ', \ is_active ? 'TabLineSel' : 'TabLine', - \ s:statusline_filename(bufnr), - \ len(buflist) ==# 1 ? '' : '+') + \ s:statusline_filename(bufnr)) endfor return tal . '%#TabLineFill#' endfunction |
