Skip to content

Commit

Permalink
feat(telescope provider): (Smart) multiselect (#39)
Browse files Browse the repository at this point in the history
Adds support for Telescope's multiselect mode and smart select mode.
  • Loading branch information
runiq committed May 27, 2021
1 parent cf87622 commit 45ff198
Showing 1 changed file with 53 additions and 21 deletions.
74 changes: 53 additions & 21 deletions lua/trouble/providers/telescope.lua
Original file line number Diff line number Diff line change
@@ -1,41 +1,73 @@
local util = require("trouble.util")
local action_state = require("telescope.actions.state")
local actions = require("telescope.actions")

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
item.bufnr = vim.fn.bufnr(item.filename, 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
local row = (item.lnum or 1) - 1
local col = (item.col or 1) - 1

if not item.bufnr then
item.bufnr = vim.fn.bufnr(item.filename, true)
end

local pitem = {
row = row,
col = col,
message = item.text,
severity = 0,
range = {
start = { line = row, character = col },
["end"] = { line = row, character = -1 },
},
}

table.insert(M.results, util.process_item(pitem, item.bufnr))

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 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 picker = action_state.get_current_picker(prompt_bufnr)
if table.getn(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.")
Expand Down

0 comments on commit 45ff198

Please sign in to comment.