local fn = vim.fn local api = vim.api -- possible values are 'arrow' | 'rounded' | 'blank' local active_sep = 'blank' -- change them if you want to different separator local separators = { arrow = { '', '' }, rounded = { '', '' }, blank = { '', '' }, } -- highlight groups local colors = { active = '%#StatusLine#', inactive = '%#StatuslineNC#', mode = '%#Mode#', mode_alt = '%#ModeAlt#', git = '%#Git#', git_alt = '%#GitAlt#', filetype = '%#Filetype#', filetype_alt = '%#FiletypeAlt#', line_col = '%#LineCol#', line_col_alt = '%#LineColAlt#', } local trunc_width = setmetatable({ mode = 80, git_status = 90, filename = 140, line_col = 60, }, { __index = function() return 80 end }) local is_truncated = function(_, width) local current_width = api.nvim_win_get_width(0) return current_width < width end --local modes = setmetatable({ --['n'] = {'Normal', 'N'}; --['no'] = {'N·Pending', 'N·P'} ; --['v'] = {'Visual', 'V' }; --['V'] = {'V·Line', 'V·L' }; --[''] = {'V·Block', 'V·B'}; -- this is not ^V, but it's , they're different --['s'] = {'Select', 'S'}; --['S'] = {'S·Line', 'S·L'}; --[''] = {'S·Block', 'S·B'}; -- same with this one, it's not ^S but it's  --['i'] = {'Insert', 'I'}; --['ic'] = {'Insert', 'I'}; --['R'] = {'Replace', 'R'}; --['Rv'] = {'V·Replace', 'V·R'}; --['c'] = {'Command', 'C'}; --['cv'] = {'Vim·Ex ', 'V·E'}; --['ce'] = {'Ex ', 'E'}; --['r'] = {'Prompt ', 'P'}; --['rm'] = {'More ', 'M'}; --['r?'] = {'Confirm ', 'C'}; --['!'] = {'Shell ', 'S'}; --['t'] = {'Terminal ', 'T'}; --}, { --__index = function() --return {'Unknown', 'U'} -- handle edge cases --end --}) local get_current_mode = function() return string.format('[%s]', api.nvim_get_mode().mode ) end local get_git_status = function() -- use fallback because it doesn't set this variable on the initial `BufEnter` local signs = vim.b.gitsigns_status_dict or {head = '', added = 0, changed = 0, removed = 0} local is_head_empty = signs.head ~= '' if is_truncated(trunc_width.git_status) then return is_head_empty and string.format('  %s ', signs.head or '') or '' end return is_head_empty and string.format( ' +%s ~%s -%s |  %s ', signs.added, signs.changed, signs.removed, signs.head ) or '' end local get_filename = function() --if is_truncated(trunc_width.filename) then return "%<%f" end return "%<%F" end local get_filetype = function() local filetype = vim.bo.filetype if filetype == '' then return '' end return string.format('%s', filetype):lower() end local get_line_col = function() return '%l:%c' end Statusline = {} Statusline.active = function() local navic = require('nvim-navic') --local mode = colors.mode .. self:get_current_mode() --local mode_alt = colors.mode_alt .. self.separators[active_sep][1] --local git = colors.git .. self:get_git_status() --local git_alt = colors.git_alt .. self.separators[active_sep][1] --local filename = colors.inactive .. self:get_filename() .. colors.git_alt --local location = "" --if navic.is_available() then --location = navic.get_location() --end --local filetype_alt = colors.filetype_alt .. self.separators[active_sep][2] --local filetype = colors.filetype .. self:get_filetype() --local line_col = colors.line_col .. self:get_line_col() --local line_col_alt = colors.line_col_alt .. self.separators[active_sep][2] local mode = get_current_mode() --local git = get_git_status() local filename = get_filename() .. colors.git_alt local location = "" if navic.is_available() then location = navic.get_location() end local filetype = get_filetype() local line_col = get_line_col() return table.concat({ mode, " ", filename, " ", "%m%r%q", " ", filetype, "%=", location, " ", line_col, " " }) end Statusline.inactive = function() return colors.inactive .. '%F' end Statusline.set_explorer = function() local title = colors.mode .. '  ' local title_alt = colors.mode_alt .. Statusline.separators[active_sep][2] return table.concat({ colors.active, title, title_alt }) end --Statusline = setmetatable(M, { --__call = function(statusline, mode) --if mode == "active" then return statusline:set_active() end --if mode == "inactive" then return statusline:set_inactive() end --if mode == "explorer" then return statusline:set_explorer() end --end --}) local augroup = api.nvim_create_augroup('Statusline', { clear = true}) api.nvim_create_autocmd({"WinEnter", "BufEnter"}, { command = "setlocal statusline=%!v:lua.Statusline.active()", group = augroup }) api.nvim_create_autocmd({"WinLeave", "BufLeave"}, { command = "setlocal statusline=%!v:lua.Statusline.inactive()", group = augroup }) ----[[ -- NOTE: I don't use this since the statusline already has -- so much stuff going on. Feel free to use it! -- credit: https://github.com/nvim-lua/lsp-status.nvim -- -- I now use `tabline` to display these errors, go to `_bufferline.lua` if you -- want to check that out ----]] -- Statusline.get_lsp_diagnostic = function(self) -- local result = {} -- local levels = { -- errors = 'Error', -- warnings = 'Warning', -- info = 'Information', -- hints = 'Hint' -- } -- for k, level in pairs(levels) do -- result[k] = vim.lsp.diagnostic.get_count(0, level) -- end -- if self:is_truncated(120) then -- return '' -- else -- return string.format( -- "| :%s :%s :%s :%s ", -- result['errors'] or 0, result['warnings'] or 0, -- result['info'] or 0, result['hints'] or 0 -- ) -- end -- end