mirror of
https://github.com/neovim/neovim.git
synced 2026-11-02 09:49:02 -06:00
feat(lsp): support textDocument/documentLink (#37644)
This commit is contained in:
1 parent
49c19a1fe3
commit
05bd4398c5
5 files changed
+37
-2
No files matched your search
@@ -307,6 +307,7 @@ LSP
|
|||||||
• Code lenses now display as virtual lines
|
• Code lenses now display as virtual lines
|
||||||
• Support for `workspace/codeLens/refresh`:
|
• Support for `workspace/codeLens/refresh`:
|
||||||
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeLens_refresh
|
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#codeLens_refresh
|
||||||
|
• `gx` will use `textDocument/documentLink` if available.
|
||||||
|
|
||||||
LUA
|
LUA
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ do
|
|||||||
{ silent = true, expr = true, desc = ':help v_@-default' }
|
{ silent = true, expr = true, desc = ':help v_@-default' }
|
||||||
)
|
)
|
||||||
|
|
||||||
--- Map |gx| to call |vim.ui.open| on the <cfile> at cursor.
|
--- Map |gx| to call |vim.ui.open| on the `textDocument/documentLink` or <cfile> at cursor.
|
||||||
do
|
do
|
||||||
local function do_open(uri)
|
local function do_open(uri)
|
||||||
local cmd, err = vim.ui.open(uri)
|
local cmd, err = vim.ui.open(uri)
|
||||||
|
|||||||
@@ -508,6 +508,10 @@ function protocol.make_client_capabilities()
|
|||||||
linkSupport = true,
|
linkSupport = true,
|
||||||
dynamicRegistration = true,
|
dynamicRegistration = true,
|
||||||
},
|
},
|
||||||
|
documentLink = {
|
||||||
|
dynamicRegistration = false,
|
||||||
|
tooltipSupport = false,
|
||||||
|
},
|
||||||
implementation = {
|
implementation = {
|
||||||
linkSupport = true,
|
linkSupport = true,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -213,6 +213,33 @@ function M._get_urls()
|
|||||||
local cursor = vim.api.nvim_win_get_cursor(0)
|
local cursor = vim.api.nvim_win_get_cursor(0)
|
||||||
local row = cursor[1] - 1
|
local row = cursor[1] - 1
|
||||||
local col = cursor[2]
|
local col = cursor[2]
|
||||||
|
|
||||||
|
-- Find LSP document links under the cursor.
|
||||||
|
local params = { textDocument = vim.lsp.util.make_text_document_params(bufnr) }
|
||||||
|
local results = vim.lsp.buf_request_sync(bufnr, 'textDocument/documentLink', params)
|
||||||
|
|
||||||
|
for client_id, result in pairs(results or {}) do
|
||||||
|
if result.error then
|
||||||
|
vim.lsp.log.error(result.error)
|
||||||
|
else
|
||||||
|
local client = assert(vim.lsp.get_client_by_id(client_id))
|
||||||
|
local lsp_position = vim.lsp.util.make_position_params(0, client.offset_encoding).position
|
||||||
|
local position = vim.pos.lsp(bufnr, lsp_position, client.offset_encoding)
|
||||||
|
|
||||||
|
local document_links = result.result or {} ---@type lsp.DocumentLink[]
|
||||||
|
for _, document_link in ipairs(document_links) do
|
||||||
|
local range = vim.range.lsp(bufnr, document_link.range, client.offset_encoding)
|
||||||
|
if document_link.target and range:has(position) then
|
||||||
|
local target = document_link.target ---@type string
|
||||||
|
if vim.startswith(target, 'file://') then
|
||||||
|
target = vim.uri_to_fname(target)
|
||||||
|
end
|
||||||
|
table.insert(urls, target)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local extmarks = vim.api.nvim_buf_get_extmarks(bufnr, -1, { row, col }, { row, col }, {
|
local extmarks = vim.api.nvim_buf_get_extmarks(bufnr, -1, { row, col }, { row, col }, {
|
||||||
details = true,
|
details = true,
|
||||||
type = 'highlight',
|
type = 'highlight',
|
||||||
|
|||||||
@@ -731,7 +731,10 @@ describe('statuscolumn', function()
|
|||||||
api.nvim_input_mouse('left', 'press', '', 0, 5, 8)
|
api.nvim_input_mouse('left', 'press', '', 0, 5, 8)
|
||||||
eq('', eval('g:testvar'))
|
eq('', eval('g:testvar'))
|
||||||
api.nvim_input_mouse('right', 'press', '', 0, 6, 4)
|
api.nvim_input_mouse('right', 'press', '', 0, 6, 4)
|
||||||
eq('0 1 r 10', eval('g:testvar'))
|
-- Wait for the synchronous call of `textDocument/documentLink`
|
||||||
|
t.retry(nil, 1500, function()
|
||||||
|
eq('0 1 r 10', eval('g:testvar'))
|
||||||
|
end)
|
||||||
api.nvim_input_mouse('left', 'press', '', 0, 7, 7)
|
api.nvim_input_mouse('left', 'press', '', 0, 7, 7)
|
||||||
eq('0 1 l 11', eval('g:testvar'))
|
eq('0 1 l 11', eval('g:testvar'))
|
||||||
end)
|
end)
|
||||||
|
|||||||
Reference in new issue
Block a user