1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-24 05:20:04 +08:00
SpaceVim/bundle/trouble.nvim/lua/trouble/providers/telescope.lua
2023-07-01 20:30:44 +08:00

87 lines
2.4 KiB
Lua

local util = require("trouble.util")
local M = {}
M.results = {}
--- Turns a Telescope item into a Trouble item.
local function item_to_result(item)
local row = (item.lnum or 1) - 1
local col = (item.col or 1) - 1
if not item.bufnr then
local fname = vim.fn.fnamemodify(item.filename, ":p")
if vim.fn.filereadable(fname) == 0 and item.cwd then
fname = vim.fn.fnamemodify(item.cwd .. "/" .. item.filename, ":p")
end
item.bufnr = vim.fn.bufnr(fname, true)
end
local pitem = {
row = row,
col = col,
message = item.text,
severity = 0,
range = {
start = { line = row, character = col },
["end"] = { line = row, character = -1 },
},
}
return util.process_item(pitem, item.bufnr)
end
--- Shows all Telescope results in Trouble.
function M.open_with_trouble(prompt_bufnr, _mode)
local action_state = require("telescope.actions.state")
local actions = require("telescope.actions")
local picker = action_state.get_current_picker(prompt_bufnr)
local manager = picker.manager
M.results = {}
for item in manager:iter() do
table.insert(M.results, item_to_result(item))
end
actions.close(prompt_bufnr)
require("trouble").open("telescope")
end
--- Shows the selected Telescope results in Trouble.
function M.open_selected_with_trouble(prompt_bufnr, _mode)
local action_state = require("telescope.actions.state")
local actions = require("telescope.actions")
local picker = action_state.get_current_picker(prompt_bufnr)
M.results = {}
for _, item in ipairs(picker:get_multi_selection()) do
table.insert(M.results, item_to_result(item))
end
actions.close(prompt_bufnr)
require("trouble").open("telescope")
end
--- Shows the selected Telescope results in Trouble.
--- If no results are currently selected, shows all of them.
function M.smart_open_with_trouble(prompt_bufnr, _mode)
local action_state = require("telescope.actions.state")
local picker = action_state.get_current_picker(prompt_bufnr)
if #picker:get_multi_selection() > 0 then
M.open_selected_with_trouble(prompt_bufnr, _mode)
else
M.open_with_trouble(prompt_bufnr, _mode)
end
end
function M.telescope(_win, _buf, cb, _options)
if #M.results == 0 then
util.warn(
"No Telescope results found. Open Telescopen and send results to Trouble first. Refer to the documentation for more info."
)
end
cb(M.results)
end
return M