vim.cmd [[packadd! plenary.nvim]] vim.cmd [[packadd! telescope.nvim]] local finders = require "telescope.finders" local previewers = require "telescope.previewers" local pickers = require "telescope.pickers" local sorters = require "telescope.sorters" local utils = require "telescope.utils" local rgargs = { "--color=never", "--no-heading", "--with-filename", "--line-number", "--column", "--smart-case" } -- grep typed string in current directory (live, not fuzzy!) finders.rg_live = function(opts) local live_grepper = finders.new { fn_command = function(_, prompt) if not prompt or prompt == "" then return nil end return { command = "rg", args = vim.tbl_flatten { rgargs, prompt }, } end, } pickers.new(opts, { prompt = "Live Grep", finder = live_grepper, previewer = previewers.vimgrep, }):find() end -- fuzzy grep string in current directory (slow!) finders.rg = function(opts) opts = opts or {} local search = opts.search or "" pickers.new(opts, { prompt = "Find Word", finder = finders.new_oneshot_job(vim.tbl_flatten { "rg", rgargs, search }), previewer = previewers.vimgrep, sorter = sorters.get_norcalli_sorter(), }):find() end -- fuzzy find files in current directory (may be slow in root dir) finders.fd = function(opts) pickers.new(opts, { prompt = "Find Files", finder = finders.new_oneshot_job { "fd" }, previewer = previewers.bat, sorter = sorters.get_fuzzy_file(), }):find() end -- fuzzy find in references to symbol under cursor finders.lsp_references = function(opts) local params = vim.lsp.util.make_position_params() params.context = { includeDeclaration = false } local results_lsp, err = vim.lsp.buf_request_sync(0, "textDocument/references", params) if err then vim.api.nvim_err_writeln("Error when finding references: " .. err) return end local locations = {} for _, server_results in pairs(results_lsp) do vim.list_extend(locations, vim.lsp.util.locations_to_items(server_results.result) or {}) end local results = utils.quickfix_items_to_entries(locations) if vim.tbl_isempty(results) then return end pickers.new(opts, { prompt = "LSP References", finder = finders.new_table(results), previewer = previewers.qflist, sorter = sorters.get_norcalli_sorter(), }):find() end -- fuzzy find in document symbols finders.lsp_document_symbols = function(opts) local params = vim.lsp.util.make_position_params() local results_lsp, err = vim.lsp.buf_request_sync(0, "textDocument/documentSymbol", params) if err then vim.api.nvim_err_writeln("Error when finding document symbols: " .. err) return end local locations = {} for _, server_results in pairs(results_lsp) do vim.list_extend(locations, vim.lsp.util.symbols_to_items(server_results.result, 0) or {}) end local results = utils.quickfix_items_to_entries(locations) if vim.tbl_isempty(results) then return end pickers.new(opts, { prompt = "LSP Document Symbols", finder = finders.new_table(results), previewer = previewers.qflist, sorter = sorters.get_norcalli_sorter(), }):find() end -- fuzzy find in all workspace symbols (may need longer timeout!) finders.lsp_workspace_symbols = function(opts) local params = { query = "" } local results_lsp, err = vim.lsp.buf_request_sync(0, "workspace/symbol", params, 1000) if err then vim.api.nvim_err_writeln("Error when finding symbols: " .. err) return end local locations = {} for _, server_results in pairs(results_lsp) do vim.list_extend(locations, vim.lsp.util.symbols_to_items(server_results.result, 0) or {}) end local results = utils.quickfix_items_to_entries(locations) if vim.tbl_isempty(results) then return end pickers.new(opts, { prompt = "LSP Workspace Symbols", finder = finders.new_table(results), previewer = previewers.qflist, sorter = sorters.get_norcalli_sorter(), }):find() end return finders