summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lua/lvim/core/breadcrumbs.lua204
-rw-r--r--lua/lvim/core/builtins/init.lua1
-rw-r--r--lua/lvim/lsp/init.lua10
-rw-r--r--lua/lvim/plugins.lua9
-rw-r--r--lua/lvim/utils/functions.lua13
-rw-r--r--snapshots/default.json5
6 files changed, 241 insertions, 1 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
diff --git a/lua/lvim/core/builtins/init.lua b/lua/lvim/core/builtins/init.lua
index afb19b63..14afe4ea 100644
--- a/lua/lvim/core/builtins/init.lua
+++ b/lua/lvim/core/builtins/init.lua
@@ -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",
diff --git a/lua/lvim/lsp/init.lua b/lua/lvim/lsp/init.lua
index 0b361972..ac3f6925 100644
--- a/lua/lvim/lsp/init.lua
+++ b/lua/lvim/lsp/init.lua
@@ -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()
diff --git a/lua/lvim/plugins.lua b/lua/lvim/plugins.lua
index 3d2a2b83..85c1e80e 100644
--- a/lua/lvim/plugins.lua
+++ b/lua/lvim/plugins.lua
@@ -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()
diff --git a/lua/lvim/utils/functions.lua b/lua/lvim/utils/functions.lua
index de46bc8a..1cb8ec8e 100644
--- a/lua/lvim/utils/functions.lua
+++ b/lua/lvim/utils/functions.lua
@@ -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
diff --git a/snapshots/default.json b/snapshots/default.json
index 2a28e147..aae5e387 100644
--- a/snapshots/default.json
+++ b/snapshots/default.json
@@ -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"
}
}