现在比较流行的 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()"
那么接下来就很容易想到:
- 获取所有 buffer
- 获取 buffer 对应文件的信息
- 比如说文件名称
- 显示文件 icon(由 nvim-tree/nvim-web-devicons 支持)
- 支持高亮
如何实现的就不赘述了,如果有兴趣可以查看: 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,
},