diff options
author | Christian Chiarulli <[email protected]> | 2022-09-19 22:14:32 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2022-09-19 22:14:32 -0400 |
commit | f11909b5649f6169fe48b61a40def4924754c38e (patch) | |
tree | 9c732a3b1db4326a5075092816295b72d2b2dc6b /lua/lvim/core | |
parent | 2190dba4c7e297568549743476b8f76c620ae4cc (diff) |
feat: breadcrumbs (#3043)
Diffstat (limited to 'lua/lvim/core')
-rw-r--r-- | lua/lvim/core/breadcrumbs.lua | 204 | ||||
-rw-r--r-- | lua/lvim/core/builtins/init.lua | 1 |
2 files changed, 205 insertions, 0 deletions
diff --git a/lua/lvim/core/breadcrumbs.lua b/lua/lvim/core/breadcrumbs.lua new file mode 100644 index 00000000..3b038473 --- /dev/null +++ b/lua/lvim/core/breadcrumbs.lua @@ -0,0 +1,204 @@ +local M = {} + +-- local Log = require "lvim.core.log" + +M.config = function() + local status_ok, navic = pcall(require, "nvim-navic") + if not status_ok then + return + end + + navic.setup { + icons = { + Text = " ", + -- Method = "m", + -- Function = "", + -- Constructor = "", + Method = " ", + Function = " ", + Constructor = " ", + Field = " ", + -- Variable = "", + Variable = " ", + Class = " ", + Interface = " ", + -- Module = "", + Module = " ", + Property = " ", + Unit = " ", + Value = " ", + Enum = " ", + -- Keyword = "", + Keyword = " ", + -- Snippet = "", + Snippet = " ", + Color = " ", + File = " ", + Reference = " ", + Folder = " ", + EnumMember = " ", + Constant = " ", + Struct = " ", + Event = " ", + Operator = " ", + TypeParameter = " ", + Array = " ", + Number = " ", + String = " ", + Boolean = "蘒", + Object = " ", + Package = " ", + Namespace = "", + Key = "", + Null = "ﳠ", + }, + highlight = true, + separator = " " .. ">" .. " ", + depth_limit = 0, + depth_limit_indicator = "..", + } +end + +M.winbar_filetype_exclude = { + "help", + "startify", + "dashboard", + "packer", + "neogitstatus", + "NvimTree", + "Trouble", + "alpha", + "lir", + "Outline", + "spectre_panel", + "toggleterm", + "DressingSelect", + "Jaq", + "harpoon", + "dapui_scopes", + "dapui_breakpoints", + "dapui_stacks", + "dapui_watches", + "dap-repl", + "dap-terminal", + "dapui_console", + "lab", + "Markdown", + "", +} + +M.get_filename = function() + local filename = vim.fn.expand "%:t" + local extension = vim.fn.expand "%:e" + local f = require "lvim.utils.functions" + + if not f.isempty(filename) then + local file_icon, file_icon_color = + require("nvim-web-devicons").get_icon_color(filename, extension, { default = true }) + + local hl_group = "FileIconColor" .. extension + + vim.api.nvim_set_hl(0, hl_group, { fg = file_icon_color }) + if f.isempty(file_icon) then + file_icon = "" + end + + local navic_text = vim.api.nvim_get_hl_by_name("Normal", true) + vim.api.nvim_set_hl(0, "Winbar", { fg = navic_text.foreground }) + + return " " .. "%#" .. hl_group .. "#" .. file_icon .. "%*" .. " " .. "%#Winbar#" .. filename .. "%*" + end +end + +local get_gps = function() + local status_gps_ok, gps = pcall(require, "nvim-navic") + if not status_gps_ok then + return "" + end + + local status_ok, gps_location = pcall(gps.get_location, {}) + if not status_ok then + return "" + end + + if not gps.is_available() or gps_location == "error" then + return "" + end + + if not require("lvim.utils.functions").isempty(gps_location) then + -- TODO: replace with chevron + return ">" .. " " .. gps_location + else + return "" + end +end + +local excludes = function() + if vim.tbl_contains(M.winbar_filetype_exclude, vim.bo.filetype) then + vim.opt_local.winbar = nil + return true + end + return false +end + +M.get_winbar = function() + if excludes() then + return + end + local f = require "lvim.utils.functions" + local value = M.get_filename() + + local gps_added = false + if not f.isempty(value) then + local gps_value = get_gps() + value = value .. " " .. gps_value + if not f.isempty(gps_value) then + gps_added = true + end + end + + if not f.isempty(value) and f.get_buf_option "mod" then + -- TODO: replace with circle + local mod = "%#LspCodeLens#" .. "" .. "%*" + if gps_added then + value = value .. " " .. mod + else + value = value .. mod + end + end + + local num_tabs = #vim.api.nvim_list_tabpages() + + if num_tabs > 1 and not f.isempty(value) then + local tabpage_number = tostring(vim.api.nvim_tabpage_get_number(0)) + value = value .. "%=" .. tabpage_number .. "/" .. tostring(num_tabs) + end + + local status_ok, _ = pcall(vim.api.nvim_set_option_value, "winbar", value, { scope = "local" }) + if not status_ok then + return + end +end + +M.create_winbar = function() + vim.api.nvim_create_augroup("_winbar", {}) + if vim.fn.has "nvim-0.8" == 1 then + vim.api.nvim_create_autocmd( + { "CursorMoved", "CursorHold", "BufWinEnter", "BufFilePost", "InsertEnter", "BufWritePost", "TabClosed" }, + { + group = "_winbar", + callback = function() + local status_ok, _ = pcall(vim.api.nvim_buf_get_var, 0, "lsp_floating_window") + if not status_ok then + -- TODO: + require("lvim.core.breadcrumbs").get_winbar() + end + end, + } + ) + end +end + +M.create_winbar() + +return M diff --git a/lua/lvim/core/builtins/init.lua b/lua/lvim/core/builtins/init.lua index afb19b63..14afe4ea 100644 --- a/lua/lvim/core/builtins/init.lua +++ b/lua/lvim/core/builtins/init.lua @@ -11,6 +11,7 @@ local builtins = { "lvim.core.nvimtree", "lvim.core.lir", "lvim.core.illuminate", + "lvim.core.breadcrumbs", "lvim.core.project", "lvim.core.bufferline", "lvim.core.autopairs", |