feat: breadcrumbs (#3043)

This commit is contained in:
Christian Chiarulli 2022-09-19 22:14:32 -04:00 committed by GitHub
parent 2190dba4c7
commit f11909b564
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 241 additions and 1 deletions

View 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

View file

@ -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",

View file

@ -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()

View file

@ -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()

View file

@ -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

View file

@ -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"
}
}