local ui = require("fschauen.util.icons").ui local builtin = function(name, opts) return function(title) return function() local picker = require("telescope.builtin")[name] picker(vim.tbl_extend("force", opts or {}, { prompt_title = title, })) end end end local pickers = setmetatable({ all_files = builtin("find_files", { hidden = true, no_ignore = true, no_ignore_parent = true, }), all_man_pages = builtin("man_pages", { sections = { "ALL" }, }), colorscheme = builtin("colorscheme", { enable_preview = true }), diagnostics = builtin("diagnostics", { bufnr = 0 }), dotfiles = builtin("find_files", { cwd = "~/.dotfiles", hidden = true }), selection = function(title) return function() local text = require("fschauen.util").get_selected_text() return require("telescope.builtin").grep_string { prompt_title = string.format(title .. ": %s ", text), search = text, } end end, here = builtin("current_buffer_fuzzy_find"), }, { -- Fall back to telescope's built-in pickers if a custom one is not defined -- above, but make sure to keep the title we defined. __index = function(_, key) return builtin(key) end, }) ---@class LazyKeysSpec ---@field desc string ---Create consistent key maps with the same prefix and description style. ---@param spec LazyKeysSpec lazy.nvim key spec to modify ---@return LazyKeysSpec modified key spec with prefix and description local keymap = function(spec) vim.validate("Telescope key spec", spec, "table") vim.validate("Telescope key lhs", spec[1], "string") vim.validate("Telescope key rhs", spec[2], { "string", "function" }) vim.validate("Telescope key description", spec.desc, "string") return vim.tbl_extend("force", spec, { "f" .. spec[1], -- lhs spec[2], -- rhs desc = ui.Telescope .. " Telescope " .. spec.desc, }) end local keys = { -- stylua: ignore start { "a", pickers.autocommands " Autocommands" , desc = "[a]utocommands" }, { "b", pickers.buffers " Buffers" , desc = "[b]uffers" }, --"B" used in telescope-file-browser { "c", pickers.colorscheme " Colorschemes" , desc = "[c]olorschemes" }, { "C", pickers.commands " Commands" , desc = "[C]ommands" }, { "d", pickers.diagnostics "󰀪 Diagnostics" , desc = "[d]iagnostics" }, --"e" { "f", pickers.find_files " Files" , desc = "[f]ind files" }, { "F", pickers.all_files " ALL files" , desc = "all [F]iles" }, { "gr", pickers.live_grep " Live grep" , desc = "Live [gr]ep" }, { "gf", pickers.git_files " Git files" , desc = "[g]it [f]iles" }, { "gc", pickers.git_commits " Commits" , desc = "[g]it [c]ommits" }, { "h", pickers.here " Current buffer" , desc = "[b]uffer [h]ere" }, { "H", pickers.highlights "󰌶 Highlights" , desc = "[H]ighlights" }, --"i" used in nerdy { "j", pickers.jumplist " Jumplist" , desc = "[j]umplist" }, { "k", pickers.keymaps " Keymaps" , desc = "[k]eymaps" }, { "K", pickers.help_tags " Help tags" , desc = "[K] help/documentation" }, { "l", pickers.loclist " Location list" , desc = "[l]ocation List" }, { "m", pickers.all_man_pages " Man pages" , desc = "[m]an pages" }, --"n" used in vim-notify { "o", pickers.vim_options " Vim options" , desc = "[o]ptions" }, --"p" { "q", pickers.quickfix " Quickfix" , desc = "[q]uickfix" }, { "r", pickers.lsp_references " References" , desc = "[r]eferences" }, { "R", pickers.registers "󱓥 Registers" , desc = "[R]registers" }, { "s", pickers.lsp_document_symbols "󰫧 Document Symbols " , desc = "LSP document [s]ymbols" }, { "S", pickers.lsp_workspace_symbols "󱄑 Workspace Symbols " , desc = "LSP workspace [S]ymbols" }, --"t" used in todo_comments { "T", pickers.treesitter " Treesitter symbols" , desc = "[T]reesitter Symbols" }, --"u" --"v" { "w", pickers.selection " Grep" , desc = "[w]word under cursor" }, { "w", pickers.selection " Grep", mode = "v" , desc = "[w]ord(s) selected" }, --"x" --"y" { "z", pickers.spell_suggest "󰓆 Spelling suggestions" , desc = "[z] spell suggestions" }, { ".", pickers.dotfiles " Dotfiles" , desc = "[.]dotfiles" }, { ":", pickers.command_history " Command history" , desc = "[:]command history" }, { "/", pickers.search_history " Search history" , desc = "[/]search history" }, { " ", pickers.resume "󰐎 Resume" , desc = "Resume " }, -- stylua: ignore end } return { "nvim-telescope/telescope.nvim", dependencies = { "nvim-telescope/telescope-fzf-native.nvim", build = "cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release " .. "&& cmake --build build --config Release " .. "&& cmake --install build --prefix build", }, cmd = "Telescope", ---@diagnostic disable-next-line: param-type-mismatch keys = vim.iter(keys):map(keymap):totable(), -- Export this function so we can use in other plugins. keymap = keymap, opts = function() local actions = require("telescope.actions") local layout = require("telescope.actions.layout") local state = require("telescope.actions.state") local clear_prompt = function(prompt_bufnr) state.get_current_picker(prompt_bufnr):reset_prompt() end local mappings = { [""] = layout.cycle_layout_next, [""] = clear_prompt, [""] = actions.toggle_selection + actions.move_selection_next, [""] = actions.toggle_selection + actions.move_selection_previous, [""] = layout.toggle_preview, [""] = actions.move_selection_next, [""] = actions.move_selection_previous, [""] = actions.results_scrolling_down, [""] = actions.results_scrolling_up, [""] = actions.preview_scrolling_down, [""] = actions.preview_scrolling_up, [""] = actions.select_horizontal, [""] = false, [""] = actions.close, [""] = actions.smart_send_to_qflist + actions.open_qflist, [""] = actions.smart_send_to_loclist + actions.open_loclist, } return { defaults = { mappings = { i = mappings, n = mappings }, prompt_prefix = " " .. ui.Telescope .. " ", selection_caret = ui.Play .. " ", multi_icon = ui.Checkbox .. " ", scroll_strategy = "limit", -- Don't wrap around in results. dynamic_preview_title = true, layout_strategy = "flex", layout_config = { width = 0.9, height = 0.9, flex = { flip_columns = 180 }, horizontal = { preview_width = 0.5 }, vertical = { preview_height = 0.5 }, }, cycle_layout_list = { "horizontal", "vertical", }, }, pickers = { buffers = { mappings = { n = { x = actions.delete_buffer }, i = { [""] = actions.delete_buffer }, }, }, colorscheme = { theme = "dropdown" }, spell_suggest = { theme = "cursor" }, }, } end, config = function(_, opts) require("telescope").setup(opts) require("telescope").load_extension("fzf") vim.api.nvim_create_autocmd("User", { desc = "Enable line number in Telescope previewers.", group = vim.api.nvim_create_augroup("fschauen.telescope", { clear = true }), pattern = "TelescopePreviewerLoaded", command = "setlocal number", }) end, }