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, }