141 lines
3.9 KiB
Lua
141 lines
3.9 KiB
Lua
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
|