mirror of
https://github.com/LunarVim/LunarVim.git
synced 2025-08-31 23:20:08 +02:00
feat: breadcrumbs (#3043)
This commit is contained in:
parent
2190dba4c7
commit
f11909b564
6 changed files with 241 additions and 1 deletions
204
lua/lvim/core/breadcrumbs.lua
Normal file
204
lua/lvim/core/breadcrumbs.lua
Normal file
|
@ -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
|
|
@ -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",
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -84,7 +84,7 @@
|
|||
"commit": "2d02a56"
|
||||
},
|
||||
"tokyonight.nvim": {
|
||||
"commit": "48fc163"
|
||||
"commit": "4bd6ba8"
|
||||
},
|
||||
"packer.nvim": {
|
||||
"commit": "6afb674"
|
||||
|
@ -118,5 +118,8 @@
|
|||
},
|
||||
"vim-illuminate": {
|
||||
"commit": "b545262"
|
||||
},
|
||||
"nvim-navic": {
|
||||
"commit": "202312e"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue