nix-community.nixvim/plugins/statuslines/lualine.nix

239 lines
7 KiB
Nix
Raw Normal View History

{
pkgs,
config,
lib,
...
}:
with lib; let
cfg = config.plugins.lualine;
helpers = import ../helpers.nix {inherit lib;};
mkSeparatorsOption = {
leftDefault ? " ",
rightDefault ? " ",
name,
}: (
helpers.mkNullOrOption
(types.submodule {
2021-11-02 18:03:01 +01:00
options = {
left = helpers.defaultNullOpts.mkStr leftDefault "Left separator";
right = helpers.defaultNullOpts.mkStr rightDefault "Right separator";
2021-11-02 18:03:01 +01:00
};
})
"${name} separtors."
);
mkComponentOptions = defaultName:
helpers.mkNullOrOption
(types.listOf (types.oneOf [
types.str
(types.submodule {
options = {
name = mkOption {
type = types.either types.str helpers.rawType;
description = "Component name or function";
default = defaultName;
2021-11-02 18:03:01 +01:00
};
icons_enabled = helpers.defaultNullOpts.mkBool true ''
Enables the display of icons alongside the component.
'';
icon = helpers.mkNullOrOption types.str ''
Defines the icon to be displayed in front of the component.
'';
separator = mkSeparatorsOption {name = "Component";};
color = helpers.mkNullOrOption (types.attrsOf types.str) ''
Defines a custom color for the component.
'';
padding =
helpers.defaultNullOpts.mkNullable
(
types.either
types.int
(types.submodule {
options = {
left = mkOption {
type = types.int;
description = "left padding";
};
right = mkOption {
type = types.int;
description = "left padding";
};
};
})
)
"1"
"Adds padding to the left and right of components.";
extraConfig = mkOption {
type = types.attrs;
default = {};
description = "extra options for the component";
};
};
})
]))
"";
in {
2021-11-02 15:04:12 +01:00
options = {
plugins.lualine = {
2023-01-22 03:32:08 +00:00
enable = mkEnableOption "lualine";
2021-11-02 18:03:01 +01:00
package = helpers.mkPackageOption "lualine" pkgs.vimPlugins.lualine-nvim;
general: add package options (#127) * barbar: package option * Base16: package option * gruvbox: package option * nord: package option * one: package option * onedark: package option * tokyonight: package option * nvim-cmp: package option * coq: package option * lspkind: package option * helpers: added package option to mkPlugin * fugitive: package option * gitgutter: package option * gitsigns: package option * neogit: package option * ledger: package option * nix: package option * plantuml-syntax: package option * treesitter-context: package option + formatting * treesitter-refactor: package option + formatting * treesitter: package option * zig: package option * null-ls: package option * null-ls/servers: package option * lsp-lines: package option * lspsaga: package option * trouble: package option * luasnip: added description for package option * airline: package option * lightline: package option * lualine: package option * telescope: package option * telescope/frecency: package option * telescope/fzf-native: package option * telescope/media-files: package option * comment-nvim: package option * vim-commentary: package option * dashboard: package option * easyescape: package option * emmet: package option * endwise: package option * floaterm: package option * goyo: package option * intellitab: package option * mark-radar: package option * notify: package option * nvim-autopairs: package option * nvim-tree: package option * project-nvim: package option * specs: package option * startify: package option * surround: package option * undotree: package option
2023-01-19 10:45:15 +00:00
theme = helpers.defaultNullOpts.mkStr "auto" "The theme to use for lualine-nvim.";
2021-11-02 19:37:08 +00:00
componentSeparators = mkSeparatorsOption {
leftDefault = "";
rightDefault = "";
name = "component";
2021-11-02 18:03:01 +01:00
};
2021-11-02 19:37:08 +00:00
sectionSeparators = mkSeparatorsOption {
leftDefault = "";
rightDefault = "";
name = "section";
2021-11-02 19:37:08 +00:00
};
disabledFiletypes =
helpers.mkNullOrOption
(types.submodule {
2021-11-02 18:03:01 +01:00
options = {
statusline = helpers.defaultNullOpts.mkNullable (types.str) "[]" ''
Only ignores the ft for statusline.
'';
2021-11-02 18:03:01 +01:00
winbar = helpers.defaultNullOpts.mkNullable (types.str) "[]" ''
Only ignores the ft for winbar.
'';
2021-11-02 18:03:01 +01:00
};
})
"Filetypes to disable lualine for.";
2021-11-02 19:37:08 +00:00
ignoreFocus = helpers.defaultNullOpts.mkNullable (types.listOf types.str) "[]" ''
If current filetype is in this list it'll always be drawn as inactive statusline and the
last window will be drawn as active statusline.
For example if you don't want statusline of your file tree / sidebar window to have active
statusline you can add their filetypes here.
'';
2021-11-02 19:37:08 +00:00
alwaysDivideMiddle = helpers.defaultNullOpts.mkBool true ''
When set to true, left sections i.e. 'a','b' and 'c' can't take over the entire statusline
even if neither of 'x', 'y' or 'z' are present.
'';
globalstatus = helpers.defaultNullOpts.mkBool false ''
Enable global statusline (have a single statusline at bottom of neovim instead of one for
every window).
This feature is only available in neovim 0.7 and higher.
'';
refresh =
helpers.mkNullOrOption
(types.submodule {
2021-11-02 18:03:01 +01:00
options = {
statusline = helpers.defaultNullOpts.mkInt 1000 "Refresh time for the status line (ms)";
2021-11-02 18:03:01 +01:00
tabline = helpers.defaultNullOpts.mkInt 1000 "Refresh time for the tabline (ms)";
winbar = helpers.defaultNullOpts.mkInt 1000 "Refresh time for the winbar (ms)";
2021-11-02 18:03:01 +01:00
};
})
''
Sets how often lualine should refresh it's contents (in ms).
The refresh option sets minimum time that lualine tries to maintain between refresh.
It's not guarantied if situation arises that lualine needs to refresh itself before this
time it'll do it.
'';
sections =
helpers.mkNullOrOption
(types.submodule {
options = {
lualine_a = mkComponentOptions "mode";
lualine_b = mkComponentOptions "branch";
lualine_c = mkComponentOptions "filename";
lualine_x = mkComponentOptions "encoding";
lualine_y = mkComponentOptions "progress";
lualine_z = mkComponentOptions "location";
};
})
"Sections configuration";
tabline =
helpers.mkNullOrOption
(types.submodule {
options = {
lualine_a = mkComponentOptions "";
lualine_b = mkComponentOptions "";
lualine_c = mkComponentOptions "";
lualine_x = mkComponentOptions "";
lualine_y = mkComponentOptions "";
lualine_z = mkComponentOptions "";
};
})
"Tabline configuration";
2021-11-02 18:03:01 +01:00
extensions = mkOption {
2021-12-11 14:55:05 +00:00
type = types.nullOr (types.listOf types.str);
default = null;
2021-11-02 18:03:01 +01:00
example = ''[ "fzf" ]'';
description = "list of enabled extensions";
};
2021-11-02 15:04:12 +01:00
};
};
config = let
processComponent = x:
(
if isAttrs x
then processTableComponent
else id
)
x;
processTableComponent = {
name,
icons_enabled,
icon,
separator,
color,
padding,
extraConfig,
}:
mergeAttrs
{
"@" = name;
inherit icons_enabled icon separator color padding;
}
extraConfig;
processSections = sections: mapAttrs (_: mapNullable (map processComponent)) sections;
setupOptions = {
options = {
theme = cfg.theme;
section_separators = cfg.sectionSeparators;
component_separators = cfg.componentSeparators;
disabled_filetypes = cfg.disabledFiletypes;
always_divide_middle = cfg.alwaysDivideMiddle;
globalstatus = cfg.globalstatus;
refresh = cfg.refresh;
};
sections = mapNullable processSections cfg.sections;
tabline = mapNullable processSections cfg.tabline;
extensions = cfg.extensions;
};
in
mkIf cfg.enable {
extraPlugins = [cfg.package];
extraPackages = [pkgs.git];
extraConfigLua = ''require("lualine").setup(${helpers.toLuaObject setupOptions})'';
2021-11-02 15:04:12 +01:00
};
}