aboutsummaryrefslogtreecommitdiff
path: root/lua/cleantab
diff options
context:
space:
mode:
Diffstat (limited to 'lua/cleantab')
-rw-r--r--lua/cleantab/init.lua100
1 files changed, 100 insertions, 0 deletions
diff --git a/lua/cleantab/init.lua b/lua/cleantab/init.lua
new file mode 100644
index 0000000..aa4a974
--- /dev/null
+++ b/lua/cleantab/init.lua
@@ -0,0 +1,100 @@
+local M = {}
+
+M.fileTitle = function(file)
+ file = vim.fn.fnamemodify(file, ':p:~')
+ local tail = vim.fn.fnamemodify(file, ':t')
+
+ if not tail then
+ return vim.fn.fnamemodify(file, ':p:~:h') .. '/' -- e.g. ~/dir/
+ elseif tail == 'init.lua'
+ or tail == '__init__.py' then
+ return vim.fn.fnamemodify(vim.fn.fnamemodify(file, ':h'), ':t') .. '/' .. tail -- e.g. luatab/init.lua
+ else
+ return tail
+ end
+end
+
+M.title = function(bufnr)
+ local file = vim.fn.bufname(bufnr)
+ local buftype = vim.fn.getbufvar(bufnr, '&buftype')
+ local filetype = vim.fn.getbufvar(bufnr, '&filetype')
+
+ if buftype == 'help' then
+ return 'help:' .. vim.fn.fnamemodify(file, ':t:r')
+ elseif buftype == 'quickfix' then
+ return 'quickfix'
+ elseif filetype == 'TelescopePrompt' then
+ return 'Telescope'
+ elseif filetype == 'git' then
+ return 'Git'
+ elseif filetype == 'fugitive' then
+ return 'Fugitive'
+ elseif filetype == 'NvimTree' then
+ return 'NvimTree'
+ elseif filetype == 'oil' then
+ return 'Oil'
+ elseif file:sub(file:len()-2, file:len()) == 'FZF' then
+ return 'FZF'
+ elseif buftype == 'terminal' then
+ local _, mtch = string.match(file, "term:(.*):(%a+)")
+ return mtch ~= nil and mtch or vim.fn.fnamemodify(vim.env.SHELL, ':t')
+ elseif file == '' then
+ return '[No Name]'
+ else
+ return M.fileTitle(vim.fn.simplify(file))
+ end
+end
+
+M.modified = function(bufnr)
+ return vim.fn.getbufvar(bufnr, '&modified') == 1 and '+' or ''
+end
+
+M.windowCount = function(index, hl)
+ local nwins = vim.fn.tabpagewinnr(index, '$')
+ return nwins > 1 and '%#TabLineSel#' .. nwins .. hl or ''
+end
+
+M.separator = function(index)
+ return (index < vim.fn.tabpagenr('$') and '%#TabLine#|' 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 = ''
+ for i = 1, vim.fn.tabpagenr('$'), 1 do
+ line = line .. M.cell(i)
+ end
+ line = line .. '%#TabLineFill#%='
+ if vim.fn.tabpagenr('$') > 1 then
+ line = line .. '%#TabLine#%999XX'
+ end
+ return line
+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\'luatab\'.helpers.tabline()'
+end
+
+return {
+ helpers = M,
+ setup = setup,
+}