mirror of
				https://github.com/NotAShelf/nvf.git
				synced 2025-11-04 12:42:21 +00:00 
			
		
		
		
	Merge pull request #559 from NotAShelf/telescope-ext
utility/telescope: custom extensions API
This commit is contained in:
		
				commit
				
					
						0435104085
					
				
			
		
					 2 changed files with 118 additions and 42 deletions
				
			
		| 
						 | 
					@ -5,8 +5,8 @@
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (lib.modules) mkIf;
 | 
					  inherit (lib.modules) mkIf;
 | 
				
			||||||
  inherit (lib.strings) optionalString;
 | 
					  inherit (lib.strings) optionalString concatMapStringsSep;
 | 
				
			||||||
  inherit (lib.lists) optionals;
 | 
					  inherit (lib.lists) optionals concatLists;
 | 
				
			||||||
  inherit (lib.nvim.binds) pushDownDefault mkKeymap;
 | 
					  inherit (lib.nvim.binds) pushDownDefault mkKeymap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  cfg = config.vim.telescope;
 | 
					  cfg = config.vim.telescope;
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,7 @@
 | 
				
			||||||
in {
 | 
					in {
 | 
				
			||||||
  config = mkIf cfg.enable {
 | 
					  config = mkIf cfg.enable {
 | 
				
			||||||
    vim = {
 | 
					    vim = {
 | 
				
			||||||
      startPlugins = ["plenary-nvim"];
 | 
					      startPlugins = ["plenary-nvim"] ++ concatLists (map (x: x.packages) cfg.extensions);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      lazy.plugins.telescope = {
 | 
					      lazy.plugins.telescope = {
 | 
				
			||||||
        package = "telescope";
 | 
					        package = "telescope";
 | 
				
			||||||
| 
						 | 
					@ -28,11 +28,14 @@ in {
 | 
				
			||||||
          vim.g.loaded_telescope = nil
 | 
					          vim.g.loaded_telescope = nil
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        after = ''
 | 
					        after = let
 | 
				
			||||||
 | 
					          enabledExtensions = map (x: x.name) cfg.extensions;
 | 
				
			||||||
 | 
					        in ''
 | 
				
			||||||
          local telescope = require("telescope")
 | 
					          local telescope = require("telescope")
 | 
				
			||||||
          ${optionalString config.vim.ui.noice.enable "telescope.load_extension('noice')"}
 | 
					          ${optionalString config.vim.ui.noice.enable "telescope.load_extension('noice')"}
 | 
				
			||||||
          ${optionalString config.vim.notify.nvim-notify.enable "telescope.load_extension('notify')"}
 | 
					          ${optionalString config.vim.notify.nvim-notify.enable "telescope.load_extension('notify')"}
 | 
				
			||||||
          ${optionalString config.vim.projects.project-nvim.enable "telescope.load_extension('projects')"}
 | 
					          ${optionalString config.vim.projects.project-nvim.enable "telescope.load_extension('projects')"}
 | 
				
			||||||
 | 
					          ${concatMapStringsSep "\n" (x: "telescope.load_extension('${x}')") enabledExtensions}
 | 
				
			||||||
        '';
 | 
					        '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        cmd = ["Telescope"];
 | 
					        cmd = ["Telescope"];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,12 +1,15 @@
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					  config,
 | 
				
			||||||
  pkgs,
 | 
					  pkgs,
 | 
				
			||||||
  lib,
 | 
					  lib,
 | 
				
			||||||
  ...
 | 
					  ...
 | 
				
			||||||
}: let
 | 
					}: let
 | 
				
			||||||
  inherit (lib.options) mkEnableOption mkOption;
 | 
					  inherit (lib.options) mkOption mkEnableOption literalExpression;
 | 
				
			||||||
  inherit (lib.types) int str listOf float bool either enum submodule attrsOf;
 | 
					  inherit (lib.types) int str listOf float bool either enum submodule attrsOf anything package;
 | 
				
			||||||
  inherit (lib.nvim.binds) mkMappingOption;
 | 
					  inherit (lib.nvim.binds) mkMappingOption;
 | 
				
			||||||
  inherit (lib.nvim.types) mkPluginSetupOption luaInline;
 | 
					  inherit (lib.nvim.types) mkPluginSetupOption luaInline;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  cfg = config.vim.telescope;
 | 
				
			||||||
  setupOptions = {
 | 
					  setupOptions = {
 | 
				
			||||||
    pickers.find_files.find_command = mkOption {
 | 
					    pickers.find_files.find_command = mkOption {
 | 
				
			||||||
      description = "cmd to use for finding files";
 | 
					      description = "cmd to use for finding files";
 | 
				
			||||||
| 
						 | 
					@ -16,10 +19,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    defaults = {
 | 
					    defaults = {
 | 
				
			||||||
      vimgrep_arguments = mkOption {
 | 
					      vimgrep_arguments = mkOption {
 | 
				
			||||||
        description = ''
 | 
					 | 
				
			||||||
          Defines the command that will be used for `live_grep` and `grep_string` pickers.
 | 
					 | 
				
			||||||
          Make sure that color is set to `never` because telescope does not yet interpret color codes.
 | 
					 | 
				
			||||||
        '';
 | 
					 | 
				
			||||||
        type = listOf str;
 | 
					        type = listOf str;
 | 
				
			||||||
        default = [
 | 
					        default = [
 | 
				
			||||||
          "${pkgs.ripgrep}/bin/rg"
 | 
					          "${pkgs.ripgrep}/bin/rg"
 | 
				
			||||||
| 
						 | 
					@ -32,114 +31,169 @@
 | 
				
			||||||
          "--hidden"
 | 
					          "--hidden"
 | 
				
			||||||
          "--no-ignore"
 | 
					          "--no-ignore"
 | 
				
			||||||
        ];
 | 
					        ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        description = ''
 | 
				
			||||||
 | 
					          Defines the command that will be used for `live_grep` and `grep_string` pickers.
 | 
				
			||||||
 | 
					          Make sure that color is set to `never` because telescope does not yet interpret color codes.
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      pickers.find_command = mkOption {
 | 
				
			||||||
 | 
					        type = either (listOf str) luaInline;
 | 
				
			||||||
 | 
					        default = ["${pkgs.fd}/bin/fd"];
 | 
				
			||||||
 | 
					        description = ''
 | 
				
			||||||
 | 
					          Command to use for finding files. If using an executable from {env}`PATH` then you must
 | 
				
			||||||
 | 
					          make sure that the package is available in [](#opt-vim.extraPackages).
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      prompt_prefix = mkOption {
 | 
					      prompt_prefix = mkOption {
 | 
				
			||||||
        description = "Shown in front of Telescope's prompt";
 | 
					 | 
				
			||||||
        type = str;
 | 
					        type = str;
 | 
				
			||||||
        default = "     ";
 | 
					        default = "     ";
 | 
				
			||||||
 | 
					        description = "Shown in front of Telescope's prompt";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      selection_caret = mkOption {
 | 
					      selection_caret = mkOption {
 | 
				
			||||||
 | 
					        type = str;
 | 
				
			||||||
 | 
					        default = "  ";
 | 
				
			||||||
        description = "Character(s) to show in front of the current selection";
 | 
					        description = "Character(s) to show in front of the current selection";
 | 
				
			||||||
        type = str;
 | 
					 | 
				
			||||||
        default = "  ";
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      entry_prefix = mkOption {
 | 
					      entry_prefix = mkOption {
 | 
				
			||||||
        description = "Prefix in front of each result entry. Current selection not included.";
 | 
					 | 
				
			||||||
        type = str;
 | 
					        type = str;
 | 
				
			||||||
        default = "  ";
 | 
					        default = "  ";
 | 
				
			||||||
 | 
					        description = "Prefix in front of each result entry. Current selection not included.";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      initial_mode = mkOption {
 | 
					      initial_mode = mkOption {
 | 
				
			||||||
        description = "Determines in which mode telescope starts.";
 | 
					 | 
				
			||||||
        type = enum ["insert" "normal"];
 | 
					        type = enum ["insert" "normal"];
 | 
				
			||||||
        default = "insert";
 | 
					        default = "insert";
 | 
				
			||||||
 | 
					        description = "Determines in which mode telescope starts.";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      selection_strategy = mkOption {
 | 
					      selection_strategy = mkOption {
 | 
				
			||||||
        description = "Determines how the cursor acts after each sort iteration.";
 | 
					 | 
				
			||||||
        type = enum ["reset" "follow" "row" "closest" "none"];
 | 
					        type = enum ["reset" "follow" "row" "closest" "none"];
 | 
				
			||||||
        default = "reset";
 | 
					        default = "reset";
 | 
				
			||||||
 | 
					        description = "Determines how the cursor acts after each sort iteration.";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      sorting_strategy = mkOption {
 | 
					      sorting_strategy = mkOption {
 | 
				
			||||||
        description = ''Determines the direction "better" results are sorted towards.'';
 | 
					 | 
				
			||||||
        type = enum ["descending" "ascending"];
 | 
					        type = enum ["descending" "ascending"];
 | 
				
			||||||
        default = "ascending";
 | 
					        default = "ascending";
 | 
				
			||||||
 | 
					        description = ''Determines the direction "better" results are sorted towards.'';
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      layout_strategy = mkOption {
 | 
					      layout_strategy = mkOption {
 | 
				
			||||||
        description = "Determines the default layout of Telescope pickers. See `:help telescope.layout`.";
 | 
					 | 
				
			||||||
        type = str;
 | 
					        type = str;
 | 
				
			||||||
        default = "horizontal";
 | 
					        default = "horizontal";
 | 
				
			||||||
 | 
					        description = "Determines the default layout of Telescope pickers. See `:help telescope.layout`.";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      layout_config = mkOption {
 | 
					      layout_config = mkOption {
 | 
				
			||||||
        description = ''
 | 
					 | 
				
			||||||
          Determines the default configuration values for layout strategies.
 | 
					 | 
				
			||||||
          See telescope.layout for details of the configurations options for
 | 
					 | 
				
			||||||
          each strategy.
 | 
					 | 
				
			||||||
        '';
 | 
					 | 
				
			||||||
        default = {};
 | 
					        default = {};
 | 
				
			||||||
        type = submodule {
 | 
					        type = submodule {
 | 
				
			||||||
          options = {
 | 
					          options = {
 | 
				
			||||||
            horizontal = {
 | 
					            horizontal = {
 | 
				
			||||||
              prompt_position = mkOption {
 | 
					              prompt_position = mkOption {
 | 
				
			||||||
                description = "";
 | 
					                type = enum ["top" "bottom"];
 | 
				
			||||||
                type = str;
 | 
					 | 
				
			||||||
                default = "top";
 | 
					                default = "top";
 | 
				
			||||||
 | 
					                description = "Where to place prompt window";
 | 
				
			||||||
              };
 | 
					              };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
              preview_width = mkOption {
 | 
					              preview_width = mkOption {
 | 
				
			||||||
                description = "";
 | 
					 | 
				
			||||||
                type = float;
 | 
					                type = float;
 | 
				
			||||||
                default = 0.55;
 | 
					                default = 0.55;
 | 
				
			||||||
 | 
					                description = "Change the width of Telescope's preview window";
 | 
				
			||||||
              };
 | 
					              };
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            vertical = {
 | 
					            vertical = {
 | 
				
			||||||
              mirror = mkOption {
 | 
					              mirror = mkOption {
 | 
				
			||||||
                description = "";
 | 
					 | 
				
			||||||
                type = bool;
 | 
					                type = bool;
 | 
				
			||||||
                default = false;
 | 
					                default = false;
 | 
				
			||||||
 | 
					                description = "Flip the location of the results/prompt and preview windows";
 | 
				
			||||||
              };
 | 
					              };
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            width = mkOption {
 | 
					            width = mkOption {
 | 
				
			||||||
              description = "";
 | 
					 | 
				
			||||||
              type = float;
 | 
					              type = float;
 | 
				
			||||||
              default = 0.8;
 | 
					              default = 0.8;
 | 
				
			||||||
 | 
					              description = "How wide to make Telescope's entire layout";
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            height = mkOption {
 | 
					            height = mkOption {
 | 
				
			||||||
              description = "";
 | 
					 | 
				
			||||||
              type = float;
 | 
					              type = float;
 | 
				
			||||||
              default = 0.8;
 | 
					              default = 0.8;
 | 
				
			||||||
 | 
					              description = "How tall to make Telescope's entire layout";
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            preview_cutoff = mkOption {
 | 
					            preview_cutoff = mkOption {
 | 
				
			||||||
              description = "";
 | 
					 | 
				
			||||||
              type = int;
 | 
					              type = int;
 | 
				
			||||||
              default = 120;
 | 
					              default = 120;
 | 
				
			||||||
 | 
					              description = "When lines are less than this value, the preview will be disabled";
 | 
				
			||||||
            };
 | 
					            };
 | 
				
			||||||
          };
 | 
					          };
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        description = ''
 | 
				
			||||||
 | 
					          Determines the default configuration values for layout strategies.
 | 
				
			||||||
 | 
					          See `telescope.layout` for details of the configurations options for
 | 
				
			||||||
 | 
					          each strategy.
 | 
				
			||||||
 | 
					        '';
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      file_ignore_patterns = mkOption {
 | 
					      file_ignore_patterns = mkOption {
 | 
				
			||||||
        description = "A table of lua regex that define the files that should be ignored.";
 | 
					 | 
				
			||||||
        type = listOf str;
 | 
					        type = listOf str;
 | 
				
			||||||
        default = ["node_modules" "%.git/" "dist/" "build/" "target/" "result/"];
 | 
					        default = ["node_modules" "%.git/" "dist/" "build/" "target/" "result/"];
 | 
				
			||||||
 | 
					        description = "File patterns to omit from Telescope results";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      color_devicons = mkOption {
 | 
					
 | 
				
			||||||
        description = "Boolean if devicons should be enabled or not.";
 | 
					      color_devicons = mkEnableOption "colored devicons";
 | 
				
			||||||
        type = bool;
 | 
					
 | 
				
			||||||
        default = true;
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
      path_display = mkOption {
 | 
					      path_display = mkOption {
 | 
				
			||||||
        description = "Determines how file paths are displayed.";
 | 
					 | 
				
			||||||
        type = listOf (enum ["hidden" "tail" "absolute" "smart" "shorten" "truncate"]);
 | 
					        type = listOf (enum ["hidden" "tail" "absolute" "smart" "shorten" "truncate"]);
 | 
				
			||||||
        default = ["absolute"];
 | 
					        default = ["absolute"];
 | 
				
			||||||
 | 
					        description = "Determines how file paths are displayed.";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      set_env = mkOption {
 | 
					      set_env = mkOption {
 | 
				
			||||||
        description = "Set an environment for term_previewer";
 | 
					 | 
				
			||||||
        type = attrsOf str;
 | 
					        type = attrsOf str;
 | 
				
			||||||
        default = {
 | 
					        default = {COLORTERM = "truecolor";};
 | 
				
			||||||
          COLORTERM = "truecolor";
 | 
					        description = "Set an environment for term_previewer";
 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      winblend = mkOption {
 | 
					      winblend = mkOption {
 | 
				
			||||||
        description = "pseudo-transparency of keymap hints floating window";
 | 
					 | 
				
			||||||
        type = int;
 | 
					        type = int;
 | 
				
			||||||
        default = 0;
 | 
					        default = 0;
 | 
				
			||||||
 | 
					        description = "Pseudo-transparency of keymap hints floating window";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      extensions = mkOption {
 | 
				
			||||||
 | 
					        type = attrsOf anything;
 | 
				
			||||||
 | 
					        default = builtins.foldl' (acc: x: acc // (x.setup or {})) {} cfg.extensions;
 | 
				
			||||||
 | 
					        description = "Attribute set containing per-extension settings for Telescope";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  extensionOpts = {
 | 
				
			||||||
 | 
					    options = {
 | 
				
			||||||
 | 
					      name = mkOption {
 | 
				
			||||||
 | 
					        type = str;
 | 
				
			||||||
 | 
					        description = "Name of the extension, will be used to load it with a `require`";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      packages = mkOption {
 | 
				
			||||||
 | 
					        type = listOf (either str package);
 | 
				
			||||||
 | 
					        default = [];
 | 
				
			||||||
 | 
					        description = "Package or packages providing the Telescope extension to be loaded.";
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      setup = mkOption {
 | 
				
			||||||
 | 
					        type = attrsOf anything;
 | 
				
			||||||
 | 
					        default = {};
 | 
				
			||||||
 | 
					        example = {fzf = {fuzzy = true;};};
 | 
				
			||||||
 | 
					        description = "Named attribute set to be inserted into Telescope's extensions table.";
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -174,5 +228,24 @@ in {
 | 
				
			||||||
    enable = mkEnableOption "telescope.nvim: multi-purpose search and picker utility";
 | 
					    enable = mkEnableOption "telescope.nvim: multi-purpose search and picker utility";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    setupOpts = mkPluginSetupOption "Telescope" setupOptions;
 | 
					    setupOpts = mkPluginSetupOption "Telescope" setupOptions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    extensions = mkOption {
 | 
				
			||||||
 | 
					      type = listOf (submodule extensionOpts);
 | 
				
			||||||
 | 
					      default = [];
 | 
				
			||||||
 | 
					      example = literalExpression ''
 | 
				
			||||||
 | 
					        [
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					            name = "fzf";
 | 
				
			||||||
 | 
					            packages = [pkgs.vimPlugins.telescope-fzf-native-nvim];
 | 
				
			||||||
 | 
					            setup = {fzf = {fuzzy = true;};};
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					      '';
 | 
				
			||||||
 | 
					      description = ''
 | 
				
			||||||
 | 
					        Individual extension configurations containing **name**, **packages** and **setup**
 | 
				
			||||||
 | 
					        fields to resolve dependencies, handle `load_extension` calls and add the `setup`
 | 
				
			||||||
 | 
					        table into the `extensions` portion of Telescope's setup table.
 | 
				
			||||||
 | 
					      '';
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue