From 6594409a2506298b43734b31cc5329f2974df2b1 Mon Sep 17 00:00:00 2001 From: NotAShelf Date: Tue, 14 Jan 2025 16:45:08 +0300 Subject: [PATCH] utility/telescope: add custom extensions API; clean up setupOptions --- modules/plugins/utility/telescope/config.nix | 11 ++- .../plugins/utility/telescope/telescope.nix | 89 +++++++++++++------ 2 files changed, 70 insertions(+), 30 deletions(-) diff --git a/modules/plugins/utility/telescope/config.nix b/modules/plugins/utility/telescope/config.nix index 95f813274..73d5e5172 100644 --- a/modules/plugins/utility/telescope/config.nix +++ b/modules/plugins/utility/telescope/config.nix @@ -5,8 +5,8 @@ ... }: let inherit (lib.modules) mkIf; - inherit (lib.strings) optionalString; - inherit (lib.lists) optionals; + inherit (lib.strings) optionalString concatMapStringsSep; + inherit (lib.lists) optionals concatLists; inherit (lib.nvim.binds) pushDownDefault mkKeymap; cfg = config.vim.telescope; @@ -16,7 +16,7 @@ in { config = mkIf cfg.enable { vim = { - startPlugins = ["plenary-nvim"]; + startPlugins = ["plenary-nvim"] ++ concatLists (map (x: x.packages) cfg.extensions); lazy.plugins.telescope = { package = "telescope"; @@ -28,11 +28,14 @@ in { vim.g.loaded_telescope = nil ''; - after = '' + after = let + enabledExtensions = map (x: x.name) cfg.extensions; + in '' local telescope = require("telescope") ${optionalString config.vim.ui.noice.enable "telescope.load_extension('noice')"} ${optionalString config.vim.notify.nvim-notify.enable "telescope.load_extension('notify')"} ${optionalString config.vim.projects.project-nvim.enable "telescope.load_extension('projects')"} + ${concatMapStringsSep "\n" (x: "telescope.load_extension('${x}')") enabledExtensions} ''; cmd = ["Telescope"]; diff --git a/modules/plugins/utility/telescope/telescope.nix b/modules/plugins/utility/telescope/telescope.nix index cf9c5cd8e..29477db65 100644 --- a/modules/plugins/utility/telescope/telescope.nix +++ b/modules/plugins/utility/telescope/telescope.nix @@ -4,16 +4,12 @@ ... }: let inherit (lib.options) mkEnableOption mkOption; - 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.types) mkPluginSetupOption luaInline; setupOptions = { defaults = { 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; default = [ "${pkgs.ripgrep}/bin/rg" @@ -26,53 +22,65 @@ "--hidden" "--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 { - description = "cmd to use for finding files"; type = either (listOf str) luaInline; default = ["${pkgs.fd}/bin/fd"]; + description = '' + Command to use for finding files. If using an executable from `PATH` then you must + make sure that the package is available in [](#opt-vim.extraPackages). + ''; }; + prompt_prefix = mkOption { - description = "Shown in front of Telescope's prompt"; type = str; default = "  "; + description = "Shown in front of Telescope's prompt"; }; + selection_caret = mkOption { - description = "Character(s) to show in front of the current selection"; type = str; default = " "; + description = "Character(s) to show in front of the current selection"; }; + entry_prefix = mkOption { - description = "Prefix in front of each result entry. Current selection not included."; type = str; default = " "; + description = "Prefix in front of each result entry. Current selection not included."; }; + initial_mode = mkOption { - description = "Determines in which mode telescope starts."; type = enum ["insert" "normal"]; default = "insert"; + description = "Determines in which mode telescope starts."; }; + selection_strategy = mkOption { - description = "Determines how the cursor acts after each sort iteration."; type = enum ["reset" "follow" "row" "closest" "none"]; default = "reset"; + description = "Determines how the cursor acts after each sort iteration."; }; + sorting_strategy = mkOption { - description = ''Determines the direction "better" results are sorted towards.''; type = enum ["descending" "ascending"]; default = "ascending"; + description = ''Determines the direction "better" results are sorted towards.''; }; + layout_strategy = mkOption { - description = "Determines the default layout of Telescope pickers. See `:help telescope.layout`."; type = str; default = "horizontal"; + description = "Determines the default layout of Telescope pickers. See `:help telescope.layout`."; }; + 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 = {}; type = submodule { options = { @@ -117,33 +125,57 @@ }; }; }; + + 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 { - description = "A table of lua regex that define the files that should be ignored."; type = listOf str; default = ["node_modules" ".git/" "dist/" "build/" "target/" "result/"]; + description = "A table of lua regex that define the files that should be ignored."; }; + color_devicons = mkOption { - description = "Boolean if devicons should be enabled or not."; type = bool; default = true; + description = "Boolean if devicons should be enabled or not."; }; + path_display = mkOption { - description = "Determines how file paths are displayed."; type = listOf (enum ["hidden" "tail" "absolute" "smart" "shorten" "truncate"]); default = ["absolute"]; + description = "Determines how file paths are displayed."; }; + set_env = mkOption { - description = "Set an environment for term_previewer"; type = attrsOf str; - default = { - COLORTERM = "truecolor"; - }; + default = {COLORTERM = "truecolor";}; + description = "Set an environment for term_previewer"; }; + winblend = mkOption { - description = "pseudo-transparency of keymap hints floating window"; type = int; default = 0; + description = "pseudo-transparency of keymap hints floating window"; + }; + }; + }; + + 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."; }; }; }; @@ -178,5 +210,10 @@ in { enable = mkEnableOption "telescope.nvim: multi-purpose search and picker utility"; setupOpts = mkPluginSetupOption "Telescope" setupOptions; + extensions = mkOption { + type = listOf (attrsOf (submodule extensionOpts)); + default = []; + description = "TODO"; + }; }; }