mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-11-03 20:22:21 +00:00 
			
		
		
		
	core/build: add luaConfigPre and luaConfigPost
This allows for the insertion of verbatim lua configurations without resorting to the DAG system
This commit is contained in:
		
					parent
					
						
							
								d2d40362f4
							
						
					
				
			
			
				commit
				
					
						60dd98c761
					
				
			
		
					 1 changed files with 136 additions and 33 deletions
				
			
		| 
						 | 
					@ -4,28 +4,21 @@
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (builtins) map mapAttrs toJSON filter;
 | 
					  inherit (builtins) map mapAttrs toJSON filter;
 | 
				
			||||||
  inherit (lib.options) mkOption mkEnableOption;
 | 
					  inherit (lib.options) mkOption mkEnableOption literalMD literalExpression;
 | 
				
			||||||
  inherit (lib.attrsets) filterAttrs getAttrs attrValues attrNames;
 | 
					  inherit (lib.attrsets) filterAttrs getAttrs attrValues attrNames;
 | 
				
			||||||
  inherit (lib.strings) optionalString isString concatStringsSep;
 | 
					  inherit (lib.strings) optionalString isString concatStringsSep;
 | 
				
			||||||
  inherit (lib.misc) mapAttrsFlatten;
 | 
					  inherit (lib.misc) mapAttrsFlatten;
 | 
				
			||||||
  inherit (lib.trivial) showWarnings;
 | 
					  inherit (lib.trivial) showWarnings;
 | 
				
			||||||
  inherit (lib.types) bool str oneOf attrsOf nullOr attrs submodule lines;
 | 
					  inherit (lib.types) bool str oneOf attrsOf nullOr attrs submodule lines listOf;
 | 
				
			||||||
  inherit (lib.nvim.types) dagOf;
 | 
					 | 
				
			||||||
  inherit (lib.generators) mkLuaInline;
 | 
					  inherit (lib.generators) mkLuaInline;
 | 
				
			||||||
 | 
					  inherit (lib.nvim.types) dagOf;
 | 
				
			||||||
  inherit (lib.nvim.dag) entryAnywhere entryAfter topoSort mkLuarcSection mkVimrcSection;
 | 
					  inherit (lib.nvim.dag) entryAnywhere entryAfter topoSort mkLuarcSection mkVimrcSection;
 | 
				
			||||||
  inherit (lib.nvim.lua) toLuaObject;
 | 
					  inherit (lib.nvim.lua) toLuaObject wrapLuaConfig;
 | 
				
			||||||
  inherit (lib.nvim.vim) valToVim;
 | 
					  inherit (lib.nvim.vim) valToVim;
 | 
				
			||||||
  inherit (lib.nvim.config) mkBool;
 | 
					  inherit (lib.nvim.config) mkBool;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim;
 | 
					  cfg = config.vim;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  wrapLuaConfig = luaConfig: ''
 | 
					 | 
				
			||||||
    lua << EOF
 | 
					 | 
				
			||||||
    ${optionalString cfg.enableLuaLoader "vim.loader.enable()"}
 | 
					 | 
				
			||||||
    ${luaConfig}
 | 
					 | 
				
			||||||
    EOF
 | 
					 | 
				
			||||||
  '';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  # Most of the keybindings code is highly inspired by pta2002/nixvim.
 | 
					  # Most of the keybindings code is highly inspired by pta2002/nixvim.
 | 
				
			||||||
  # Thank you!
 | 
					  # Thank you!
 | 
				
			||||||
  mapConfigOptions = {
 | 
					  mapConfigOptions = {
 | 
				
			||||||
| 
						 | 
					@ -123,28 +116,33 @@
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
  options = {
 | 
					  options = {
 | 
				
			||||||
    vim = {
 | 
					    vim = {
 | 
				
			||||||
      configRC = mkOption {
 | 
					      enableLuaLoader = mkEnableOption ''
 | 
				
			||||||
        description = "vimrc contents";
 | 
					        the experimental Lua module loader to speed up the start up process
 | 
				
			||||||
        type = oneOf [(dagOf lines) str];
 | 
					      '';
 | 
				
			||||||
        default = {};
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
      luaConfigRC = mkOption {
 | 
					      additionalRuntimePaths = mkOption {
 | 
				
			||||||
        description = "vim lua config";
 | 
					        type = listOf str;
 | 
				
			||||||
        type = oneOf [(dagOf lines) str];
 | 
					        default = [];
 | 
				
			||||||
        default = {};
 | 
					        example = literalExpression ''["./nvim"]'';
 | 
				
			||||||
      };
 | 
					        description = ''
 | 
				
			||||||
 | 
					          Additional runtime paths that will be appended to the
 | 
				
			||||||
 | 
					          active runtimepath of the Neovim. This can be used to
 | 
				
			||||||
 | 
					          add additional lookup paths for configs, plugins, spell
 | 
				
			||||||
 | 
					          languages and other things you would generally place in
 | 
				
			||||||
 | 
					          your `$HOME/.config/nvim`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      builtConfigRC = mkOption {
 | 
					          This is meant as a declarative alternative to throwing
 | 
				
			||||||
        internal = true;
 | 
					          files into `~/.config/nvim` and having the Neovim
 | 
				
			||||||
        type = lines;
 | 
					          wrapper pick them up. For more details on
 | 
				
			||||||
        description = "The built config for neovim after resolving the DAG";
 | 
					          `vim.o.runtimepath`, and what paths to use; please see
 | 
				
			||||||
 | 
					          [the official documentation](https://neovim.io/doc/user/options.html#'runtimepath')
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      globals = mkOption {
 | 
					      globals = mkOption {
 | 
				
			||||||
        default = {};
 | 
					        default = {};
 | 
				
			||||||
        description = "Set containing global variable values";
 | 
					 | 
				
			||||||
        type = attrs;
 | 
					        type = attrs;
 | 
				
			||||||
 | 
					        description = "Set containing global variable values";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      maps = mkOption {
 | 
					      maps = mkOption {
 | 
				
			||||||
| 
						 | 
					@ -168,7 +166,7 @@ in {
 | 
				
			||||||
        description = ''
 | 
					        description = ''
 | 
				
			||||||
          Custom keybindings for any mode.
 | 
					          Custom keybindings for any mode.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          For plain maps (e.g. just 'map' or 'remap') use maps.normalVisualOp.
 | 
					          For plain maps (e.g. just 'map' or 'remap') use `maps.normalVisualOp`.
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        example = ''
 | 
					        example = ''
 | 
				
			||||||
| 
						 | 
					@ -181,9 +179,103 @@ in {
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      enableLuaLoader = mkEnableOption ''
 | 
					      configRC = mkOption {
 | 
				
			||||||
        experimental Lua module loader to speed up the start up process
 | 
					        type = oneOf [(dagOf lines) str];
 | 
				
			||||||
      '';
 | 
					        default = {};
 | 
				
			||||||
 | 
					        description = ''
 | 
				
			||||||
 | 
					          Contents of vimrc, either as a string or a DAG.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          If this option is passed as a DAG, it will be resolved
 | 
				
			||||||
 | 
					          according to the DAG resolution rules (e.g. entryBefore
 | 
				
			||||||
 | 
					          or entryAfter) as per the neovim-flake library.
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        example = literalMD ''
 | 
				
			||||||
 | 
					          ```vim
 | 
				
			||||||
 | 
					          " Set the tab size to 4 spaces
 | 
				
			||||||
 | 
					          set tabstop=4
 | 
				
			||||||
 | 
					          set shiftwidth=4
 | 
				
			||||||
 | 
					          set expandtab
 | 
				
			||||||
 | 
					          ```
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      luaConfigPre = mkOption {
 | 
				
			||||||
 | 
					        type = str;
 | 
				
			||||||
 | 
					        default = let
 | 
				
			||||||
 | 
					          additionalRuntimePaths = concatStringsSep "," cfg.additionalRuntimePaths;
 | 
				
			||||||
 | 
					        in ''
 | 
				
			||||||
 | 
					          ${optionalString (cfg.additionalRuntimePaths != []) ''
 | 
				
			||||||
 | 
					            if not vim.o.runtimepath:find('${additionalRuntimePaths}', 1, true) then
 | 
				
			||||||
 | 
					                vim.o.runtimepath = vim.o.runtimepath .. ',' .. '${additionalRuntimePaths}'
 | 
				
			||||||
 | 
					            end
 | 
				
			||||||
 | 
					          ''}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          ${optionalString cfg.enableLuaLoader "vim.loader.enable()"}
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        defaultText = literalMD ''
 | 
				
			||||||
 | 
					          By default, this option will **append** paths in
 | 
				
			||||||
 | 
					          [vim.additionalRuntimePaths](#opt-vim.additionalRuntimePaths)
 | 
				
			||||||
 | 
					          to the `runtimepath` and enable the experimental Lua module loader
 | 
				
			||||||
 | 
					          if [vim.enableLuaLoader](#opt-vim.enableLuaLoader) is set to true.
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        description = ''
 | 
				
			||||||
 | 
					          Verbatim lua code that will be inserted **before**
 | 
				
			||||||
 | 
					          the result of `luaConfigRc` DAG has been resolved.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          This option **does not** take a DAG set, but a string
 | 
				
			||||||
 | 
					          instead. Useful when you'd like to insert contents
 | 
				
			||||||
 | 
					          of lua configs after the DAG result.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          ::: {.warning}
 | 
				
			||||||
 | 
					          You do not want to override this option. It is used
 | 
				
			||||||
 | 
					          internally to set certain options as early as possible
 | 
				
			||||||
 | 
					          and should be avoided unless you know what you're doing.
 | 
				
			||||||
 | 
					          :::
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      luaConfigRC = mkOption {
 | 
				
			||||||
 | 
					        type = oneOf [(dagOf lines) str];
 | 
				
			||||||
 | 
					        default = {};
 | 
				
			||||||
 | 
					        description = ''
 | 
				
			||||||
 | 
					          Lua configuration, either as a string or a DAG.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          If this option is passed as a DAG, it will be resolved
 | 
				
			||||||
 | 
					          according to the DAG resolution rules (e.g. entryBefore
 | 
				
			||||||
 | 
					          or entryAfter) as per the neovim-flake library.
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        example = literalMD ''
 | 
				
			||||||
 | 
					          ```lua
 | 
				
			||||||
 | 
					          -- Set the tab size to 4 spaces
 | 
				
			||||||
 | 
					          vim.opt.tabstop = 4
 | 
				
			||||||
 | 
					          vim.opt.shiftwidth = 4
 | 
				
			||||||
 | 
					          vim.opt.expandtab = true
 | 
				
			||||||
 | 
					          ```
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      luaConfigPost = mkOption {
 | 
				
			||||||
 | 
					        type = str;
 | 
				
			||||||
 | 
					        default = "";
 | 
				
			||||||
 | 
					        description = ''
 | 
				
			||||||
 | 
					          Verbatim lua code that will be inserted after
 | 
				
			||||||
 | 
					          the result of the `luaConfigRc` DAG has been resolved
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          This option **does not** take a DAG set, but a string
 | 
				
			||||||
 | 
					          instead. Useful when you'd like to insert contents
 | 
				
			||||||
 | 
					          of lua configs after the DAG result.
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      builtConfigRC = mkOption {
 | 
				
			||||||
 | 
					        internal = true;
 | 
				
			||||||
 | 
					        type = lines;
 | 
				
			||||||
 | 
					        description = "The built config for neovim after resolving the DAG";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -235,8 +327,15 @@ in {
 | 
				
			||||||
      configRC = {
 | 
					      configRC = {
 | 
				
			||||||
        globalsScript = entryAnywhere (concatStringsSep "\n" globalsScript);
 | 
					        globalsScript = entryAnywhere (concatStringsSep "\n" globalsScript);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # wrap the lua config in a lua block
 | 
				
			||||||
 | 
					        # using the wrapLuaConfic function from the lib
 | 
				
			||||||
        luaScript = let
 | 
					        luaScript = let
 | 
				
			||||||
          mapResult = result: (wrapLuaConfig (concatStringsSep "\n" (map mkLuarcSection result)));
 | 
					          mapResult = result: (wrapLuaConfig {
 | 
				
			||||||
 | 
					            luaBefore = "${cfg.luaConfigPre}";
 | 
				
			||||||
 | 
					            luaConfig = concatStringsSep "\n" (map mkLuarcSection result);
 | 
				
			||||||
 | 
					            luaAfter = "${cfg.luaConfigPost}";
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          luaConfig = resolveDag {
 | 
					          luaConfig = resolveDag {
 | 
				
			||||||
            name = "lua config script";
 | 
					            name = "lua config script";
 | 
				
			||||||
            dag = cfg.luaConfigRC;
 | 
					            dag = cfg.luaConfigRC;
 | 
				
			||||||
| 
						 | 
					@ -246,7 +345,10 @@ in {
 | 
				
			||||||
          entryAfter ["globalsScript"] luaConfig;
 | 
					          entryAfter ["globalsScript"] luaConfig;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        extraPluginConfigs = let
 | 
					        extraPluginConfigs = let
 | 
				
			||||||
          mapResult = r: (wrapLuaConfig (concatStringsSep "\n" (map mkLuarcSection r)));
 | 
					          mapResult = result: (wrapLuaConfig {
 | 
				
			||||||
 | 
					            luaConfig = concatStringsSep "\n" (map mkLuarcSection result);
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          extraPluginsDag = mapAttrs (_: {
 | 
					          extraPluginsDag = mapAttrs (_: {
 | 
				
			||||||
            after,
 | 
					            after,
 | 
				
			||||||
            setup,
 | 
					            setup,
 | 
				
			||||||
| 
						 | 
					@ -254,6 +356,7 @@ in {
 | 
				
			||||||
          }:
 | 
					          }:
 | 
				
			||||||
            entryAfter after setup)
 | 
					            entryAfter after setup)
 | 
				
			||||||
          cfg.extraPlugins;
 | 
					          cfg.extraPlugins;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
          pluginConfig = resolveDag {
 | 
					          pluginConfig = resolveDag {
 | 
				
			||||||
            name = "extra plugins config";
 | 
					            name = "extra plugins config";
 | 
				
			||||||
            dag = extraPluginsDag;
 | 
					            dag = extraPluginsDag;
 | 
				
			||||||
| 
						 | 
					@ -277,7 +380,7 @@ in {
 | 
				
			||||||
            icmap
 | 
					            icmap
 | 
				
			||||||
            allmap
 | 
					            allmap
 | 
				
			||||||
          ];
 | 
					          ];
 | 
				
			||||||
          mapConfig = wrapLuaConfig (concatStringsSep "\n" (map (v: concatStringsSep "\n" v) maps));
 | 
					          mapConfig = wrapLuaConfig {luaConfig = concatStringsSep "\n" (map (v: concatStringsSep "\n" v) maps);};
 | 
				
			||||||
        in
 | 
					        in
 | 
				
			||||||
          entryAfter ["globalsScript"] mapConfig;
 | 
					          entryAfter ["globalsScript"] mapConfig;
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue