nix-community.nixvim/plugins/by-name/lualine/default.nix

411 lines
12 KiB
Nix

{
lib,
pkgs,
...
}:
let
inherit (lib.nixvim) defaultNullOpts mkSettingsRenamedOptionModules;
inherit (lib) types;
in
lib.nixvim.plugins.mkNeovimPlugin {
name = "lualine";
packPathName = "lualine.nvim";
package = "lualine-nvim";
maintainers = [ lib.maintainers.khaneliman ];
# TODO: Added 2024-09-05, remove after 24.11
optionsRenamedToSettings = [
"extensions"
"sections"
"inactiveSections"
"tabline"
"winbar"
"inactiveWinbar"
];
imports =
let
basePluginPath = [
"plugins"
"lualine"
];
settingsPath = basePluginPath ++ [ "settings" ];
optionsPath = settingsPath ++ [ "options" ];
oldOptions = [
"theme"
"globalstatus"
"refresh"
"iconsEnabled"
"sectionSeparators"
"componentSeparators"
"disabledFiletypes"
"ignoreFocus"
"alwaysDivideMiddle"
];
in
(mkSettingsRenamedOptionModules basePluginPath optionsPath oldOptions)
++ [
# TODO: added 2025-04-06, remove after 25.05
(lib.nixvim.mkRemovedPackageOptionModule {
plugin = "lualine";
packageName = "git";
})
];
dependencies = [ "git" ];
settingsOptions =
let
mkSeparatorsOption =
{ left, right }:
defaultNullOpts.mkNullableWithRaw' {
description = ''
Filetypes in which to disable lualine.
Allows you to specify filetypes that you want to only disable on specific components.
'';
pluginDefault = {
inherit left right;
};
type =
with types;
either str (submodule {
freeformType = attrsOf anything;
options = {
left = defaultNullOpts.mkStr left "Left separator";
right = defaultNullOpts.mkStr right "Right separator";
};
});
};
# NOTE: This option is used for the shared component section definitions.
# We used to transform several options for the user to handle unkeying inside an attribute set and
# merging in undefined options into the final option. Now that we have freeformType support the user can
# manage this configuration exactly as the plugin expects without us transforming the values for them.
mkComponentOptions =
description:
lib.nixvim.mkNullOrOption' {
type =
with types;
let
# TODO: added 2024-09-05 remove after 24.11
oldAttrs = [
[ "name" ]
[
"icon"
"icon"
]
[ "extraConfig" ]
];
isOldType = x: lib.any (loc: lib.hasAttrByPath loc x) oldAttrs;
oldType = addCheck (attrsOf anything) isOldType // {
description = "attribute set containing ${lib.concatMapStringsSep ", " lib.showOption oldAttrs}";
};
coerceFn =
attrs:
lib.pipe attrs [
# Transform old `name` attr to `__unkeyed`
(
x:
if x ? name then
lib.removeAttrs x [ "name" ]
// {
__unkeyed-1 = x.name;
}
else
x
)
# Transform old `icon.icon` attr to `__unkeyed`
(
x:
if x.icon or null ? icon then
x
// {
icon = removeAttrs x.icon [ "icon" ] // {
__unkeyed-1 = x.icon.icon;
};
}
else
x
)
# Merge in old `extraConfig` attr
(x: removeAttrs x [ "extraConfig" ] // x.extraConfig or { })
];
newType = submodule {
freeformType = attrsOf anything;
options = {
icons_enabled = defaultNullOpts.mkBool true ''
Whether to display icons alongside the component.
'';
icon = lib.nixvim.mkNullOrOption' {
type = either str (attrsOf anything);
description = "The icon to be displayed in the component.";
};
separator = mkSeparatorsOption {
left = " ";
right = " ";
};
color = defaultNullOpts.mkNullable' {
type = either attrs str;
pluginDefault = lib.literalMD "The color defined by your theme, for the respective section & mode.";
description = "Defines a custom color for the component.";
};
padding = defaultNullOpts.mkNullable (oneOf [
int
(submodule {
# In case they add support for top/bottom padding
freeformType = attrsOf (maybeRaw int);
options = {
left = defaultNullOpts.mkInt null "Left padding.";
right = defaultNullOpts.mkInt null "Right padding.";
};
})
rawLua
]) 1 "Amount of padding added to components.";
fmt = lib.nixvim.mkNullOrLuaFn' {
description = ''
A lua function to format the component string.
'';
example = ''
function(text)
return text .. "!!!"
end
'';
};
};
};
in
maybeRaw (listOf (either str (lib.nixvim.transitionType oldType coerceFn (maybeRaw newType))));
inherit description;
};
mkEmptySectionOption = name: {
lualine_a = mkComponentOptions "Left section on left side.";
lualine_b = mkComponentOptions "Middle section on left side.";
lualine_c = mkComponentOptions "Right section on left side.";
lualine_x = mkComponentOptions "Left section on right side.";
lualine_y = mkComponentOptions "Middle section on right side.";
lualine_z = mkComponentOptions "Right section on right side.";
};
in
{
options = {
icons_enabled = defaultNullOpts.mkBool true ''
Whether to enable icons for all components.
This option is also available on individual components to control whether they should display icons.
'';
theme = defaultNullOpts.mkNullable (
with types; either str attrs
) "auto" "The theme to use for lualine-nvim.";
component_separators = mkSeparatorsOption {
left = "";
right = "";
};
section_separators = mkSeparatorsOption {
left = "";
right = "";
};
disabled_filetypes = defaultNullOpts.mkNullableWithRaw' {
description = ''
Filetypes in which to disable lualine.
Allows you to specify filetypes that you want to only disable on specific components.
'';
pluginDefault = { };
type =
with types;
either (listOf (maybeRaw str)) (submodule {
freeformType = attrsOf anything;
options = {
statusline = defaultNullOpts.mkListOf str [ ] ''
Hide the statusline component on specified filetypes.
'';
winbar = defaultNullOpts.mkListOf str [ ] ''
Hide the winbar component on specified filetypes.
'';
};
});
};
ignore_focus = defaultNullOpts.mkNullableWithRaw' {
type = types.listOf types.str;
pluginDefault = [ ];
description = ''
A list of filetypes that should always show an "unfocused" statusline.
If the focused window's filetype is in this list, then the most
recently focused window will be drawn as the active statusline.
'';
example = [
"neo-tree"
"nvim-tree"
"mini-files"
];
};
always_divide_middle = defaultNullOpts.mkBool true ''
Whether to prevent left sections i.e. 'a','b' and 'c' from taking over the entire statusline
even if neither of 'x', 'y' or 'z' are present.
'';
globalstatus = defaultNullOpts.mkBool false ''
Whether to enable "global" statusline.
I.e. having a single statusline at bottom of neovim, instead of one for each individual window.
'';
refresh = {
statusline = defaultNullOpts.mkInt 1000 "Refresh time for the status line (ms)";
tabline = defaultNullOpts.mkInt 1000 "Refresh time for the tabline (ms)";
winbar = defaultNullOpts.mkInt 1000 "Refresh time for the winbar (ms)";
};
};
sections = {
lualine_a = mkComponentOptions "mode";
lualine_b = mkComponentOptions "branch";
lualine_c = mkComponentOptions "filename";
lualine_x = mkComponentOptions "encoding";
lualine_y = mkComponentOptions "progress";
lualine_z = mkComponentOptions "location";
};
inactive_sections = {
lualine_a = mkComponentOptions "";
lualine_b = mkComponentOptions "";
lualine_c = mkComponentOptions "filename";
lualine_x = mkComponentOptions "location";
lualine_y = mkComponentOptions "";
lualine_z = mkComponentOptions "";
};
tabline = mkEmptySectionOption "Tabline configuration";
winbar = mkEmptySectionOption "Winbar configuration.";
inactive_winbar = mkEmptySectionOption "Winbar configuration used when inactive.";
extensions = defaultNullOpts.mkListOf (with lib.types; either str (attrsOf anything)) [
] "List of enabled extensions.";
};
settingsExample = {
options = {
disabled_filetypes = {
__unkeyed-1 = "startify";
__unkeyed-2 = "neo-tree";
statusline = [
"dap-repl"
];
winbar = [
"aerial"
"dap-repl"
"neotest-summary"
];
};
globalstatus = true;
};
sections = {
lualine_a = [ "mode" ];
lualine_b = [ "branch" ];
lualine_c = [
"filename"
"diff"
];
lualine_x = [
"diagnostics"
{
__unkeyed-1.__raw = ''
function()
local msg = ""
local buf_ft = vim.api.nvim_buf_get_option(0, 'filetype')
local clients = vim.lsp.get_active_clients()
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.fg = "#ffffff";
}
"encoding"
"fileformat"
"filetype"
];
lualine_y = [
{
__unkeyed-1 = "aerial";
cond.__raw = ''
function()
local buf_size_limit = 1024 * 1024
if vim.api.nvim_buf_get_offset(0, vim.api.nvim_buf_line_count(0)) > buf_size_limit then
return false
end
return true
end
'';
sep = " ) ";
depth.__raw = "nil";
dense = false;
dense_sep = ".";
colored = true;
}
];
lualine_z = [
{
__unkeyed-1 = "location";
}
];
};
tabline = {
lualine_a = [
{
__unkeyed-1 = "buffers";
symbols = {
alternate_file = "";
};
}
];
lualine_z = [ "tabs" ];
};
winbar = {
lualine_c = [
{
__unkeyed-1 = "navic";
}
];
lualine_x = [
{
__unkeyed-1 = "filename";
newfile_status = true;
path = 3;
shorting_target = 150;
}
];
};
};
}