diff --git a/.tmp b/.tmp new file mode 120000 index 00000000..b4c86e26 --- /dev/null +++ b/.tmp @@ -0,0 +1 @@ +/nix/store/5ixvasljzz7fixv2nd28c8d6bsnam3ap-nixos-system-nixos-21.03.20201227.2f47650 \ No newline at end of file diff --git a/plugins/helpers.nix b/plugins/helpers.nix new file mode 100644 index 00000000..989b7bcb --- /dev/null +++ b/plugins/helpers.nix @@ -0,0 +1,6 @@ +{ lib, ... }: +{ + # vim dictionaries are, in theory, compatible with JSON + toVimDict = args: builtins.toJSON + (lib.filterAttrs (n: v: !builtins.isNull v) args); +} diff --git a/plugins/languages/treesitter.nix b/plugins/languages/treesitter.nix new file mode 100644 index 00000000..80365ceb --- /dev/null +++ b/plugins/languages/treesitter.nix @@ -0,0 +1,19 @@ +{ pkgs, lib, config, ... }: +with lib; +let + cfg = programs.nixvim.plugins.treesitter; +in +{ + options = { + # TODO we need some treesitter configuration, all done in lua! + programs.nixvim.plugins.treesitter = { + enable = mkEnableOption "Enable treesitter highlighting"; + }; + }; + + config = mkIf cfg.enable { + programs.nixvim = { + extraPlugins = [ pkgs.vimPlugins.nvim-treesitter ]; + }; + } +} diff --git a/plugins/statuslines/lightline.nix b/plugins/statuslines/lightline.nix index 7639c471..01a160d9 100644 --- a/plugins/statuslines/lightline.nix +++ b/plugins/statuslines/lightline.nix @@ -2,26 +2,96 @@ with lib; let cfg = config.programs.nixvim.plugins.lightline; + helpers = import ../helpers.nix { inherit lib; }; in { options = { programs.nixvim.plugins.lightline = { enable = mkEnableOption "Enable lightline"; colorscheme = mkOption { - type = types.str; + type = with types; nullOr str; default = config.programs.nixvim.colorscheme; description = "The colorscheme to use for lightline. Defaults to .colorscheme."; example = "gruvbox"; }; + + componentFunction = mkOption { + default = null; + type = with types; nullOr (attrsOf str); + description = '' + A list of function component definitions. + + You should define the functions themselves in extraConfig + ''; + example = '' + programs.nixvim.plugins.lightline = { + enable = true; + componentFunction = { + readonly = "LightlineReadonly"; + }; + + extraConfig = ''' + function! LightlineReadonly() + return &readonly && &filetype !=# 'help' ? 'RO' : ''' + endfunction + '''; + }; + ''; + }; + + component = mkOption { + default = null; + type = with types; nullOr (attrsOf str); + description = "Lightline component definitions. Uses 'statusline' syntax. Consult :h 'statusline' for a list of what's available."; + }; + + active = mkOption { + default = null; + type = types.nullOr (types.submodule { + options = let + listType = with types; nullOr (listOf (listOf str)); + in { + left = mkOption { + type = listType; + description = "List of components that will show up on the left side of the bar"; + default = null; + }; + + right = mkOption { + type = listType; + description = "List of components that will show up on the right side of the bar"; + default = null; + }; + }; + }); + }; + + modeMap = mkOption { + type = with types; nullOr (attrsOf str); + description = "Mode name mappings"; + default = null; + }; + + extraConfig = mkOption { + type = types.lines; + default = ""; + description = "Extra configuration for this plugin"; + }; }; }; - config = mkIf cfg.enable { + config = let + configString = helpers.toVimDict { + inherit (cfg) colorscheme active component componentFunction modeMap; + }; + in mkIf cfg.enable { programs.nixvim = { extraPlugins = [ pkgs.vimPlugins.lightline-vim ]; extraConfigVim = '' """ lightline {{{ - let g:lightline = { 'colorscheme': '${cfg.colorscheme}' } + let g:lightline = ${configString} + + ${cfg.extraConfig} """ }}} ''; };