nixvimConfig/plugins/heirline.nix

217 lines
7.6 KiB
Nix
Raw Normal View History

2024-06-06 08:06:53 +02:00
# homepage: https://github.com/rebelot/heirline.nvim
{ pkgs, ... }:
{
extra = {
packages = [ pkgs.vimPlugins.heirline-nvim ];
# Config from AstroNvim
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/heirline.lua
# https://github.com/AstroNvim/AstroNvim/blob/v4.7.7/lua/astronvim/plugins/configs/heirline.lua
config = /*lua*/ ''
2024-06-06 08:06:53 +02:00
local status = require("astroui.status")
require("heirline").setup({
opts = {
colors = require("astroui").config.status.setup_colors(),
disable_winbar_cb = function(args)
return not require("astrocore.buffer").is_valid(args.buf)
or status.condition.buffer_matches({ buftype = { "terminal", "nofile" } }, args.buf)
end,
},
statusline = { -- statusline
hl = { fg = "fg", bg = "bg" },
status.component.mode(),
status.component.git_branch(),
status.component.file_info(),
status.component.git_diff(),
status.component.diagnostics(),
status.component.fill(),
status.component.cmd_info(),
status.component.fill(),
status.component.lsp(),
status.component.virtual_env(),
status.component.treesitter(),
status.component.nav(),
status.component.mode { surround = { separator = "right" } },
},
winbar = { -- winbar
init = function(self) self.bufnr = vim.api.nvim_get_current_buf() end,
fallthrough = false,
{
condition = function() return not status.condition.is_active() end,
status.component.separated_path(),
status.component.file_info {
file_icon = { hl = status.hl.file_icon "winbar", padding = { left = 0 } },
filename = {},
filetype = false,
file_read_only = false,
hl = status.hl.get_attributes("winbarnc", true),
surround = false,
update = "BufEnter",
},
},
status.component.breadcrumbs { hl = status.hl.get_attributes("winbar", true) },
},
tabline = { -- bufferline
{ -- automatic sidebar padding
condition = function(self)
self.winid = vim.api.nvim_tabpage_list_wins(0)[1]
self.winwidth = vim.api.nvim_win_get_width(self.winid)
return self.winwidth ~= vim.o.columns -- only apply to sidebars
and not require("astrocore.buffer").is_valid(vim.api.nvim_win_get_buf(self.winid)) -- if buffer is not in tabline
end,
provider = function(self) return (" "):rep(self.winwidth + 1) end,
hl = { bg = "tabline_bg" },
},
status.heirline.make_buflist(status.component.tabline_file_info()), -- component for each buffer tab
status.component.fill { hl = { bg = "tabline_bg" } }, -- fill the rest of the tabline with background color
{ -- tab list
condition = function() return #vim.api.nvim_list_tabpages() >= 2 end, -- only show tabs if there are more than one
status.heirline.make_tablist { -- component for each tab
provider = status.provider.tabnr(),
hl = function(self) return status.hl.get_attributes(status.heirline.tab_type(self, "tab"), true) end,
},
{ -- close button for current tab
provider = status.provider.close_button { kind = "TabClose", padding = { left = 1, right = 1 } },
hl = status.hl.get_attributes("tab_close", true),
on_click = {
callback = function() require("astrocore.buffer").close_tab() end,
name = "heirline_tabline_close_tab_callback",
},
},
},
},
statuscolumn = {
init = function(self) self.bufnr = vim.api.nvim_get_current_buf() end,
status.component.foldcolumn(),
status.component.numbercolumn(),
status.component.signcolumn(),
},
})
'';
};
rootOpts = {
autoGroups = {
bufferline = { };
heirline = { };
};
autoCmd = [
{
desc = "Update buffers when adding new buffers";
event = [ "BufAdd" "BufEnter" "TabNewEntered" ];
group = "bufferline";
callback.__raw = ''
function(args)
local buf_utils = require "astrocore.buffer"
if not vim.t.bufs then vim.t.bufs = {} end
if not buf_utils.is_valid(args.buf) then return end
if args.buf ~= buf_utils.current_buf then
buf_utils.last_buf = buf_utils.is_valid(buf_utils.current_buf) and buf_utils.current_buf or nil
buf_utils.current_buf = args.buf
end
local bufs = vim.t.bufs
if not vim.tbl_contains(bufs, args.buf) then
table.insert(bufs, args.buf)
vim.t.bufs = bufs
end
vim.t.bufs = vim.tbl_filter(buf_utils.is_valid, vim.t.bufs)
require("astrocore").event "BufsUpdated"
end
'';
}
{
desc = "Update buffers when deleting buffers";
event = [ "BufDelete" "TermClose" ];
group = "bufferline";
callback.__raw = ''
function(args)
local removed
for _, tab in ipairs(vim.api.nvim_list_tabpages()) do
local bufs = vim.t[tab].bufs
if bufs then
for i, bufnr in ipairs(bufs) do
if bufnr == args.buf then
removed = true
table.remove(bufs, i)
vim.t[tab].bufs = bufs
break
end
end
end
end
vim.t.bufs = vim.tbl_filter(require("astrocore.buffer").is_valid, vim.t.bufs)
if removed then require("astrocore").event "BufsUpdated" end
vim.cmd.redrawtabline()
end
'';
}
{
desc = "Refresh heirline colors on colorscheme load";
event = [ "ColorScheme" ];
group = "heirline";
callback.__raw = "function() require('astroui.status.heirline').refresh_colors() end";
}
];
keymaps = [
{
2024-06-08 00:25:04 +02:00
mode = "n";
2024-06-06 08:06:53 +02:00
key = "<leader>bb";
options.desc = "Select buffer from tabline";
action.__raw = ''
function()
require("astroui.status.heirline").buffer_picker(function(bufnr) vim.api.nvim_win_set_buf(0, bufnr) end)
end
'';
}
{
2024-06-08 00:25:04 +02:00
mode = "n";
2024-06-06 08:06:53 +02:00
key = "<leader>bd";
options.desc = "Close buffer from tabline";
action.__raw = ''
function()
require("astroui.status.heirline").buffer_picker(
function(bufnr) require("astrocore.buffer").close(bufnr) end
)
end
'';
}
{
2024-06-08 00:25:04 +02:00
mode = "n";
2024-06-06 08:06:53 +02:00
key = "<leader>b\\";
options.desc = "Horizontal split buffer from tabline";
action.__raw = ''
function()
require("astroui.status.heirline").buffer_picker(function(bufnr)
vim.cmd.split()
vim.api.nvim_win_set_buf(0, bufnr)
end)
end
'';
}
{
2024-06-08 00:25:04 +02:00
mode = "n";
2024-06-06 08:06:53 +02:00
key = "<leader>b|";
options.desc = "Vertical split buffer from tabline";
action.__raw = ''
function()
require("astroui.status.heirline").buffer_picker(function(bufnr)
vim.cmd.vsplit()
vim.api.nvim_win_set_buf(0, bufnr)
end)
end
'';
}
];
};
}