From d3c2a3b39a8a2a461eb590df8da8b94921c74659 Mon Sep 17 00:00:00 2001 From: Matt Leong Date: Sun, 5 Dec 2021 14:25:12 -0800 Subject: [PATCH] feat(statusline): restore proper lsp look and feel & new get_highlight --- lua/cosmic/modules/statusline/init.lua | 52 ++++++++++++++++------ lua/cosmic/theme/highlight.lua | 9 ---- lua/cosmic/theme/init.lua | 60 +++++++++++++++----------- lua/cosmic/theme/utils.lua | 36 ++++++++++++++++ 4 files changed, 110 insertions(+), 47 deletions(-) delete mode 100644 lua/cosmic/theme/highlight.lua create mode 100644 lua/cosmic/theme/utils.lua diff --git a/lua/cosmic/modules/statusline/init.lua b/lua/cosmic/modules/statusline/init.lua index 53ae843..de6affa 100644 --- a/lua/cosmic/modules/statusline/init.lua +++ b/lua/cosmic/modules/statusline/init.lua @@ -5,7 +5,7 @@ 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 highlight = require('cosmic.theme.utils').highlight local icons = require('cosmic.theme.icons') local config = require('cosmic.config') @@ -291,9 +291,10 @@ gls.left = { } gls.right = { + -- Error { DiagnosticErrorLeftBracket = { - provider = BracketProvider(icons.arrow_left, diag.get_diagnostic_error), + provider = BracketProvider(icons.rounded_left_filled, diag.get_diagnostic_error), highlight = 'DiagnosticError', condition = condition.buffer_not_empty, }, @@ -301,41 +302,65 @@ gls.right = { { DiagnosticError = { provider = diag.get_diagnostic_error, - highlight = 'DiagnosticError', + highlight = 'DiagnosticErrorInv', icon = ' ' .. icons.error .. ' ', condition = condition.buffer_not_empty, }, }, + { + DiagnosticErrorRightBracket = { + provider = BracketProvider(icons.rounded_right_filled .. ' ', diag.get_diagnostic_error), + highlight = 'DiagnosticError', + condition = condition.buffer_not_empty, + }, + }, + -- Warning { DiagnosticWarnLeftBracket = { - provider = BracketProvider(icons.arrow_left, diag.get_diagnostic_warn), - highlight = 'DiagnosticWarning', + provider = BracketProvider(icons.rounded_left_filled, diag.get_diagnostic_warn), + highlight = 'DiagnosticWarn', condition = condition.buffer_not_empty, }, }, { DiagnosticWarn = { provider = diag.get_diagnostic_warn, - highlight = 'DiagnosticWarning', + highlight = 'DiagnosticWarnInv', icon = ' ' .. icons.warn .. ' ', condition = condition.buffer_not_empty, }, }, { - DiagnosticInfoLeftBracket = { - provider = BracketProvider(icons.arrow_left, diag.get_diagnostic_info), - highlight = 'DiagnosticInfo', + DiagnosticWarnRightBracket = { + provider = BracketProvider(icons.rounded_right_filled .. ' ', diag.get_diagnostic_warn), + highlight = 'DiagnosticWarn', + condition = condition.buffer_not_empty, + }, + }, + -- Hint + { + DiagnosticHintLeftBracket = { + provider = BracketProvider(icons.rounded_left_filled, diag.get_diagnostic_hint), + highlight = 'DiagnosticHint', condition = condition.buffer_not_empty, }, }, { - DiagnosticInfo = { - provider = diag.get_diagnostic_info, - icon = ' ' .. icons.info .. ' ', - highlight = 'DiagnosticInfo', + DiagnosticHint = { + provider = diag.get_diagnostic_hint, + icon = ' ' .. icons.hint .. ' ', + highlight = 'DiagnosticHintInv', condition = condition.buffer_not_empty, }, }, + { + DiagnosticHintRightBracket = { + provider = BracketProvider(icons.rounded_right_filled .. ' ', diag.get_diagnostic_hint), + highlight = 'DiagnosticHint', + condition = condition.buffer_not_empty, + }, + }, + -- Git { GitBranchRightBracket = { provider = BracketProvider(icons.arrow_left_filled, true), @@ -351,6 +376,7 @@ gls.right = { highlight = 'GalaxyViModeInv', }, }, + -- Editor info { LineColumn = { provider = { diff --git a/lua/cosmic/theme/highlight.lua b/lua/cosmic/theme/highlight.lua deleted file mode 100644 index 6eb182a..0000000 --- a/lua/cosmic/theme/highlight.lua +++ /dev/null @@ -1,9 +0,0 @@ -return function(group, bg, fg, gui) - if gui ~= nil and gui ~= '' then - vim.api.nvim_command(('hi %s guibg=%s guifg=%s gui=%s'):format(group, bg, fg, gui)) - elseif bg == nil then - vim.api.nvim_command(('hi %s guifg=%s'):format(group, fg)) - else - vim.api.nvim_command(('hi %s guibg=%s guifg=%s'):format(group, bg, fg)) - end -end diff --git a/lua/cosmic/theme/init.lua b/lua/cosmic/theme/init.lua index d211e86..712ab3a 100644 --- a/lua/cosmic/theme/init.lua +++ b/lua/cosmic/theme/init.lua @@ -2,38 +2,48 @@ local _, colors = pcall(require, 'cosmic.theme.colors') if not colors then return end -local highlight = require('cosmic.theme.highlight') +local highlight = require('cosmic.theme.utils').highlight +local get_highlight = require('cosmic.theme.utils').get_highlight +local set_highlight = require('cosmic.theme.utils').set_highlight -- @TODO: can i get rid of this? highlight('StatusLine', colors.statusline_bg, colors.statusline_bg) --- @TODO: is all this work worth it? ---[[ -- diagnostic virtual text highlights -highlight('DiagnosticVirtualTextError', 'None', colors.error) -highlight('DiagnosticVirtualTextWarn', 'None', colors.warn) -highlight('DiagnosticVirtualTextInfo', 'None', colors.info) -highlight('DiagnosticVirtualTextHint', 'None', colors.hint) +local error_colors = get_highlight('DiagnosticError') +set_highlight( + 'DiagnosticErrorInv', + vim.tbl_extend('force', error_colors, { + guibg = error_colors.guifg, + guifg = colors.statusline_bg, + }) +) --- diagnostics highlight -highlight('DiagnosticError', 'None', colors.error) -highlight('DiagnosticWarn', 'None', colors.warn) -highlight('DiagnosticInfo', 'None', colors.info) -highlight('DiagnosticHint', 'None', colors.hint) +local warning_colors = get_highlight('DiagnosticWarn') +set_highlight( + 'DiagnosticWarnInv', + vim.tbl_extend('force', warning_colors, { + guibg = warning_colors.guifg, + guifg = colors.statusline_bg, + }) +) -highlight('Error', 'None', colors.error) -highlight('ErrorMsg', 'None', colors.error) -highlight('WarningMsg', 'None', colors.warn) +local hint_colors = get_highlight('DiagnosticHint') +set_highlight( + 'DiagnosticHintInv', + vim.tbl_extend('force', hint_colors, { + guibg = hint_colors.guifg, + guifg = colors.statusline_bg, + }) +) --- legacy diagnostics highlight -highlight('LspDiagnosticsError', 'None', colors.error) -highlight('LspDiagnosticsWarning', 'None', colors.warn) -highlight('LspDiagnosticsInformation', 'None', colors.info) -highlight('LspDiagnosticsHint', 'None', colors.hint) - -highlight('LspDiagnosticsSignError', 'None', colors.error) -highlight('LspDiagnosticsSignWarning', 'None', colors.warn) -highlight('LspDiagnosticsSignInformation', 'None', colors.info) -highlight('LspDiagnosticsSignHint', 'None', colors.hint) ]] +local info_colors = get_highlight('DiagnosticInfo') +set_highlight( + 'DiagnosticInfoInv', + vim.tbl_extend('force', info_colors, { + guibg = info_colors.guifg, + guifg = colors.statusline_bg, + }) +) -- notification highlights highlight('NotifyINFOBorder', nil, colors.hint) diff --git a/lua/cosmic/theme/utils.lua b/lua/cosmic/theme/utils.lua new file mode 100644 index 0000000..7cb6c73 --- /dev/null +++ b/lua/cosmic/theme/utils.lua @@ -0,0 +1,36 @@ +local M = {} + +M.highlight = function(group, bg, fg, gui) + if gui ~= nil and gui ~= '' then + vim.api.nvim_command(('hi %s guibg=%s guifg=%s gui=%s'):format(group, bg, fg, gui)) + elseif bg == nil then + vim.api.nvim_command(('hi %s guifg=%s'):format(group, fg)) + elseif fg == nil then + vim.api.nvim_command(('hi %s guibg=%s'):format(group, bg)) + else + vim.api.nvim_command(('hi %s guibg=%s guifg=%s'):format(group, bg, fg)) + end +end + +M.set_highlight = function(hi, colors) + local hi_str = '' + + for k, v in pairs(colors) do + hi_str = hi_str .. k .. '=' .. v .. ' ' + end + + vim.cmd(('hi %s %s'):format(hi, hi_str)) +end + +M.get_highlight = function(hi) + local hi_str = vim.api.nvim_command_output(('hi %s'):format(hi)) + + local colors = {} + for key, val in string.gmatch(hi_str, '(%w+)=(%S+)') do + colors[key] = val + end + + return colors +end + +return M