neovim-flake/modules/statusline/lualine/lualine.nix
Kalle Jepsen 11a974a111 statusline/lualine: extensible sections
This adds extraActiveSection and extraInactiveSection to the lualine
options to make it possible to easily extend the defaults with
additional sections. We're also changing the exposed type of the
*activeSection attributes from `str` to `listOf str`.
2023-10-23 21:08:31 +02:00

397 lines
11 KiB
Nix

{
config,
lib,
...
}:
with lib;
with builtins; let
supported_themes = import ./supported_themes.nix;
colorPuccin =
if config.vim.statusline.lualine.theme == "catppuccin"
then "#181825"
else "none";
in {
options.vim.statusline.lualine = {
enable = mkEnableOption "lualine statusline plugin";
icons = {
enable = mkEnableOption "icons for lualine" // {default = true;};
};
refresh = {
statusline = mkOption {
type = types.int;
description = "Refresh rate for lualine";
default = 1000;
};
tabline = mkOption {
type = types.int;
description = "Refresh rate for tabline";
default = 1000;
};
winbar = mkOption {
type = types.int;
description = "Refresh rate for winbar";
default = 1000;
};
};
globalStatus = mkOption {
type = types.bool;
description = "Enable global status for lualine";
default = true;
};
theme = let
themeSupported = elem config.vim.theme.name supported_themes;
in
mkOption {
description = "Theme for lualine";
type = types.enum ([
"auto"
"16color"
"gruvbox"
"ayu_dark"
"ayu_light"
"ayu_mirage"
"codedark"
"dracula"
"everforest"
"gruvbox"
"gruvbox_light"
"gruvbox_material"
"horizon"
"iceberg_dark"
"iceberg_light"
"jellybeans"
"material"
"modus_vivendi"
"molokai"
"nightfly"
"nord"
"oceanicnext"
"onelight"
"palenight"
"papercolor_dark"
"papercolor_light"
"powerline"
"seoul256"
"solarized_dark"
"tomorrow"
"wombat"
]
++ optional themeSupported config.vim.theme.name);
default = "auto";
# TODO: xml generation error if the closing '' is on a new line.
# issue: https://gitlab.com/rycee/nmd/-/issues/10
defaultText = nvim.nmd.literalAsciiDoc ''`config.vim.theme.name` if theme supports lualine else "auto"'';
};
sectionSeparator = {
left = mkOption {
type = types.str;
description = "Section separator for left side";
default = "";
};
right = mkOption {
type = types.str;
description = "Section separator for right side";
default = "";
};
};
componentSeparator = {
left = mkOption {
type = types.str;
description = "Component separator for left side";
default = "";
};
right = mkOption {
type = types.str;
description = "Component separator for right side";
default = "";
};
};
activeSection = {
a = mkOption {
type = types.listOf types.str;
description = "active config for: | (A) | B | C X | Y | Z |";
default = [
''
{
"mode",
icons_enabled = true,
separator = {
left = '',
right = ''
},
}
''
];
};
b = mkOption {
type = types.listOf types.str;
description = "active config for: | A | (B) | C X | Y | Z |";
default = [
''
{
"filetype",
colored = true,
icon_only = true,
icon = { align = 'left' },
color = {bg='${colorPuccin}', fg='lavender'},
}
''
''
{
"filename",
color = {bg='${colorPuccin}'},
symbols = {modified = '', readonly = ''},
}
''
];
};
c = mkOption {
type = types.listOf types.str;
description = "active config for: | A | B | (C) X | Y | Z |";
default = [
''
{
"diff",
colored = false,
diff_color = {
-- Same color values as the general color option can be used here.
added = 'DiffAdd', -- Changes the diff's added color
modified = 'DiffChange', -- Changes the diff's modified color
removed = 'DiffDelete', -- Changes the diff's removed color you
},
symbols = {added = '+', modified = '~', removed = '-'}, -- Changes the diff symbols
color = {
bg='${colorPuccin}',
fg='lavender'
},
}
''
];
};
x = mkOption {
type = types.listOf types.str;
description = "active config for: | A | B | C (X) | Y | Z |";
default = [
''
{
-- Lsp server name
function()
local buf_ft = vim.api.nvim_get_option_value('filetype', {})
-- List of buffer types to exclude
local excluded_buf_ft = {"toggleterm", "NvimTree", "TelescopePrompt"}
-- Check if the current buffer type is in the excluded list
for _, excluded_type in ipairs(excluded_buf_ft) do
if buf_ft == excluded_type then
return ""
end
end
-- Get the name of the LSP server active in the current buffer
local clients = vim.lsp.get_active_clients()
local msg = 'No Active Lsp'
-- if no lsp client is attached then return the msg
if next(clients) == nil then
return msg
end
for _, client in ipairs(clients) do
local filetypes = client.config.filetypes
if filetypes and vim.fn.index(filetypes, buf_ft) ~= -1 then
return client.name
end
end
return msg
end,
icon = ' ',
color = {bg='${colorPuccin}', fg='lavender'},
}
''
''
{
"diagnostics",
sources = {'nvim_lsp', 'nvim_diagnostic', 'coc'},
symbols = {error = '󰅙 ', warn = ' ', info = ' ', hint = '󰌵 '},
color = {bg='${colorPuccin}', fg='lavender'},
diagnostics_color = {
color_error = { fg = 'red' },
color_warn = { fg = 'yellow' },
color_info = { fg = 'cyan' },
},
}
''
];
};
y = mkOption {
type = types.listOf types.str;
description = "active config for: | A | B | C X | (Y) | Z |";
default = [
''
{
'searchcount',
maxcount = 999,
timeout = 120,
color = {bg='${colorPuccin}', fg='lavender'}
}
''
''
{
"branch",
icon = ' ',
color = {bg='${colorPuccin}', fg='lavender'},
}
''
];
};
z = mkOption {
type = types.listOf types.str;
description = "active config for: | A | B | C X | Y | (Z) |";
default = [
''
{
"progress",
separator = {
left = '',
},
}
''
''
{
"location",
}
''
''
{
"fileformat",
color = {fg='black'},
symbols = {
unix = '', -- e712
dos = '', -- e70f
mac = '', -- e711
},
}
''
];
};
};
extraActiveSection = {
a = mkOption {
type = types.listOf types.str;
description = "Extra entries for activeSection.a";
default = [];
};
b = mkOption {
type = types.listOf types.str;
description = "Extra entries for activeSection.b";
default = [];
};
c = mkOption {
type = types.listOf types.str;
description = "Extra entries for activeSection.c";
default = [];
};
x = mkOption {
type = types.listOf types.str;
description = "Extra entries for activeSection.x";
default = [];
};
y = mkOption {
type = types.listOf types.str;
description = "Extra entries for activeSection.y";
default = [];
};
z = mkOption {
type = types.listOf types.str;
description = "Extra entries for activeSection.z";
default = [];
};
};
inactiveSection = {
a = mkOption {
type = types.listOf types.str;
description = "inactive config for: | (A) | B | C X | Y | Z |";
default = [];
};
b = mkOption {
type = types.listOf types.str;
description = "inactive config for: | A | (B) | C X | Y | Z |";
default = [];
};
c = mkOption {
type = types.listOf types.str;
description = "inactive config for: | A | B | (C) X | Y | Z |";
default = ["'filename'"];
};
x = mkOption {
type = types.listOf types.str;
description = "inactive config for: | A | B | C (X) | Y | Z |";
default = ["'location'"];
};
y = mkOption {
type = types.listOf types.str;
description = "inactive config for: | A | B | C X | (Y) | Z |";
default = [];
};
z = mkOption {
type = types.listOf types.str;
description = "inactive config for: | A | B | C X | Y | (Z) |";
default = [];
};
};
extraInactiveSection = {
a = mkOption {
type = types.listOf types.str;
description = "Extra entries for inactiveSection.a";
default = [];
};
b = mkOption {
type = types.listOf types.str;
description = "Extra entries for inactiveSection.b";
default = [];
};
c = mkOption {
type = types.listOf types.str;
description = "Extra entries for inactiveSection.c";
default = [];
};
x = mkOption {
type = types.listOf types.str;
description = "Extra entries for inactiveSection.x";
default = [];
};
y = mkOption {
type = types.listOf types.str;
description = "Extra entries for inactiveSection.y";
default = [];
};
z = mkOption {
type = types.listOf types.str;
description = "Extra entries for inactiveSection.z";
default = [];
};
};
};
}