|
@@ -1,235 +1,112 @@
|
|
|
local M = {}
|
|
|
|
|
|
--- local Log = require "lvim.core.log"
|
|
|
-
|
|
|
local icons = lvim.icons.kind
|
|
|
|
|
|
+local function select_menu_item()
|
|
|
+ local menu = require("dropbar.api").get_current_dropbar_menu()
|
|
|
+ if not menu then
|
|
|
+ return
|
|
|
+ end
|
|
|
+ local cursor = vim.api.nvim_win_get_cursor(menu.win)
|
|
|
+ local component = menu.entries[cursor[1]]:first_clickable(cursor[2])
|
|
|
+ if component then
|
|
|
+ menu:click_on(component, nil, 1, "l")
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+local function close_menu()
|
|
|
+ local menu = require("dropbar.api").get_current_dropbar_menu()
|
|
|
+ if not menu then
|
|
|
+ return false
|
|
|
+ end
|
|
|
+ menu:close()
|
|
|
+ return true
|
|
|
+end
|
|
|
+
|
|
|
+local function close_all_menus()
|
|
|
+ while close_menu() do
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
M.config = function()
|
|
|
lvim.builtin.breadcrumbs = {
|
|
|
active = true,
|
|
|
on_config_done = nil,
|
|
|
- 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",
|
|
|
- "neotest-summary",
|
|
|
- "",
|
|
|
- },
|
|
|
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 .. " ",
|
|
|
+ kinds = {
|
|
|
+ symbols = {
|
|
|
+ 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 .. " ",
|
|
|
+ },
|
|
|
+ },
|
|
|
+ ui = {
|
|
|
+ bar = {
|
|
|
+ separator = " " .. lvim.icons.ui.ChevronRight .. " ",
|
|
|
+ extends = "…",
|
|
|
+ },
|
|
|
+ -- menu = {
|
|
|
+ -- separator = " ",
|
|
|
+ -- indicator = lvim.icons.ui.TriangleShortArrowRight,
|
|
|
+ -- -- indicator = " ",
|
|
|
+ -- },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ menu = {
|
|
|
+ quick_navigation = true,
|
|
|
+ keymaps = {
|
|
|
+ ["l"] = select_menu_item,
|
|
|
+ ["h"] = close_menu,
|
|
|
+ ["<ESC>"] = close_all_menus,
|
|
|
+ ["q"] = close_all_menus,
|
|
|
+ },
|
|
|
},
|
|
|
- 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")
|
|
|
+ local status_ok, dropbar = pcall(require, "dropbar")
|
|
|
if not status_ok then
|
|
|
return
|
|
|
end
|
|
|
-
|
|
|
- M.create_winbar()
|
|
|
- navic.setup(lvim.builtin.breadcrumbs.options)
|
|
|
+ dropbar.setup(lvim.builtin.breadcrumbs.options)
|
|
|
|
|
|
if lvim.builtin.breadcrumbs.on_config_done then
|
|
|
lvim.builtin.breadcrumbs.on_config_done()
|
|
|
end
|
|
|
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", {})
|
|
|
- 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:
|
|
|
- require("lvim.core.breadcrumbs").get_winbar()
|
|
|
- end
|
|
|
- end
|
|
|
- end,
|
|
|
- })
|
|
|
-end
|
|
|
-
|
|
|
return M
|