1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
local M = {
moduleNames = { "init.lua", "__init__.py" },
separatorC = "|",
modifiedC = "+",
}
M.title = function(bufnr)
local file = vim.fn.simplify(vim.fn.bufname(bufnr))
local tail = vim.fn.fnamemodify(file, ':t')
local buftype = vim.fn.getbufvar(bufnr, '&buftype')
local filetype = vim.fn.getbufvar(bufnr, '&filetype')
if buftype == "help" then
return "help:" .. vim.fn.fnamemodify(tail, ':r')
elseif filetype == "netrw" then
return file == "" and "netrw" or vim.fn.fnamemodify(file, ':p:~')
elseif buftype ~= "" then
return buftype
elseif file == "" then
return filetype == "" and "[No Name]" or filetype
elseif vim.tbl_contains(M.moduleNames, tail) then
return vim.fn.fnamemodify(vim.fn.fnamemodify(file, ':p:~:h'), ':t') .. "/" .. tail -- e.g. minitab/init.lua
end
return tail
end
M.modified = function(bufnr)
return vim.fn.getbufvar(bufnr, '&modified') == 1 and M.modifiedC or ""
end
M.windowCount = function(index, hl)
local nwins = #vim.tbl_filter(function(bufnr)
return vim.fn.win_gettype(vim.fn.bufwinid(bufnr)) == "" -- windows will appear or disappear at random when editing files etc for no discernible reason
end, vim.fn.tabpagebuflist(index))
return nwins > 1 and '%#TabLineSel#' .. nwins .. hl or ""
end
M.separator = function(index, hl)
return (index < vim.fn.tabpagenr('$') and '%#TabLine#' .. M.separatorC or "")
end
M.cell = function(index)
local isSelected = vim.fn.tabpagenr() == index
local buflist = vim.fn.tabpagebuflist(index)
local winnr = vim.fn.tabpagewinnr(index)
local bufnr = buflist[winnr]
local hl = (isSelected and '%#TabLineSel#' or '%#TabLine#')
local prefix = M.windowCount(index, hl) .. M.modified(bufnr) .. " "
return hl .. '%' .. index .. 'T' .. " " ..
(prefix == " " and "" or prefix) ..
M.title(bufnr) .. " " ..
M.separator(index)
end
M.tabline = function()
local line = ""
if vim.fn.tabpagenr('$') <= 1 then
return line
end
for i = 1, vim.fn.tabpagenr('$'), 1 do
line = line .. M.cell(i)
end
return line .. '%#TabLineFill#%=%#TabLine#%999XX'
end
local setup = function(opts)
if opts then
for key, value in pairs(opts) do
M[key] = value
end
end
vim.opt.tabline = "%!v:lua.require'minitab'.helpers.tabline()"
end
return {
helpers = M,
setup = setup,
}
|