nvim/lua/cosmic/modules/statusline/init.lua
2021-12-04 17:04:07 -08:00

501 lines
13 KiB
Lua

local galaxy = require('galaxyline')
local gls = galaxy.section
local diag = require('galaxyline.providers.diagnostic')
local condition = require('galaxyline.condition')
local fileinfo = require('galaxyline.providers.fileinfo')
local utils = require('cosmic.utils')
local colors = require('cosmic.theme.colors')
local highlight = require('cosmic.theme.highlight')
local icons = require('cosmic.theme.icons')
local config = require('cosmic.config')
local defaults = vim.tbl_deep_extend('force', {
statusline = {
main_icon = icons.cosmic,
},
}, config.statusline or {})
local main_icon = defaults.statusline.main_icon
local get_mode = function()
local mode_colors = {
[110] = { 'NORMAL', colors.normal, colors.bg_highlight },
[105] = { 'INSERT', colors.insert, colors.bg_highlight },
[99] = { 'COMMAND', colors.command, colors.bg_highlight },
[116] = { 'TERMINAL', colors.normal, colors.bg_highlight },
[118] = { 'VISUAL', colors.visual, colors.bg_highlight },
[22] = { 'V-BLOCK', colors.visual, colors.bg_highlight },
[86] = { 'V-LINE', colors.visual, colors.bg_highlight },
[82] = { 'REPLACE', colors.replace, colors.bg_highlight },
[115] = { 'SELECT', colors.replace, colors.bg_highlight },
[83] = { 'S-LINE', colors.replace, colors.bg_highlight },
}
local mode_data = mode_colors[vim.fn.mode():byte()]
if mode_data ~= nil then
return mode_data
end
end
local function get_basename(file)
return file:match('^.+/(.+)$')
end
local function get_git_root()
local git_dir = require('galaxyline.providers.vcs').get_git_dir()
if not git_dir then
return 'not a git dir '
end
local git_root = git_dir:gsub('/.git/?$', '')
return get_basename(git_root) .. ' '
end
local check_width_and_git_and_buffer = function()
return condition.check_git_workspace() and condition.buffer_not_empty()
end
local check_buffer_and_width = function()
return condition.buffer_not_empty() and condition.hide_in_width()
end
local FilePathShortProvider = function()
local fp = vim.fn.fnamemodify(vim.fn.expand('%'), ':~:.:h')
local tbl = utils.split(fp, '/')
local len = #tbl
if len > 2 and tbl[1] ~= '~' then
return icons.dotdotdot .. '/' .. table.concat(tbl, '/', len - 1) .. '/'
else
return fp .. '/'
end
end
local LineColumnProvider = function()
local line_column = fileinfo.line_column()
line_column = line_column:gsub('%s+', '')
return ' ' .. icons.line_number .. line_column
end
local PercentProvider = function()
local line_column = fileinfo.current_line_percent()
line_column = line_column:gsub('%s+', '')
return line_column .. ''
end
local BracketProvider = function(icon, cond)
return function()
local result
if cond == true or cond == false then
result = cond
else
result = cond()
end
if result ~= nil and result ~= '' then
return icon
end
end
end
galaxy.short_line_list = {
'packer',
'NvimTree',
'floaterm',
'fugitive',
'fugitiveblame',
}
gls.mid = {
{
LSPStatus = {
provider = function()
local clients = utils.get_active_lsp_client_names()
local client_str = ''
if #clients < 1 then
return client_str
end
for i, client in ipairs(clients) do
client_str = client_str .. client
if i < #clients then
client_str = client_str .. ', '
end
end
return 'LSP: [' .. client_str .. ']'
end,
highlight = 'GalaxyText',
},
},
}
gls.left = {
{
GhostLeftBracket = {
provider = BracketProvider(icons.rounded_left_filled, true),
highlight = 'GalaxyViModeNestedInv',
},
},
{
Ghost = {
provider = BracketProvider(main_icon, true),
highlight = 'GalaxyViModeInv',
},
},
{
ViModeLeftBracket = {
provider = BracketProvider(icons.rounded_right_filled, true),
highlight = 'GalaxyViMode',
},
},
{
ViMode = {
provider = function()
local m = get_mode()
if m == nil then
return
end
local label, mode_color, mode_nested = unpack(m)
highlight('GalaxyViMode', mode_color, mode_nested)
highlight('GalaxyViModeInv', mode_nested, mode_color)
highlight('GalaxyViModeNested', mode_nested, colors.statusline_bg)
highlight('GalaxyViModeNestedInv', colors.statusline_bg, mode_nested)
highlight('GalaxyPercentBracket', colors.statusline_bg, mode_color)
highlight('GalaxyText', colors.statusline_bg, mode_color)
highlight('GalaxyGitLCBracket', mode_nested, mode_color)
if condition.buffer_not_empty() then
highlight('GalaxyViModeBracket', mode_nested, mode_color)
else
if condition.check_git_workspace() then
highlight('GalaxyGitLCBracket', colors.statusline_bg, mode_color)
end
highlight('GalaxyViModeBracket', colors.statusline_bg, mode_color)
end
return ' ' .. label .. ' '
end,
},
},
{
ViModeBracket = {
provider = BracketProvider(icons.arrow_right_filled, true),
highlight = 'GalaxyViModeBracket',
},
},
{
GitIcon = {
provider = BracketProvider(' ' .. icons.branch .. ' ', true),
condition = check_width_and_git_and_buffer,
highlight = 'GalaxyViModeInv',
},
},
{
GitBranch = {
provider = function()
local vcs = require('galaxyline.providers.vcs')
local branch_name = vcs.get_git_branch()
if not branch_name then
return ' no git '
end
if string.len(branch_name) > 28 then
return string.sub(branch_name, 1, 25) .. icons.dotdotdot
end
return branch_name .. ' '
end,
condition = check_width_and_git_and_buffer,
highlight = 'GalaxyViModeInv',
separator = icons.arrow_right,
separator_highlight = 'GalaxyViModeInv',
},
},
{
FileIcon = {
provider = function()
local icon = fileinfo.get_file_icon()
if condition.check_git_workspace() then
return ' ' .. icon
end
return ' ' .. icon
end,
condition = condition.buffer_not_empty,
highlight = 'GalaxyViModeInv',
},
},
{
FilePath = {
provider = FilePathShortProvider,
condition = check_buffer_and_width,
highlight = 'GalaxyViModeInv',
},
},
{
FileName = {
provider = 'FileName',
condition = condition.buffer_not_empty,
highlight = 'GalaxyViModeInv',
separator = icons.arrow_right_filled,
separator_highlight = 'GalaxyViModeNestedInv',
},
},
{
DiffAdd = {
provider = 'DiffAdd',
icon = '',
condition = check_width_and_git_and_buffer,
highlight = { colors.diffAdd, colors.statusline_bg },
},
},
{
DiffModified = {
provider = 'DiffModified',
condition = check_width_and_git_and_buffer,
icon = '',
highlight = { colors.diffModified, colors.statusline_bg },
},
},
{
DiffRemove = {
provider = 'DiffRemove',
condition = check_width_and_git_and_buffer,
icon = '',
highlight = { colors.diffDeleted, colors.statusline_bg },
},
},
{
WSpace = {
provider = 'WhiteSpace',
highlight = { colors.statusline_bg, colors.statusline_bg },
},
},
}
gls.right = {
{
DiagnosticErrorLeftBracket = {
provider = BracketProvider(icons.rounded_left_filled, diag.get_diagnostic_error),
highlight = 'GalaxyDiagnosticErrorInv',
condition = condition.buffer_not_empty,
},
},
{
DiagnosticError = {
provider = function()
local error_result = diag.get_diagnostic_error()
highlight('GalaxyDiagnosticError', colors.error, colors.statusline_bg)
highlight('GalaxyDiagnosticErrorInv', colors.statusline_bg, colors.error)
if error_result ~= '' and error_result ~= nil then
return error_result
end
end,
icon = icons.error .. ' ',
highlight = 'GalaxyDiagnosticError',
condition = condition.buffer_not_empty,
},
},
{
DiagnosticErrorRightBracket = {
provider = {
BracketProvider(icons.rounded_right_filled, diag.get_diagnostic_error),
BracketProvider(' ', diag.get_diagnostic_error),
},
highlight = 'GalaxyDiagnosticErrorInv',
condition = condition.buffer_not_empty,
},
},
{
DiagnosticWarnLeftBracket = {
provider = BracketProvider(icons.rounded_left_filled, diag.get_diagnostic_warn),
highlight = 'GalaxyDiagnosticWarnInv',
condition = condition.buffer_not_empty,
},
},
{
DiagnosticWarn = {
provider = function()
local warn_result = diag.get_diagnostic_warn()
highlight('GalaxyDiagnosticWarn', colors.warn, colors.statusline_bg)
highlight('GalaxyDiagnosticWarnInv', colors.statusline_bg, colors.warn)
if warn_result ~= '' and warn_result ~= nil then
return warn_result
end
end,
highlight = 'GalaxyDiagnosticWarn',
icon = icons.warn .. ' ',
condition = condition.buffer_not_empty,
},
},
{
DiagnosticWarnRightBracket = {
provider = {
BracketProvider(icons.rounded_right_filled, diag.get_diagnostic_warn),
BracketProvider(' ', diag.get_diagnostic_warn),
},
highlight = 'GalaxyDiagnosticWarnInv',
condition = condition.buffer_not_empty,
},
},
{
DiagnosticInfoLeftBracket = {
provider = BracketProvider(icons.rounded_left_filled, diag.get_diagnostic_info),
highlight = 'GalaxyDiagnosticInfoInv',
},
},
{
DiagnosticInfo = {
provider = function()
local info_result = diag.get_diagnostic_info()
highlight('GalaxyDiagnosticInfo', colors.info, colors.statusline_bg)
highlight('GalaxyDiagnosticInfoInv', colors.statusline_bg, colors.info)
if info_result ~= '' and info_result ~= nil then
return info_result
end
end,
icon = icons.info .. ' ',
highlight = 'GalaxyDiagnosticInfo',
condition = check_width_and_git_and_buffer,
},
},
{
DiagnosticInfoRightBracket = {
provider = {
BracketProvider(icons.rounded_right_filled, diag.get_diagnostic_info),
BracketProvider(' ', diag.get_diagnostic_info),
},
highlight = 'GalaxyDiagnosticInfoInv',
condition = condition.buffer_not_empty,
},
},
{
GitBranchRightBracket = {
provider = BracketProvider(icons.arrow_left_filled, true),
condition = check_buffer_and_width,
highlight = 'GalaxyViModeNestedInv',
},
},
{
GitRoot = {
provider = get_git_root,
condition = check_buffer_and_width,
icon = ' ' .. icons.file .. ' ',
highlight = 'GalaxyViModeInv',
},
},
{
LineColumn = {
provider = {
LineColumnProvider,
function()
return ' '
end,
},
highlight = 'GalaxyViMode',
separator = icons.arrow_left_filled,
separator_highlight = 'GalaxyGitLCBracket',
},
},
{
PerCent = {
provider = {
PercentProvider,
},
highlight = 'GalaxyViMode',
separator = icons.arrow_left .. ' ',
separator_highlight = 'GalaxyViModeLeftBracket',
},
},
{
PercentRightBracket = {
provider = BracketProvider(icons.rounded_right_filled, true),
highlight = 'GalaxyPercentBracket',
},
},
}
gls.short_line_left = {
{
GhostLeftBracketShort = {
provider = BracketProvider(icons.rounded_left_filled, true),
highlight = { colors.white, colors.statusline_bg },
},
},
{
GhostShort = {
provider = BracketProvider(main_icon, true),
highlight = { colors.statusline_bg, colors.white },
},
},
{
GhostRightBracketShort = {
provider = BracketProvider(icons.rounded_right_filled, true),
highlight = { colors.white, colors.statusline_bg },
},
},
{
FileIconShort = {
provider = {
function()
return ' '
end,
'FileIcon',
},
condition = function()
return condition.buffer_not_empty() and vim.bo.filetype ~= 'NvimTree'
end,
highlight = {
require('galaxyline.providers.fileinfo').get_file_icon,
colors.statusline_bg,
},
},
},
{
FilePathShort = {
provider = FilePathShortProvider,
condition = function()
return condition.buffer_not_empty() and vim.bo.filetype ~= 'NvimTree'
end,
highlight = { colors.white, colors.statusline_bg },
},
},
{
FileNameShort = {
provider = 'FileName',
condition = function()
return condition.buffer_not_empty() and vim.bo.filetype ~= 'NvimTree'
end,
highlight = { colors.white, colors.statusline_bg },
},
},
}
gls.short_line_right = {
{
GitRootShortLeftBracket = {
provider = BracketProvider(icons.arrow_left_filled, true),
condition = condition.buffer_not_empty,
highlight = { colors.white, colors.statusline_bg },
},
},
{
GitRootShort = {
provider = get_git_root,
condition = condition.buffer_not_empty,
icon = ' ' .. icons.file .. ' ',
highlight = { colors.statusline_bg, colors.white },
},
},
{
GitRootShortRightBracket = {
provider = BracketProvider(icons.rounded_right_filled, true),
condition = condition.buffer_not_empty,
highlight = { colors.white, colors.statusline_bg },
},
},
}