Forráskód Böngészése

feat: use bufferline instead of barbar (#2254)

Abouzar Parvan 3 éve
szülő
commit
24537be03e
4 módosított fájl, 136 hozzáadás és 15 törlés
  1. 121 0
      lua/lvim/core/bufferline.lua
  2. 10 10
      lua/lvim/core/which-key.lua
  3. 2 2
      lua/lvim/keymappings.lua
  4. 3 3
      lua/lvim/plugins.lua

+ 121 - 0
lua/lvim/core/bufferline.lua

@@ -1,5 +1,38 @@
 local M = {}
 
+local function is_ft(b, ft)
+  return vim.bo[b].filetype == ft
+end
+
+local function diagnostics_indicator(_, _, diagnostics)
+  local result = {}
+  local symbols = { error = "", warning = "", info = "" }
+  for name, count in pairs(diagnostics) do
+    if symbols[name] and count > 0 then
+      table.insert(result, symbols[name] .. count)
+    end
+  end
+  result = table.concat(result, " ")
+  return #result > 0 and result or ""
+end
+
+local function custom_filter(buf, buf_nums)
+  local logs = vim.tbl_filter(function(b)
+    return is_ft(b, "log")
+  end, buf_nums)
+  if vim.tbl_isempty(logs) then
+    return true
+  end
+  local tab_num = vim.fn.tabpagenr()
+  local last_tab = vim.fn.tabpagenr "$"
+  local is_log = is_ft(buf, "log")
+  if last_tab == 1 then
+    return true
+  end
+  -- only show log buffers in secondary tabs
+  return (tab_num == last_tab and is_log) or (tab_num ~= last_tab and not is_log)
+end
+
 M.config = function()
   lvim.builtin.bufferline = {
     active = true,
@@ -7,11 +40,99 @@ M.config = function()
     keymap = {
       normal_mode = {},
     },
+    highlights = {
+      background = {
+        gui = "italic",
+      },
+      buffer_selected = {
+        gui = "bold",
+      },
+    },
+    options = {
+      numbers = "none", -- can be "none" | "ordinal" | "buffer_id" | "both" | function
+      close_command = "bdelete! %d", -- can be a string | function, see "Mouse actions"
+      right_mouse_command = "vert sbuffer %d", -- can be a string | function, see "Mouse actions"
+      left_mouse_command = "buffer %d", -- can be a string | function, see "Mouse actions"
+      middle_mouse_command = nil, -- can be a string | function, see "Mouse actions"
+      -- NOTE: this plugin is designed with this icon in mind,
+      -- and so changing this is NOT recommended, this is intended
+      -- as an escape hatch for people who cannot bear it for whatever reason
+      indicator_icon = "▎",
+      buffer_close_icon = "",
+      modified_icon = "●",
+      close_icon = "",
+      left_trunc_marker = "",
+      right_trunc_marker = "",
+      --- name_formatter can be used to change the buffer's label in the bufferline.
+      --- Please note some names can/will break the
+      --- bufferline so use this at your discretion knowing that it has
+      --- some limitations that will *NOT* be fixed.
+      name_formatter = function(buf) -- buf contains a "name", "path" and "bufnr"
+        -- remove extension from markdown files for example
+        if buf.name:match "%.md" then
+          return vim.fn.fnamemodify(buf.name, ":t:r")
+        end
+      end,
+      max_name_length = 18,
+      max_prefix_length = 15, -- prefix used when a buffer is de-duplicated
+      tab_size = 18,
+      diagnostics = "nvim_lsp",
+      diagnostics_update_in_insert = false,
+      diagnostics_indicator = diagnostics_indicator,
+      -- NOTE: this will be called a lot so don't do any heavy processing here
+      custom_filter = custom_filter,
+      offsets = {
+        {
+          filetype = "undotree",
+          text = "Undotree",
+          highlight = "PanelHeading",
+          padding = 1,
+        },
+        {
+          filetype = "NvimTree",
+          text = "Explorer",
+          highlight = "PanelHeading",
+          padding = 1,
+        },
+        {
+          filetype = "DiffviewFiles",
+          text = "Diff View",
+          highlight = "PanelHeading",
+          padding = 1,
+        },
+        {
+          filetype = "flutterToolsOutline",
+          text = "Flutter Outline",
+          highlight = "PanelHeading",
+        },
+        {
+          filetype = "packer",
+          text = "Packer",
+          highlight = "PanelHeading",
+          padding = 1,
+        },
+      },
+      show_buffer_icons = true, -- disable filetype icons for buffers
+      show_buffer_close_icons = true,
+      show_close_icon = false,
+      show_tab_indicators = true,
+      persist_buffer_sort = true, -- whether or not custom sorted buffers should persist
+      -- can also be a table containing 2 custom separators
+      -- [focused and unfocused]. eg: { '|', '|' }
+      separator_style = "thin",
+      enforce_regular_tabs = false,
+      always_show_bufferline = false,
+      sort_by = "id",
+    },
   }
 end
 
 M.setup = function()
   require("lvim.keymappings").load(lvim.builtin.bufferline.keymap)
+  require("bufferline").setup {
+    options = lvim.builtin.bufferline.options,
+    highlights = lvim.builtin.bufferline.highlights,
+  }
 
   if lvim.builtin.bufferline.on_config_done then
     lvim.builtin.bufferline.on_config_done()

+ 10 - 10
lua/lvim/core/which-key.lua

@@ -67,30 +67,30 @@ M.config = function()
       ["w"] = { "<cmd>w!<CR>", "Save" },
       ["q"] = { "<cmd>q!<CR>", "Quit" },
       ["/"] = { "<cmd>lua require('Comment.api').toggle_current_linewise()<CR>", "Comment" },
-      ["c"] = { "<cmd>BufferClose!<CR>", "Close Buffer" },
+      ["c"] = { "<cmd>bdelete!<CR>", "Close Buffer" },
       ["f"] = { require("lvim.core.telescope.custom-finders").find_project_files, "Find File" },
       ["h"] = { "<cmd>nohlsearch<CR>", "No Highlight" },
       b = {
         name = "Buffers",
-        j = { "<cmd>BufferPick<cr>", "Jump" },
+        j = { "<cmd>BufferLinePick<cr>", "Jump" },
         f = { "<cmd>Telescope buffers<cr>", "Find" },
-        b = { "<cmd>b#<cr>", "Previous" },
-        w = { "<cmd>BufferWipeout<cr>", "Wipeout" },
+        b = { "<cmd>BufferLineCyclePrev<cr>", "Previous" },
+        -- w = { "<cmd>BufferWipeout<cr>", "Wipeout" }, -- TODO: implement this for bufferline
         e = {
-          "<cmd>BufferCloseAllButCurrent<cr>",
-          "Close all but current",
+          "<cmd>BufferLinePickClose<cr>",
+          "Pick which buffer to close",
         },
-        h = { "<cmd>BufferCloseBuffersLeft<cr>", "Close all to the left" },
+        h = { "<cmd>BufferLineCloseLeft<cr>", "Close all to the left" },
         l = {
-          "<cmd>BufferCloseBuffersRight<cr>",
+          "<cmd>BufferLineCloseRight<cr>",
           "Close all to the right",
         },
         D = {
-          "<cmd>BufferOrderByDirectory<cr>",
+          "<cmd>BufferLineSortByDirectory<cr>",
           "Sort by directory",
         },
         L = {
-          "<cmd>BufferOrderByLanguage<cr>",
+          "<cmd>BufferLineSortByExtension<cr>",
           "Sort by language",
         },
       },

+ 2 - 2
lua/lvim/keymappings.lua

@@ -56,8 +56,8 @@ local defaults = {
     ["<C-Right>"] = ":vertical resize +2<CR>",
 
     -- Tab switch buffer
-    ["<S-l>"] = ":BufferNext<CR>",
-    ["<S-h>"] = ":BufferPrevious<CR>",
+    ["<S-l>"] = ":BufferLineCycleNext<CR>",
+    ["<S-h>"] = ":BufferLineCyclePrev<CR>",
 
     -- Move current line / block with Alt-j/k a la vscode.
     ["<A-j>"] = ":m .+1<CR>==",

+ 3 - 3
lua/lvim/plugins.lua

@@ -1,5 +1,5 @@
 local commit = {
-  barbar = "6e638309efcad2f308eb9c5eaccf6f62b794bbab",
+  bufferline = "7451dfc97d28e6783dbeb1cdcff12619a9323c98",
   cmp_buffer = "f83773e2f433a923997c5faad7ea689ec24d1785",
   cmp_luasnip = "d6f837f4e8fe48eeae288e638691b91b97d1737f",
   cmp_nvim_lsp = "ebdfc204afb87f15ce3d3d3f5df0b8181443b5ba",
@@ -224,8 +224,8 @@ return {
   },
 
   {
-    "romgrk/barbar.nvim",
-    commit = commit.barbar,
+    "akinsho/bufferline.nvim",
+    commit = commit.bufferline,
     config = function()
       require("lvim.core.bufferline").setup()
     end,