Bläddra i källkod

feat: breadcrumbs (#3043)

Christian Chiarulli 2 år sedan
förälder
incheckning
f11909b564

+ 204 - 0
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

+ 1 - 0
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",

+ 10 - 0
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()

+ 9 - 0
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()

+ 13 - 0
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

+ 4 - 1
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"
   }
 }