diff options
| author | William Boman <william@redwill.se> | 2021-04-21 02:48:29 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-04-20 17:48:29 -0700 |
| commit | 3adeab2bed42597c8495fbe3a2376c746232f2e3 (patch) | |
| tree | a4cd1f60c32a11d869af92d5c535fba05de73a40 /lua/telescope | |
| parent | 13dae8c4d924472933443f14109a0739dbacbeda (diff) | |
fix: support multiple clients in lsp code actions (#722)
* fix: support multiple clients in lsp code actions
* no goto
* reduce diff a bit
* use displayer, also include lsp client name for each entry
* review comments
Diffstat (limited to 'lua/telescope')
| -rw-r--r-- | lua/telescope/builtin/git.lua | 2 | ||||
| -rw-r--r-- | lua/telescope/builtin/lsp.lua | 62 | ||||
| -rw-r--r-- | lua/telescope/utils.lua | 3 |
3 files changed, 54 insertions, 13 deletions
diff --git a/lua/telescope/builtin/git.lua b/lua/telescope/builtin/git.lua index f7c0096..198abae 100644 --- a/lua/telescope/builtin/git.lua +++ b/lua/telescope/builtin/git.lua @@ -15,7 +15,7 @@ git.files = function(opts) local show_untracked = utils.get_default(opts.show_untracked, true) local recurse_submodules = utils.get_default(opts.recurse_submodules, false) if show_untracked and recurse_submodules then - error("Git does not suppurt both --others and --recurse-submodules") + error("Git does not support both --others and --recurse-submodules") end -- By creating the entry maker after the cwd options, diff --git a/lua/telescope/builtin/lsp.lua b/lua/telescope/builtin/lsp.lua index 285a047..91097ba 100644 --- a/lua/telescope/builtin/lsp.lua +++ b/lua/telescope/builtin/lsp.lua @@ -3,6 +3,7 @@ local action_state = require('telescope.actions.state') local finders = require('telescope.finders') local make_entry = require('telescope.make_entry') local pickers = require('telescope.pickers') +local entry_display = require('telescope.pickers.entry_display') local utils = require('telescope.utils') local a = require('plenary.async_lib') local async, await = a.async, a.await @@ -131,20 +132,56 @@ lsp.code_actions = function(opts) return end - local _, response = next(results_lsp) - if not response then - print("No code actions available") - return + local idx = 1 + local results = {} + local widths = { + idx = 0, + command_title = 0, + client_name = 0, + } + + for client_id, response in pairs(results_lsp) do + if response.result then + local client = vim.lsp.get_client_by_id(client_id) + + for _, result in pairs(response.result) do + local entry = { + idx = idx, + command_title = result.title, + client_name = client and client.name or "", + command = result, + } + + for key, value in pairs(widths) do + widths[key] = math.max(value, utils.strdisplaywidth(entry[key])) + end + + table.insert(results, entry) + idx = idx + 1 + end + end end - local results = response.result - if not results or #results == 0 then + if #results == 0 then print("No code actions available") return end - for i,x in ipairs(results) do - x.idx = i + local displayer = entry_display.create { + separator = " ", + items = { + { width = widths.idx + 1 }, -- +1 for ":" suffix + { width = widths.command_title }, + { width = widths.client_name }, + }, + } + + local function make_display(entry) + return displayer { + {entry.idx .. ":", "TelescopePromptPrefix"}, + {entry.command_title}, + {entry.client_name, "TelescopeResultsComment"}, + } end pickers.new(opts, { @@ -154,9 +191,12 @@ lsp.code_actions = function(opts) entry_maker = function(line) return { valid = line ~= nil, - value = line, - ordinal = line.idx .. line.title, - display = line.idx .. ': ' .. line.title + value = line.command, + ordinal = line.idx .. line.command_title, + command_title = line.command_title, + idx = line.idx, + client_name = line.client_name, + display = make_display, } end }, diff --git a/lua/telescope/utils.lua b/lua/telescope/utils.lua index 4e8c1d3..85e8723 100644 --- a/lua/telescope/utils.lua +++ b/lua/telescope/utils.lua @@ -259,13 +259,14 @@ utils.strdisplaywidth = (function() return function(str, col) local startcol = col or 0 + str = tostring(str) local s = ffi.new('char[?]', #str + 1) ffi.copy(s, str) return ffi.C.linetabsize_col(startcol, s) - startcol end else return function(str, col) - return #str - (col or 0) + return #(tostring(str)) - (col or 0) end end end)() |
