mirror of
https://github.com/SpaceVim/SpaceVim.git
synced 2025-01-24 02:20:03 +08:00
87 lines
2.4 KiB
Lua
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
|