summaryrefslogtreecommitdiff
path: root/pkgs/old-custom-neovim/config/lua/statusline.lua
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/old-custom-neovim/config/lua/statusline.lua')
-rw-r--r--pkgs/old-custom-neovim/config/lua/statusline.lua249
1 files changed, 249 insertions, 0 deletions
diff --git a/pkgs/old-custom-neovim/config/lua/statusline.lua b/pkgs/old-custom-neovim/config/lua/statusline.lua
new file mode 100644
index 0000000..08bbe50
--- /dev/null
+++ b/pkgs/old-custom-neovim/config/lua/statusline.lua
@@ -0,0 +1,249 @@
+-- Custom Statusline
+
+-- About 1/3 of this code is from https://github.com/MariaSolOs/dotfiles/blob/f1d6229f4a4675745aff95c540dc8f1b9007a77a/.config/nvim/lua/statusline.lua
+
+-- Highlight pattern
+local hi_pattern = '%%#%s#%s%%*'
+
+-- Convert mode to string
+local mode_to_str = {
+ ['n'] = 'NORMAL',
+ ['no'] = 'OP-PENDING',
+ ['nov'] = 'OP-PENDING',
+ ['noV'] = 'OP-PENDING',
+ ['no\22'] = 'OP-PENDING',
+ ['niI'] = 'NORMAL',
+ ['niR'] = 'NORMAL',
+ ['niV'] = 'NORMAL',
+ ['nt'] = 'NORMAL',
+ ['ntT'] = 'NORMAL',
+ ['v'] = 'VISUAL',
+ ['vs'] = 'VISUAL',
+ ['V'] = 'VISUAL',
+ ['Vs'] = 'VISUAL',
+ ['\22'] = 'VISUAL',
+ ['\22s'] = 'VISUAL',
+ ['s'] = 'SELECT',
+ ['S'] = 'SELECT',
+ ['\19'] = 'SELECT',
+ ['i'] = 'INSERT',
+ ['ic'] = 'INSERT',
+ ['ix'] = 'INSERT',
+ ['R'] = 'REPLACE',
+ ['Rc'] = 'REPLACE',
+ ['Rx'] = 'REPLACE',
+ ['Rv'] = 'VIRT REPLACE',
+ ['Rvc'] = 'VIRT REPLACE',
+ ['Rvx'] = 'VIRT REPLACE',
+ ['c'] = 'COMMAND',
+ ['cv'] = 'VIM EX',
+ ['ce'] = 'EX',
+ ['r'] = 'PROMPT',
+ ['rm'] = 'MORE',
+ ['r?'] = 'CONFIRM',
+ ['!'] = 'SHELL',
+ ['t'] = 'TERMINAL',
+}
+
+local statusline_components = {}
+
+statusline_components.micro_spacer = function()
+ return " "
+end
+
+statusline_components.small_spacer = function()
+ return " "
+end
+
+statusline_components.spacer = function()
+ return '%='
+end
+
+statusline_components.diagnostic_status = function()
+ local diagnostics = {}
+
+ local errors = #vim.diagnostic.get(0, { severity = 1 })
+
+ if errors > 0 then
+ table.insert(diagnostics, "%#DiagnosticSignError# " .. tostring(errors))
+ end
+
+ local warnings = #vim.diagnostic.get(0, { severity = 2 })
+
+ if warnings > 0 then
+ table.insert(diagnostics, "%#DiagnosticSignWarn# " .. tostring(warnings))
+ end
+
+ local infos = #vim.diagnostic.get(0, { severity = 3 })
+
+ if infos > 0 then
+ table.insert(diagnostics, "%#DiagnosticSignInfo# " .. tostring(infos))
+ end
+
+ local hints = #vim.diagnostic.get(0, { severity = 4 })
+
+ if hints > 0 then
+ table.insert(diagnostics, "%#DiagnosticSignHint# " .. tostring(hints))
+ end
+
+ table.insert(diagnostics, "%#StatusLine#")
+
+ vim.defer_fn(vim.cmd.redrawstatus, 500)
+
+ -- Don't show diagnostics in insert mode.
+ if mode_to_str[vim.api.nvim_get_mode().mode]:find "INSERT" then
+ return ""
+ end
+
+ return table.concat(diagnostics, " ")
+end
+
+statusline_components.mode = function()
+ -- Get the respective string to display.
+ local mode = mode_to_str[vim.api.nvim_get_mode().mode] or 'UNKNOWN'
+
+ -- Set the highlight group.
+ local hl = 'MiniStatuslineModeOther'
+ if mode:find 'NORMAL' then
+ hl = 'MiniStatuslineModeNormal'
+ elseif mode:find 'PENDING' then
+ hl = 'MiniStatuslineModeNormal'
+ elseif mode:find 'VISUAL' then
+ hl = 'MiniStatuslineModeVisual'
+ elseif mode:find 'REPLACE' then
+ hl = 'MiniStatuslineModeReplace'
+ elseif mode:find 'INSERT' or mode:find 'SELECT' then
+ hl = 'MiniStatuslineModeInsert'
+ elseif mode:find 'COMMAND' or mode:find 'TERMINAL' or mode:find 'EX' then
+ hl = 'MiniStatuslineModeCommand'
+ end
+
+ -- Construct the component.
+ return hi_pattern:format(hl, string.format(' %s ', mode))
+end
+
+statusline_components.position = function()
+ -- Get the respective string to display.
+ local mode = mode_to_str[vim.api.nvim_get_mode().mode] or 'UNKNOWN'
+
+ -- Set the highlight group.
+ local hl = 'MiniStatuslineModeOther'
+ if mode:find 'NORMAL' then
+ hl = 'MiniStatuslineModeNormal'
+ elseif mode:find 'PENDING' then
+ hl = 'MiniStatuslineModeNormal'
+ elseif mode:find 'VISUAL' then
+ hl = 'MiniStatuslineModeVisual'
+ elseif mode:find 'REPLACE' then
+ hl = 'MiniStatuslineModeReplace'
+ elseif mode:find 'INSERT' or mode:find 'SELECT' then
+ hl = 'MiniStatuslineModeInsert'
+ elseif mode:find 'COMMAND' or mode:find 'TERMINAL' or mode:find 'EX' then
+ hl = 'MiniStatuslineModeCommand'
+ end
+
+ -- Construct the component.
+ return hi_pattern:format(hl, ' %2l:%-2c ')
+end
+
+statusline_components.git_branch = function()
+ if vim.g.gitsigns_head then
+ return string.format(' %s', vim.g.gitsigns_head)
+ else
+ return '' -- Return an empty string or some default value if the branch name is not available
+ end
+end
+
+statusline_components.git_status = function()
+ if not vim.b.gitsigns_status_dict then
+ return ''
+ end
+
+ if not vim.b.gitsigns_status_dict.added then
+ return ''
+ end
+
+ if not vim.b.gitsigns_status_dict.changed then
+ return ''
+ end
+
+ if not vim.b.gitsigns_status_dict.removed then
+ return ''
+ end
+
+ local status = {}
+
+ local gitsigns_status = vim.b.gitsigns_status_dict
+
+ if gitsigns_status.added > 0 then
+ table.insert(status, hi_pattern:format("Added", (" %s"):format(gitsigns_status.added)))
+ end
+
+ if gitsigns_status.changed > 0 then
+ table.insert(status, hi_pattern:format("Changed", (" %s"):format(gitsigns_status.changed)))
+ end
+
+ if gitsigns_status.removed > 0 then
+ table.insert(status, hi_pattern:format("Removed", (" %s"):format(gitsigns_status.removed)))
+ end
+
+ return table.concat(status, " ")
+end
+
+statusline_components.working_directory = function()
+ local text = vim.fn.getcwd()
+
+ local parts = {}
+ for part in string.gmatch(text, "[^/]+") do
+ table.insert(parts, part)
+ end
+
+ -- replace /home/USER with ~/
+ if #parts >= 3 then
+ table.remove(parts, 1)
+ table.remove(parts, 1)
+ table.insert(parts, 1, "~")
+ end
+
+ text = table.concat(parts, "/")
+
+ -- if the cwd takes up more than half the bar width, shorten it.
+ if text:len() > (vim.api.nvim_win_get_width(0) / 2.5) then
+ if #parts >= 1 then
+ text = ".../" .. parts[#parts]
+ end
+ end
+ return string.format('%s', text)
+end
+
+Statusline_component = function(name)
+ return statusline_components[name]()
+end
+
+local get_component = function(name)
+ return string.format('%%{%%v:lua.Statusline_component("%s")%%} ', name)
+end
+
+local statusline = {
+ get_component("micro_spacer"),
+
+ get_component("mode"),
+ get_component("micro_spacer"),
+ get_component("working_directory"),
+ get_component("micro_spacer"),
+ get_component("git_branch"),
+ get_component("micro_spacer"),
+ get_component("git_status"),
+ get_component("micro_spacer"),
+ get_component("diagnostic_status"),
+
+ get_component("spacer"),
+
+ '%{&filetype}', -- filetype
+ get_component("micro_spacer"),
+ '%2p%%', -- progress %
+ get_component("micro_spacer"),
+ get_component("position"),
+}
+
+vim.o.statusline = table.concat(statusline, '')