cd ..

自定义一个 Neovim bufferline

Updated February 1, 2023 , by fzdwx | projectnvim

现在比较流行的 buffer line 插件是 akinsho/bufferline,但是我感觉他太重了,而且不好看.比如说它可以跟 lsp 集成,可以切换各种 tab/buffer 模式等,但是不一定每个人都需要,而且各个顺序都固定了,总之就是我想造轮子: fzdwx/bufline.nvim

在 nvim 中定义 tabline 可以使用 vim.opt.tabline=xxx 来设置, 比如说下面这段代码,就很容易的实现一个 buffer line:

function _G.qweqweqwe()
    retrun "this is my line"
end
-- config
vim.opt.tabline = "%!v:lua.qweqweqwe()"

Show

那么接下来就很容易想到:

  1. 获取所有 buffer
  2. 获取 buffer 对应文件的信息
  3. 支持高亮

如何实现的就不赘述了,如果有兴趣可以查看: fzdwx/bufline.nvim. 目前所有的内容都可以自定义:

M.folder  -- 入参是 buffer 数量,要求返回 Group: {hl,str}
M.dirName -- 入参是当前 buffer id, 要求返回 Group
M.devicon -- 入参是当前 buffer id,"Sel/NoSel",是否选中, 要求返回 Group
M.title   -- 入参是当前 buffer id,"Sel/NoSel", 要求返回 Group
M.modified  -- 入参是当前 buffer id, 要求返回 str
M.separator -- 要求返回 Group
-- 下面这两个方法也可以自定义,需要用户自己保证正确性
M.cell  -- 每个 buffer 对应的信息,入参是当前 buffer id,当前选择的buffer id,要求返回 group 列表
M.bufline -- 构造整个 bufline

str 就是具体内容, hl 就是要高亮标签, 例如 BufLineFolder当前支持:

BufLineTitleSel
BufLineTitleNoSel
BufLineFill
BufLine
BufLineFolder

这些高亮标签都没有默认设置,需要用户自定义,例如:

vim.cmd([[au ColorScheme * hi BufLineTitleSel gui=none guibg='#282C34' guifg='#5C6370']])

设置高亮遇到的问题,当设置 icon 的背景为空时,有背景颜色的 icon 跟没有的会一大一小,后来没办法,只能让它都开启颜色的,也就是没选中的 buffer 也会开启颜色跟 bufferline 的一样.

在 lazy 中使用:

{
    "fzdwx/bufline.nvim",
    event = "BufEnter",
    dependencies = {
        "nvim-tree/nvim-web-devicons",
    },
    config = function()
        local buf = require("bufline")
        buf.setup({
            -- 自定义 separator
            separator = function()
                return {
                    str = '',
                    hl = ""
                }
            end
        })
    end,
},