summaryrefslogtreecommitdiff
path: root/lua/core/lualine
diff options
context:
space:
mode:
authorchaeing <[email protected]>2021-08-20 02:16:29 -0700
committerGitHub <[email protected]>2021-08-20 13:46:29 +0430
commit85fe093efb8353552171575809c02a5e9124fa68 (patch)
treed227b20217b08d894433fab2b3f10c5fc3297df4 /lua/core/lualine
parent59598723077ac6728fc585c3c88e0ec84ba430c3 (diff)
[Feature] switch galaxyline to lualine (#1329)
Diffstat (limited to 'lua/core/lualine')
-rw-r--r--lua/core/lualine/colors.lua16
-rw-r--r--lua/core/lualine/components.lua130
-rw-r--r--lua/core/lualine/conditions.lua17
-rw-r--r--lua/core/lualine/init.lua47
-rw-r--r--lua/core/lualine/styles.lua170
-rw-r--r--lua/core/lualine/utils.lua24
6 files changed, 404 insertions, 0 deletions
diff --git a/lua/core/lualine/colors.lua b/lua/core/lualine/colors.lua
new file mode 100644
index 00000000..4984cd1f
--- /dev/null
+++ b/lua/core/lualine/colors.lua
@@ -0,0 +1,16 @@
+local colors = {
+ bg = "#202328",
+ fg = "#bbc2cf",
+ yellow = "#ECBE7B",
+ cyan = "#008080",
+ darkblue = "#081633",
+ green = "#98be65",
+ orange = "#FF8800",
+ violet = "#a9a1e1",
+ magenta = "#c678dd",
+ purple = "#c678dd",
+ blue = "#51afef",
+ red = "#ec5f67",
+}
+
+return colors
diff --git a/lua/core/lualine/components.lua b/lua/core/lualine/components.lua
new file mode 100644
index 00000000..b9211a79
--- /dev/null
+++ b/lua/core/lualine/components.lua
@@ -0,0 +1,130 @@
+local conditions = require "core.lualine.conditions"
+local colors = require "core.lualine.colors"
+
+return {
+ vi_mode = {
+ function()
+ return " "
+ end,
+ left_padding = 0,
+ right_padding = 0,
+ condition = conditions.hide_in_width,
+ },
+ branch = {
+ "branch",
+ icon = " ",
+ condition = function()
+ return conditions.hide_in_width() and conditions.check_git_workspace()
+ end,
+ },
+ diff = {
+ "diff",
+ symbols = { added = "  ", modified = "柳", removed = " " },
+ color_added = { fg = colors.green },
+ color_modified = { fg = colors.yellow },
+ color_removed = { fg = colors.red },
+ condition = conditions.hide_in_width,
+ },
+ python_env = {
+ function()
+ local utils = require "core.lualine.utils"
+ if vim.bo.filetype == "python" then
+ local venv = os.getenv "CONDA_DEFAULT_ENV"
+ if venv then
+ return string.format("  (%s)", utils.env_cleanup(venv))
+ end
+ venv = os.getenv "VIRTUAL_ENV"
+ if venv then
+ return string.format("  (%s)", utils.env_cleanup(venv))
+ end
+ return ""
+ end
+ return ""
+ end,
+ color = { fg = colors.green },
+ condition = conditions.hide_in_width,
+ },
+ diagnostics = {
+ "diagnostics",
+ sources = { "nvim_lsp" },
+ symbols = { error = " ", warn = " ", info = " ", hint = " " },
+ condition = conditions.hide_in_width,
+ },
+ treesitter = {
+ function()
+ if next(vim.treesitter.highlighter.active) then
+ return "  "
+ end
+ return ""
+ end,
+ color = { fg = colors.green },
+ condition = conditions.hide_in_width,
+ },
+ lsp = {
+ function(msg)
+ msg = msg or "LSP Inactive"
+ local buf_clients = vim.lsp.buf_get_clients()
+ if next(buf_clients) == nil then
+ return msg
+ end
+ local buf_ft = vim.bo.filetype
+ local buf_client_names = {}
+
+ -- add client
+ local utils = require "lsp.utils"
+ local active_client = utils.get_active_client_by_ft(buf_ft)
+ for _, client in pairs(buf_clients) do
+ if client.name ~= "null-ls" then
+ table.insert(buf_client_names, client.name)
+ end
+ end
+ vim.list_extend(buf_client_names, active_client or {})
+
+ -- add formatter
+ local formatters = require "lsp.null-ls.formatters"
+ local supported_formatters = formatters.list_supported_names(buf_ft)
+ vim.list_extend(buf_client_names, supported_formatters)
+
+ -- add linter
+ local linters = require "lsp.null-ls.linters"
+ local supported_linters = linters.list_supported_names(buf_ft)
+ vim.list_extend(buf_client_names, supported_linters)
+
+ return table.concat(buf_client_names, ", ")
+ end,
+ condition = conditions.hide_in_width,
+ icon = " ",
+ color = { gui = "bold" },
+ },
+ location = { "location", condition = conditions.hide_in_width },
+ progress = { "progress", condition = conditions.hide_in_width },
+ spaces = {
+ function()
+ local label = "Spaces: "
+ if not vim.api.nvim_buf_get_option(0, "expandtab") then
+ label = "Tab size: "
+ end
+ return label .. vim.api.nvim_buf_get_option(0, "shiftwidth") .. " "
+ end,
+ condition = conditions.hide_in_width,
+ },
+ encoding = {
+ "o:encoding",
+ upper = true,
+ condition = conditions.hide_in_width,
+ },
+ filetype = { "filetype", condition = conditions.hide_in_width },
+ scrollbar = {
+ function()
+ local current_line = vim.fn.line "."
+ local total_lines = vim.fn.line "$"
+ local chars = { "__", "▁▁", "▂▂", "▃▃", "▄▄", "▅▅", "▆▆", "▇▇", "██" }
+ local line_ratio = current_line / total_lines
+ local index = math.ceil(line_ratio * #chars)
+ return chars[index]
+ end,
+ color = { fg = colors.yellow, bg = colors.bg },
+ left_padding = 0,
+ right_padding = 0,
+ },
+}
diff --git a/lua/core/lualine/conditions.lua b/lua/core/lualine/conditions.lua
new file mode 100644
index 00000000..2d2d81ef
--- /dev/null
+++ b/lua/core/lualine/conditions.lua
@@ -0,0 +1,17 @@
+local window_width_limit = 80
+
+local conditions = {
+ buffer_not_empty = function()
+ return vim.fn.empty(vim.fn.expand "%:t") ~= 1
+ end,
+ hide_in_width = function()
+ return vim.fn.winwidth(0) > window_width_limit
+ end,
+ check_git_workspace = function()
+ local filepath = vim.fn.expand "%:p:h"
+ local gitdir = vim.fn.finddir(".git", filepath .. ";")
+ return gitdir and #gitdir > 0 and #gitdir < #filepath
+ end,
+}
+
+return conditions
diff --git a/lua/core/lualine/init.lua b/lua/core/lualine/init.lua
new file mode 100644
index 00000000..5b3ce2a1
--- /dev/null
+++ b/lua/core/lualine/init.lua
@@ -0,0 +1,47 @@
+local M = {}
+M.config = function()
+ lvim.builtin.lualine = {
+ active = true,
+ style = "lvim",
+ options = {
+ icons_enabled = nil,
+ component_separators = nil,
+ section_separators = nil,
+ theme = nil,
+ disabled_filetypes = nil,
+ },
+ sections = {
+ lualine_a = nil,
+ lualine_b = nil,
+ lualine_c = nil,
+ lualine_x = nil,
+ lualine_y = nil,
+ lualine_z = nil,
+ },
+ inactive_sections = {
+ lualine_a = nil,
+ lualine_b = nil,
+ lualine_c = nil,
+ lualine_x = nil,
+ lualine_y = nil,
+ lualine_z = nil,
+ },
+ tabline = nil,
+ extensions = nil,
+ on_config_done = nil,
+ }
+end
+
+M.setup = function()
+ require("core.lualine.styles").update()
+ require("core.lualine.utils").validate_theme()
+
+ local lualine = require "lualine"
+ lualine.setup(lvim.builtin.lualine)
+
+ if lvim.builtin.lualine.on_config_done then
+ lvim.builtin.lualine.on_config_done(lualine, lvim.builtin.lualine)
+ end
+end
+
+return M
diff --git a/lua/core/lualine/styles.lua b/lua/core/lualine/styles.lua
new file mode 100644
index 00000000..e35f66fe
--- /dev/null
+++ b/lua/core/lualine/styles.lua
@@ -0,0 +1,170 @@
+local M = {}
+local components = require "core.lualine.components"
+
+local styles = {
+ lvim = nil,
+ default = nil,
+ none = nil,
+}
+
+styles.none = {
+ style = "none",
+ options = {
+ icons_enabled = true,
+ component_separators = "",
+ section_separators = "",
+ disabled_filetypes = {},
+ },
+ sections = {
+ lualine_a = {},
+ lualine_b = {},
+ lualine_c = {},
+ lualine_x = {},
+ lualine_y = {},
+ lualine_z = {},
+ },
+ inactive_sections = {
+ lualine_a = {},
+ lualine_b = {},
+ lualine_c = {},
+ lualine_x = {},
+ lualine_y = {},
+ lualine_z = {},
+ },
+ tabline = {},
+ extensions = {},
+}
+
+styles.default = {
+ style = "default",
+ options = {
+ icons_enabled = true,
+ component_separators = { "", "" },
+ section_separators = { "", "" },
+ disabled_filetypes = {},
+ },
+ sections = {
+ lualine_a = { "mode" },
+ lualine_b = { "branch" },
+ lualine_c = { "filename" },
+ lualine_x = { "encoding", "fileformat", "filetype" },
+ lualine_y = { "progress" },
+ lualine_z = { "location" },
+ },
+ inactive_sections = {
+ lualine_a = {},
+ lualine_b = {},
+ lualine_c = { "filename" },
+ lualine_x = { "location" },
+ lualine_y = {},
+ lualine_z = {},
+ },
+ tabline = {},
+ extensions = {},
+}
+
+styles.lvim = {
+ style = "lvim",
+ options = {
+ icons_enabled = true,
+ component_separators = "",
+ section_separators = "",
+ disabled_filetypes = { "dashboard", "" },
+ },
+ sections = {
+ lualine_a = {
+ components.vi_mode,
+ },
+ lualine_b = {
+ components.branch,
+ },
+ lualine_c = {
+ components.diff,
+ components.python_env,
+ },
+ lualine_x = {
+ components.diagnostics,
+ components.treesitter,
+ components.lsp,
+ -- components.location,
+ -- components.progress,
+ -- components.spaces,
+ -- components.encoding,
+ components.filetype,
+ },
+ lualine_y = {
+ -- components.filetype,
+ },
+ lualine_z = {
+ components.scrollbar,
+ },
+ },
+ inactive_sections = {
+ lualine_a = {
+ "filename",
+ },
+ lualine_b = {},
+ lualine_c = {},
+ lualine_x = {},
+ lualine_y = {},
+ lualine_z = {},
+ },
+ tabline = {},
+ extensions = { "nvim-tree" },
+}
+
+function M.get_style(style)
+ local style_keys = vim.tbl_keys(styles)
+ if not vim.tbl_contains(style_keys, style) then
+ local Log = require "core.log"
+ local logger = Log:get_default()
+ logger.error(
+ "Invalid lualine style",
+ string.format('"%s"', style),
+ "options are: ",
+ string.format('"%s"', table.concat(style_keys, '", "'))
+ )
+ logger.info '"lvim" style is applied.'
+ style = "lvim"
+ end
+
+ return vim.deepcopy(styles[style])
+end
+
+function M.update()
+ local config = lvim.builtin.lualine
+ local style = M.get_style(config.style)
+
+ lvim.builtin.lualine = {
+ active = true,
+ style = style.style,
+ options = {
+ icons_enabled = config.options.icons_enabled or style.options.icons_enabled,
+ component_separators = config.options.component_separators or style.options.component_separators,
+ section_separators = config.options.section_separators or style.options.section_separators,
+ theme = config.options.theme or lvim.colorscheme or "auto",
+ disabled_filetypes = config.options.disabled_filetypes or style.options.disabled_filetypes,
+ },
+ sections = {
+ lualine_a = config.sections.lualine_a or style.sections.lualine_a,
+ lualine_b = config.sections.lualine_b or style.sections.lualine_b,
+ lualine_c = config.sections.lualine_c or style.sections.lualine_c,
+ lualine_x = config.sections.lualine_x or style.sections.lualine_x,
+ lualine_y = config.sections.lualine_y or style.sections.lualine_y,
+ lualine_z = config.sections.lualine_z or style.sections.lualine_z,
+ },
+ inactive_sections = {
+ lualine_a = config.inactive_sections.lualine_a or style.inactive_sections.lualine_a,
+ lualine_b = config.inactive_sections.lualine_b or style.inactive_sections.lualine_b,
+ lualine_c = config.inactive_sections.lualine_c or style.inactive_sections.lualine_c,
+ lualine_x = config.inactive_sections.lualine_x or style.inactive_sections.lualine_x,
+ lualine_y = config.inactive_sections.lualine_y or style.inactive_sections.lualine_y,
+ lualine_z = config.inactive_sections.lualine_z or style.inactive_sections.lualine_z,
+ },
+ tabline = config.tabline or style.tabline,
+ extensions = config.extensions or style.extensions,
+ on_config_done = config.on_config_done,
+ }
+end
+
+return M
diff --git a/lua/core/lualine/utils.lua b/lua/core/lualine/utils.lua
new file mode 100644
index 00000000..f2f29592
--- /dev/null
+++ b/lua/core/lualine/utils.lua
@@ -0,0 +1,24 @@
+local M = {}
+
+function M.validate_theme()
+ local theme = lvim.builtin.lualine.options.theme
+
+ local lualine_loader = require "lualine.utils.loader"
+ local ok = pcall(lualine_loader.load_theme, theme)
+ if not ok then
+ lvim.builtin.lualine.options.theme = "auto"
+ end
+end
+
+function M.env_cleanup(venv)
+ if string.find(venv, "/") then
+ local final_venv = venv
+ for w in venv:gmatch "([^/]+)" do
+ final_venv = w
+ end
+ venv = final_venv
+ end
+ return venv
+end
+
+return M