summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md1
-rw-r--r--lua/telescope/builtin/init.lua1
-rw-r--r--lua/telescope/builtin/lsp.lua31
3 files changed, 33 insertions, 0 deletions
diff --git a/README.md b/README.md
index 070c9dc..de7c5a3 100644
--- a/README.md
+++ b/README.md
@@ -410,6 +410,7 @@ Built-in functions. Ready to be bound to any key you like. :smile:
| `builtin.lsp_range_code_actions` | Lists LSP range code action to be trigged on enter. |
| `builtin.lsp_document_diagnostics` | Lists LSP Diagnostics in the current document. |
| `builtin.lsp_workspace_diagnostics` | Lists LSP Diagnostics in the workspace if supported and otherwise open buffers. |
+| `builtin.lsp_definitions` | Goto definition if there is only one. If there are multiple, open them up in telescope |
### Git Pickers
diff --git a/lua/telescope/builtin/init.lua b/lua/telescope/builtin/init.lua
index 5339b9b..b7f45f5 100644
--- a/lua/telescope/builtin/init.lua
+++ b/lua/telescope/builtin/init.lua
@@ -62,6 +62,7 @@ builtin.autocommands = require('telescope.builtin.internal').autocommands
builtin.spell_suggest = require('telescope.builtin.internal').spell_suggest
builtin.lsp_references = require('telescope.builtin.lsp').references
+builtin.lsp_definitions = require('telescope.builtin.lsp').definitions
builtin.lsp_document_symbols = require('telescope.builtin.lsp').document_symbols
builtin.lsp_code_actions = require('telescope.builtin.lsp').code_actions
builtin.lsp_document_diagnostics = require('telescope.builtin.lsp').diagnostics
diff --git a/lua/telescope/builtin/lsp.lua b/lua/telescope/builtin/lsp.lua
index 22bf0ba..99d5170 100644
--- a/lua/telescope/builtin/lsp.lua
+++ b/lua/telescope/builtin/lsp.lua
@@ -38,6 +38,36 @@ lsp.references = function(opts)
}):find()
end
+lsp.definitions = function(opts)
+ opts = opts or {}
+
+ local params = vim.lsp.util.make_position_params()
+ local result = vim.lsp.buf_request_sync(0, "textDocument/definition", params, opts.timeout or 10000)
+ local flattened_results = {}
+ for _, server_results in pairs(result) do
+ if server_results.result then
+ vim.list_extend(flattened_results, server_results.result)
+ end
+ end
+
+ if #flattened_results == 0 then
+ return
+ elseif #flattened_results == 1 then
+ vim.lsp.util.jump_to_location(flattened_results[1])
+ else
+ local locations = vim.lsp.util.locations_to_items(flattened_results)
+ pickers.new(opts, {
+ prompt_title = 'LSP Definitions',
+ finder = finders.new_table {
+ results = locations,
+ entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts),
+ },
+ previewer = conf.qflist_previewer(opts),
+ sorter = conf.generic_sorter(opts),
+ }):find()
+ end
+end
+
lsp.document_symbols = function(opts)
local params = vim.lsp.util.make_position_params()
local results_lsp = vim.lsp.buf_request_sync(0, "textDocument/documentSymbol", params, opts.timeout or 10000)
@@ -246,6 +276,7 @@ local feature_map = {
["code_actions"] = "code_action",
["document_symbols"] = "document_symbol",
["references"] = "find_references",
+ ["definitions"] = "goto_definition",
["workspace_symbols"] = "workspace_symbol",
}