aboutsummaryrefslogtreecommitdiff
path: root/lua/minitab.lua
diff options
context:
space:
mode:
authorTim Keller <tjkeller.xyz>2024-11-28 11:53:51 -0600
committerTim Keller <tjkeller.xyz>2024-11-28 11:53:51 -0600
commit53921c4f2b2ef868b1bed70bc11ab330b0ad4a47 (patch)
treed292afac7bb9d32f22838f6d9cb136fc5d9e10b4 /lua/minitab.lua
parent4e6ad07b4bd217e9fb44d99225b3467d5c5f33f1 (diff)
downloadminitab.nvim-53921c4f2b2ef868b1bed70bc11ab330b0ad4a47.tar.xz
minitab.nvim-53921c4f2b2ef868b1bed70bc11ab330b0ad4a47.zip
readme updated and minitab fixed
Diffstat (limited to 'lua/minitab.lua')
-rw-r--r--lua/minitab.lua81
1 files changed, 81 insertions, 0 deletions
diff --git a/lua/minitab.lua b/lua/minitab.lua
new file mode 100644
index 0000000..17acbbf
--- /dev/null
+++ b/lua/minitab.lua
@@ -0,0 +1,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,
+}