From 4c697d89f30ae619d82749a6f0f89f2a4a6e51d7 Mon Sep 17 00:00:00 2001 From: jdhao Date: Tue, 6 Aug 2024 17:00:18 +0200 Subject: [PATCH] change name of lualine config --- lua/config/lualine.lua | 228 +++++++++++++++++++++++++++++++++++++++++ lua/plugin_specs.lua | 2 +- 2 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 lua/config/lualine.lua diff --git a/lua/config/lualine.lua b/lua/config/lualine.lua new file mode 100644 index 0000000..08ead79 --- /dev/null +++ b/lua/config/lualine.lua @@ -0,0 +1,228 @@ +local fn = vim.fn + +local function spell() + if vim.o.spell then + return string.format("[SPELL]") + end + + return "" +end + +--- show indicator for Chinese IME +local function ime_state() + if vim.g.is_mac then + -- ref: https://github.com/vim-airline/vim-airline/blob/master/autoload/airline/extensions/xkblayout.vim#L11 + local layout = fn.libcall(vim.g.XkbSwitchLib, "Xkb_Switch_getXkbLayout", "") + + -- We can use `xkbswitch -g` on the command line to get current mode. + -- mode for macOS builtin pinyin IME: com.apple.inputmethod.SCIM.ITABC + -- mode for Rime: im.rime.inputmethod.Squirrel.Rime + local res = fn.match(layout, [[\v(Squirrel\.Rime|SCIM.ITABC)]]) + if res ~= -1 then + return "[CN]" + end + end + + return "" +end + +local function trailing_space() + if not vim.o.modifiable then + return "" + end + + local line_num = nil + + for i = 1, fn.line("$") do + local linetext = fn.getline(i) + -- To prevent invalid escape error, we wrap the regex string with `[[]]`. + local idx = fn.match(linetext, [[\v\s+$]]) + + if idx ~= -1 then + line_num = i + break + end + end + + local msg = "" + if line_num ~= nil then + msg = string.format("[%d]trailing", line_num) + end + + return msg +end + +local function mixed_indent() + if not vim.o.modifiable then + return "" + end + + local space_pat = [[\v^ +]] + local tab_pat = [[\v^\t+]] + local space_indent = fn.search(space_pat, "nwc") + local tab_indent = fn.search(tab_pat, "nwc") + local mixed = (space_indent > 0 and tab_indent > 0) + local mixed_same_line + if not mixed then + mixed_same_line = fn.search([[\v^(\t+ | +\t)]], "nwc") + mixed = mixed_same_line > 0 + end + if not mixed then + return "" + end + if mixed_same_line ~= nil and mixed_same_line > 0 then + return "MI:" .. mixed_same_line + end + local space_indent_cnt = fn.searchcount({ pattern = space_pat, max_count = 1e3 }).total + local tab_indent_cnt = fn.searchcount({ pattern = tab_pat, max_count = 1e3 }).total + if space_indent_cnt > tab_indent_cnt then + return "MI:" .. tab_indent + else + return "MI:" .. space_indent + end +end + +local diff = function() + local git_status = vim.b.gitsigns_status_dict + if git_status == nil then + return + end + + local modify_num = git_status.changed + local remove_num = git_status.removed + local add_num = git_status.added + + local info = { added = add_num, modified = modify_num, removed = remove_num } + -- vim.print(info) + return info +end + +local virtual_env = function() + -- only show virtual env for Python + if vim.bo.filetype ~= "python" then + return "" + end + + local conda_env = os.getenv("CONDA_DEFAULT_ENV") + local venv_path = os.getenv("VIRTUAL_ENV") + + if venv_path == nil then + if conda_env == nil then + return "" + else + return string.format(" %s (conda)", conda_env) + end + else + local venv_name = vim.fn.fnamemodify(venv_path, ":t") + return string.format(" %s (venv)", venv_name) + end +end + +local get_active_lsp = function() + local msg = "No Active Lsp" + local buf_ft = vim.api.nvim_get_option_value("filetype", {}) + local clients = vim.lsp.get_clients { bufnr = 0 } + if next(clients) == nil then + return msg + end + + for _, client in ipairs(clients) do + ---@diagnostic disable-next-line: undefined-field + local filetypes = client.config.filetypes + if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then + return client.name + end + end + return msg +end + +require("lualine").setup { + options = { + icons_enabled = true, + theme = "auto", + section_separators = "", + component_separators = "", + disabled_filetypes = {}, + always_divide_middle = true, + }, + sections = { + lualine_a = { "mode" }, + lualine_b = { + { + "branch", + fmt = function(name, _) + -- truncate branch name in case the name is too long + return string.sub(name, 1, 20) + end, + }, + { + virtual_env, + color = { fg = "black", bg = "#F1CA81" }, + }, + }, + lualine_c = { + { + "filename", + symbols = { + readonly = "[🔒]", + }, + }, + { + "diff", + source = diff, + }, + { + ime_state, + color = { fg = "black", bg = "#f46868" }, + }, + { + spell, + color = { fg = "black", bg = "#a7c080" }, + }, + }, + lualine_x = { + { + get_active_lsp, + icon = "ī‚… LSP:", + }, + { + "diagnostics", + sources = { "nvim_diagnostic" }, + symbols = { error = "🆇 ", warn = "âš ī¸ ", info = "â„šī¸ ", hint = " " }, + }, + }, + lualine_y = { + "encoding", + { + "fileformat", + symbols = { + unix = "unix", + dos = "win", + mac = "mac", + }, + }, + "filetype", + }, + lualine_z = { + { + trailing_space, + color = "WarningMsg", + }, + { + mixed_indent, + color = "WarningMsg", + }, + "progress" + }, + }, + inactive_sections = { + lualine_a = {}, + lualine_b = {}, + lualine_c = { "filename" }, + lualine_x = { "location" }, + lualine_y = {}, + lualine_z = {}, + }, + tabline = {}, + extensions = { "quickfix", "fugitive", "nvim-tree" }, +} diff --git a/lua/plugin_specs.lua b/lua/plugin_specs.lua index ed5a1c3..c57fd25 100644 --- a/lua/plugin_specs.lua +++ b/lua/plugin_specs.lua @@ -156,7 +156,7 @@ local plugin_specs = { event = "VeryLazy", cond = firenvim_not_active, config = function() - require("config.statusline") + require("config.lualine") end, },