aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.config/nvim/init.lua129
-rw-r--r--.vimrc130
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
diff --git a/.vimrc b/.vimrc
index 61b058c..bafac8b 100644
--- a/.vimrc
+++ b/.vimrc
@@ -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