summaryrefslogtreecommitdiff
path: root/lua/lvim/core/breadcrumbs.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lvim/core/breadcrumbs.lua')
-rw-r--r--lua/lvim/core/breadcrumbs.lua204
1 files changed, 204 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