plugins/lightline: migrate to mkNeovimPlugin

This commit is contained in:
Austin Horstman 2024-08-23 09:17:11 -05:00
parent 052ee66dbb
commit 4c8d3559ac
No known key found for this signature in database
4 changed files with 359 additions and 111 deletions

View file

@ -56,26 +56,28 @@
enable = true; enable = true;
# This is optional - it will default to your enabled colorscheme # This is optional - it will default to your enabled colorscheme
colorscheme = "wombat"; settings = {
colorscheme = "wombat";
# This is one of lightline's example configurations # This is one of lightline's example configurations
active = { active = {
left = [ left = [
[ [
"mode" "mode"
"paste" "paste"
] ]
[ [
"readonly" "readonly"
"filename" "filename"
"modified" "modified"
"helloworld" "helloworld"
] ]
]; ];
}; };
component = { component = {
helloworld = "Hello, world!"; helloworld = "Hello, world!";
};
}; };
}; };

View file

@ -174,7 +174,7 @@ lib.nixvim.neovim-plugin.mkNeovimPlugin config {
extraConfig = cfg: { extraConfig = cfg: {
plugins.airline.settings.theme = lib.mkIf cfg.setUpBar (lib.mkDefault name); plugins.airline.settings.theme = lib.mkIf cfg.setUpBar (lib.mkDefault name);
plugins.lualine.theme = lib.mkIf cfg.setUpBar (lib.mkDefault name); plugins.lualine.theme = lib.mkIf cfg.setUpBar (lib.mkDefault name);
plugins.lightline.colorscheme = lib.mkDefault null; plugins.lightline.settings.colorscheme = lib.mkDefault null;
opts.termguicolors = lib.mkDefault true; opts.termguicolors = lib.mkDefault true;

View file

@ -1,117 +1,215 @@
{ {
lib, lib,
helpers,
config, config,
options,
pkgs, pkgs,
... ...
}: }:
with lib;
let let
cfg = config.plugins.lightline; inherit (lib) types;
inherit (lib.nixvim) defaultNullOpts;
in in
{ lib.nixvim.neovim-plugin.mkNeovimPlugin config {
options = { name = "lightline";
originalName = "lightline.vim";
defaultPackage = pkgs.vimPlugins.lightline-vim;
maintainers = [ lib.maintainers.khaneliman ];
description = ''
### Example of defining your own component_function
plugins.lightline = { plugins.lightline = {
enable = mkEnableOption "lightline"; enable = true;
settings.component_function = {
readonly = "LightlineReadonly";
};
};
package = helpers.mkPluginPackageOption "lightline" pkgs.vimPlugins.lightline-vim; extraConfigLua = '''
function LightlineReadonly()
local is_readonly = vim.bo.readonly == 1
local filetype = vim.bo.filetype
colorscheme = mkOption { if is_readonly and filetype ~= "help" then
type = with types; nullOr str; return "RO"
default = config.colorscheme; else
description = "The colorscheme to use for lightline. Defaults to .colorscheme."; return ""
example = "gruvbox"; end
}; end
''';
'';
componentFunction = mkOption { # TODO: Added 2024-08-23, remove after 24.11
default = null; optionsRenamedToSettings = [
type = with types; nullOr (attrsOf str); "colorscheme"
description = '' "componentFunction"
A list of function component definitions. "component"
"active"
"inactive"
"modeMap"
];
You should define the functions themselves in extraConfig settingsOptions = {
colorscheme = defaultNullOpts.mkStr "default" ''
The colorscheme to use for lightline.
Default theme is equal to `powerline`.
'';
component_function = defaultNullOpts.mkAttrsOf types.str { } ''
A list of function component definitions.
You can use the name of a function defined elsewhere.
'';
component =
defaultNullOpts.mkAttrsOf types.str
{
mode = ''%{lightline#mode()}'';
absolutepath = "%F";
relativepath = "%f";
filename = "%t";
modified = "%M";
bufnum = "%n";
paste = ''%{&paste?"PASTE"=""}'';
readonly = "%R";
charvalue = "%b";
charvaluehex = "%B";
fileencoding = ''%{&fenc!=#" "?&fenc=&enc}'';
fileformat = "%{&ff}";
filetype = ''%{&ft!=#""?&ft="no ft"}'';
percent = "%3p%%";
percentwin = "%P";
spell = ''%{&spell?&spelllang=" "}'';
lineinfo = "%3l=%-2c";
line = "%l";
column = "%c";
close = "%999X X ";
winnr = ''%{winnr()}'';
}
''
Lightline component definitions. Uses 'statusline' syntax.
Consult `:h 'statusline'` for a list of what's available.
''; '';
example = ''
plugins.lightline = {
enable = true;
componentFunction = {
readonly = "LightlineReadonly";
};
extraConfig = ''' active =
function! LightlineReadonly() defaultNullOpts.mkAttrsOf (with types; listOf (listOf str))
return &readonly && &filetype !=# 'help' ? 'RO' : ''' {
endfunction left = [
'''; [
}; "mode"
"paste"
]
[
"readonly"
"filename"
"modified"
]
];
right = [
[ "lineinfo" ]
[ "percent" ]
[
"fileformat"
"fileencoding"
"filetype"
]
];
}
''
Components placement for the active window.
''; '';
};
component = mkOption { inactive =
default = null; defaultNullOpts.mkAttrsOf (with types; listOf (listOf str))
type = with types; nullOr (attrsOf str); {
description = "Lightline component definitions. Uses 'statusline' syntax. Consult :h 'statusline' for a list of what's available."; left = [ "filename" ];
}; right = [
[ "lineinfo" ]
[ "percent" ]
];
}
''
Components placement for inactive windows.
'';
active = mkOption { tabline =
default = null; defaultNullOpts.mkAttrsOf (with types; listOf (listOf str))
description = "List of components for the active window."; {
type = types.nullOr ( left = [ [ "tabs" ] ];
types.submodule { right = [ [ "close" ] ];
options = }
let ''
listType = with helpers.nixvimTypes; maybeRaw (listOf (listOf str)); Components placement for tabline.
in '';
{
left = helpers.mkNullOrOption listType "List of components that will show up on the left side of the bar";
right = helpers.mkNullOrOption listType "List of components that will show up on the right side of the bar"; tab = defaultNullOpts.mkAttrsOf (with types; listOf str) {
}; active = [
} "tabnum"
); "filename"
}; "modified"
];
inactive = [
"tabnum"
"filename"
"modified"
];
} ''A dictionary to store the tab components in each tabs.'';
inactive = mkOption { mode_map =
default = null; defaultNullOpts.mkAttrsOf types.str
description = "List of components for inactive windows."; {
type = types.nullOr ( "n" = "NORMAL";
types.submodule { "i" = "INSERT";
options = "R" = "REPLACE";
let "v" = "VISUAL";
listType = with helpers.nixvimTypes; maybeRaw (listOf (listOf str)); "V" = "V-LINE";
in "\<C-v>" = "V-BLOCK";
{ "c" = "COMMAND";
left = helpers.mkNullOrOption listType "List of components that will show up on the left side of the bar"; "s" = "SELECT";
"S" = "S-LINE";
"\<C-s>" = "S-BLOCK";
"t" = "TERMINAL";
}
''
Mode name mappings
'';
};
right = helpers.mkNullOrOption listType "List of components that will show up on the right side of the bar"; settingsExample = {
}; colorscheme = "gruvbox";
} component_function = {
); gitbranch = "FugitiveHead";
}; };
component = {
modeMap = mkOption { charvaluehex = "0x%B";
type = with types; nullOr (attrsOf str); lineinfo = "%3l:%-2v%<";
description = "Mode name mappings"; };
default = null; active = {
}; right = [
[ "lineinfo" ]
[ "percent" ]
[
"fileformat"
"fileencoding"
"filetype"
"charvaluehex"
]
];
};
inactive = [ ];
mode_map = {
"n" = "N";
"i" = "I";
"v" = "V";
"<C-v>" = "VB";
"<C-s>" = "SB";
}; };
}; };
config = callSetup = false;
let extraConfig = cfg: {
configAttrs = filterAttrs (_: v: v != null) { globals.lightline = lib.modules.mkAliasAndWrapDefsWithPriority lib.id options.plugins.lightline.settings;
inherit (cfg) };
colorscheme
active
inactive
component
componentFunction
modeMap
;
};
in
mkIf cfg.enable {
extraPlugins = [ cfg.package ];
globals.lightline = mkIf (configAttrs != { }) configAttrs;
};
} }

View file

@ -0,0 +1,148 @@
{
empty = {
plugins.lightline.enable = true;
};
defaults = {
plugins.lightline = {
enable = true;
settings = {
colorscheme = "default";
component_function = { };
component = {
mode = ''%{lightline#mode()}'';
absolutepath = "%F";
relativepath = "%f";
filename = "%t";
modified = "%M";
bufnum = "%n";
paste = ''%{&paste?"PASTE":""}'';
readonly = "%R";
charvalue = "%b";
charvaluehex = "%B";
fileencoding = ''%{&fenc!=#""?&fenc:&enc}'';
fileformat = ''%{&ff}'';
filetype = ''%{&ft!=#""?&ft:"no ft"}'';
percent = "%3p%%";
percentwin = "%P";
spell = ''%{&spell?&spelllang:""}'';
lineinfo = ''%3l=%-2c'';
line = "%l";
column = "%c";
close = "%999X X ";
winnr = ''%{winnr()}'';
};
active = {
left = [
[
"mode"
"paste"
]
[
"readonly"
"filename"
"modified"
]
];
right = [
[ "lineinfo" ]
[ "percent" ]
[
"fileformat"
"fileencoding"
"filetype"
]
];
};
inactive = {
left = [ [ "filename" ] ];
right = [
[ "lineinfo" ]
[ "percent" ]
];
};
tabline = {
left = [ [ "tabs" ] ];
right = [ [ "close" ] ];
};
tab = {
active = [
"tabnum"
"filename"
"modified"
];
inactive = [
"tabnum"
"filename"
"modified"
];
};
mode_map = {
"n" = "NORMAL";
"i" = "INSERT";
"R" = "REPLACE";
"v" = "VISUAL";
"V" = "V-LINE";
"\<C-v>" = "V-BLOCK";
"c" = "COMMAND";
"s" = "SELECT";
"S" = "S-LINE";
"\<C-s>" = "S-BLOCK";
"t" = "TERMINAL";
};
};
};
};
example = {
extraConfigLua = ''
function LightlineReadonly()
local is_readonly = vim.bo.readonly == 1
local filetype = vim.bo.filetype
if is_readonly and filetype ~= "help" then
return "RO"
else
return ""
end
end
'';
plugins.lightline = {
enable = true;
settings = {
colorscheme = "gruvbox";
component_function = {
gitbranch = "FugitiveHead";
readonly = "LightlineReadOnly";
};
component = {
charvaluehex = "0x%B";
lineinfo = "%3l:%-2v%<";
};
active = {
right = [
[ "lineinfo" ]
[ "percent" ]
[
"fileformat"
"fileencoding"
"filetype"
"charvaluehex"
]
];
};
inactive = null;
mode_map = {
"n" = "N";
"i" = "I";
"v" = "V";
"<C-v>" = "VB";
"<C-s>" = "SB";
};
};
};
};
}