現在比較流行的 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,
},