summaryrefslogtreecommitdiff
path: root/lua/lvim/core/builtins/breadcrumbs.lua
diff options
context:
space:
mode:
authorLostNeophyte <[email protected]>2023-02-11 14:41:45 +0100
committerLostNeophyte <[email protected]>2023-02-11 14:44:24 +0100
commit7be867e2aac31ef04565eaba6b416ede766c06d7 (patch)
tree413dc6c0e82b04e14f505b7f291ed56f97dea9ea /lua/lvim/core/builtins/breadcrumbs.lua
parented5b43bba06e6d1ef7b6bd7ed95c55b64e2df3c8 (diff)
refactor(builtins): move builtins to ./builtins
Diffstat (limited to 'lua/lvim/core/builtins/breadcrumbs.lua')
-rw-r--r--lua/lvim/core/builtins/breadcrumbs.lua233
1 files changed, 233 insertions, 0 deletions
diff --git a/lua/lvim/core/builtins/breadcrumbs.lua b/lua/lvim/core/builtins/breadcrumbs.lua
new file mode 100644
index 00000000..2ed0937e
--- /dev/null
+++ b/lua/lvim/core/builtins/breadcrumbs.lua
@@ -0,0 +1,233 @@
+local M = {}
+
+-- local Log = require "lvim.core.log"
+
+local icons = lvim.icons.kind
+
+M.config = function()
+ lvim.builtin.breadcrumbs = {
+ active = true,
+ winbar_filetype_exclude = {
+ "help",
+ "startify",
+ "dashboard",
+ "lazy",
+ "neo-tree",
+ "neogitstatus",
+ "NvimTree",
+ "Trouble",
+ "alpha",
+ "lir",
+ "Outline",
+ "spectre_panel",
+ "toggleterm",
+ "DressingSelect",
+ "Jaq",
+ "harpoon",
+ "dap-repl",
+ "dap-terminal",
+ "dapui_console",
+ "dapui_hover",
+ "lab",
+ "notify",
+ "noice",
+ "",
+ },
+ options = {
+ icons = {
+ Array = icons.Array .. " ",
+ Boolean = icons.Boolean,
+ Class = icons.Class .. " ",
+ Color = icons.Color .. " ",
+ Constant = icons.Constant .. " ",
+ Constructor = icons.Constructor .. " ",
+ Enum = icons.Enum .. " ",
+ EnumMember = icons.EnumMember .. " ",
+ Event = icons.Event .. " ",
+ Field = icons.Field .. " ",
+ File = icons.File .. " ",
+ Folder = icons.Folder .. " ",
+ Function = icons.Function .. " ",
+ Interface = icons.Interface .. " ",
+ Key = icons.Key .. " ",
+ Keyword = icons.Keyword .. " ",
+ Method = icons.Method .. " ",
+ Module = icons.Module .. " ",
+ Namespace = icons.Namespace .. " ",
+ Null = icons.Null .. " ",
+ Number = icons.Number .. " ",
+ Object = icons.Object .. " ",
+ Operator = icons.Operator .. " ",
+ Package = icons.Package .. " ",
+ Property = icons.Property .. " ",
+ Reference = icons.Reference .. " ",
+ Snippet = icons.Snippet .. " ",
+ String = icons.String .. " ",
+ Struct = icons.Struct .. " ",
+ Text = icons.Text .. " ",
+ TypeParameter = icons.TypeParameter .. " ",
+ Unit = icons.Unit .. " ",
+ Value = icons.Value .. " ",
+ Variable = icons.Variable .. " ",
+ },
+ highlight = true,
+ separator = " " .. lvim.icons.ui.ChevronRight .. " ",
+ depth_limit = 0,
+ depth_limit_indicator = "..",
+ },
+ }
+end
+
+M.setup = function()
+ local status_ok, navic = pcall(require, "nvim-navic")
+ if not status_ok then
+ return
+ end
+
+ M.create_winbar()
+ navic.setup(lvim.builtin.breadcrumbs.options)
+
+ return navic
+end
+
+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, hl_group
+ local devicons_ok, devicons = pcall(require, "nvim-web-devicons")
+ if lvim.use_icons and devicons_ok then
+ file_icon, hl_group = devicons.get_icon(filename, extension, { default = true })
+
+ if f.isempty(file_icon) then
+ file_icon = lvim.icons.kind.File
+ end
+ else
+ file_icon = ""
+ hl_group = "Normal"
+ end
+
+ local buf_ft = vim.bo.filetype
+
+ if buf_ft == "dapui_breakpoints" then
+ file_icon = lvim.icons.ui.Bug
+ end
+
+ if buf_ft == "dapui_stacks" then
+ file_icon = lvim.icons.ui.Stacks
+ end
+
+ if buf_ft == "dapui_scopes" then
+ file_icon = lvim.icons.ui.Scopes
+ end
+
+ if buf_ft == "dapui_watches" then
+ file_icon = lvim.icons.ui.Watches
+ end
+
+ -- if buf_ft == "dapui_console" then
+ -- file_icon = lvim.icons.ui.DebugConsole
+ -- 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
+ return "%#NavicSeparator#" .. lvim.icons.ui.ChevronRight .. "%* " .. gps_location
+ else
+ return ""
+ end
+end
+
+local excludes = function()
+ return vim.tbl_contains(lvim.builtin.breadcrumbs.winbar_filetype_exclude or {}, vim.bo.filetype)
+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#" .. lvim.icons.ui.Circle .. "%*"
+ 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({
+ "CursorHoldI",
+ "CursorHold",
+ "BufWinEnter",
+ "BufFilePost",
+ "InsertEnter",
+ "BufWritePost",
+ "TabClosed",
+ "TabEnter",
+ }, {
+ group = "_winbar",
+ callback = function()
+ if lvim.builtin.breadcrumbs.active then
+ local status_ok, _ = pcall(vim.api.nvim_buf_get_var, 0, "lsp_floating_window")
+ if not status_ok then
+ -- TODO:
+ M.get_winbar()
+ end
+ end
+ end,
+ })
+ end
+end
+
+return M