diff options
Diffstat (limited to 'lua')
-rw-r--r-- | lua/lvim/core/breadcrumbs.lua | 204 | ||||
-rw-r--r-- | lua/lvim/core/builtins/init.lua | 1 | ||||
-rw-r--r-- | lua/lvim/lsp/init.lua | 10 | ||||
-rw-r--r-- | lua/lvim/plugins.lua | 9 | ||||
-rw-r--r-- | lua/lvim/utils/functions.lua | 13 |
5 files changed, 237 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", diff --git a/lua/lvim/lsp/init.lua b/lua/lvim/lsp/init.lua index 0b361972..ac3f6925 100644 --- a/lua/lvim/lsp/init.lua +++ b/lua/lvim/lsp/init.lua @@ -60,6 +60,15 @@ function M.common_on_init(client, bufnr) end end +local function attach_navic(client, bufnr) + vim.g.navic_silence = true + local status_ok, navic = pcall(require, "nvim-navic") + if not status_ok then + return + end + navic.attach(client, bufnr) +end + function M.common_on_attach(client, bufnr) if lvim.lsp.on_attach_callback then lvim.lsp.on_attach_callback(client, bufnr) @@ -74,6 +83,7 @@ function M.common_on_attach(client, bufnr) end add_lsp_buffer_keybindings(bufnr) add_lsp_buffer_options(bufnr) + attach_navic(client, bufnr) end function M.get_common_opts() diff --git a/lua/lvim/plugins.lua b/lua/lvim/plugins.lua index 3d2a2b83..85c1e80e 100644 --- a/lua/lvim/plugins.lua +++ b/lua/lvim/plugins.lua @@ -202,6 +202,15 @@ local core_plugins = { disable = not lvim.builtin.lualine.active, }, + -- breadcrumbs + { + "SmiteshP/nvim-navic", + config = function() + require("lvim.core.breadcrumbs").setup() + end, + -- disable = not lvim.builtin.breadcrumbs.active, + }, + { "akinsho/bufferline.nvim", config = function() diff --git a/lua/lvim/utils/functions.lua b/lua/lvim/utils/functions.lua index de46bc8a..1cb8ec8e 100644 --- a/lua/lvim/utils/functions.lua +++ b/lua/lvim/utils/functions.lua @@ -16,4 +16,17 @@ function M.smart_quit() end end +function M.isempty(s) + return s == nil or s == "" +end + +function M.get_buf_option(opt) + local status_ok, buf_option = pcall(vim.api.nvim_buf_get_option, 0, opt) + if not status_ok then + return nil + else + return buf_option + end +end + return M |