mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 11:28:22 +00:00
LSP: implement documentHighlight (#11638)
* implement documentHighlight * fix bug * document highlight groups * use uppercase for help section title * documentation
This commit is contained in:
@@ -76,21 +76,6 @@ FAQ *lsp-faq*
|
|||||||
set the option in an |after-directory| ftplugin, e.g.
|
set the option in an |after-directory| ftplugin, e.g.
|
||||||
"after/ftplugin/python.vim".
|
"after/ftplugin/python.vim".
|
||||||
|
|
||||||
================================================================================
|
|
||||||
LSP HIGHLIGHT *lsp-highlight*
|
|
||||||
|
|
||||||
When LSP is activated these highlight groups are defined:
|
|
||||||
|
|
||||||
LspDiagnosticsError
|
|
||||||
LspDiagnosticsHint
|
|
||||||
LspDiagnosticsInformation
|
|
||||||
LspDiagnosticsUnderline
|
|
||||||
LspDiagnosticsUnderlineError
|
|
||||||
LspDiagnosticsUnderlineHint
|
|
||||||
LspDiagnosticsUnderlineInformation
|
|
||||||
LspDiagnosticsUnderlineWarning
|
|
||||||
LspDiagnosticsWarning
|
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
LSP API *lsp-api*
|
LSP API *lsp-api*
|
||||||
|
|
||||||
@@ -173,6 +158,25 @@ name: >
|
|||||||
vim.lsp.protocol.TextDocumentSyncKind.Full == 1
|
vim.lsp.protocol.TextDocumentSyncKind.Full == 1
|
||||||
vim.lsp.protocol.TextDocumentSyncKind[1] == "Full"
|
vim.lsp.protocol.TextDocumentSyncKind[1] == "Full"
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
LSP HIGHLIGHT *lsp-highlight*
|
||||||
|
|
||||||
|
*hl-LspDiagnosticsError*
|
||||||
|
LspDiagnosticsError used for "Error" diagnostic virtual text
|
||||||
|
*hl-LspDiagnosticsWarning*
|
||||||
|
LspDiagnosticsWarning used for "Warning" diagnostic virtual text
|
||||||
|
*hl-LspDiagnosticsInformation*
|
||||||
|
LspDiagnosticInformation used for "Information" diagnostic virtual text
|
||||||
|
*hl-LspDiagnosticsHint*
|
||||||
|
LspDiagnosticHint used for "Hint" diagnostic virtual text
|
||||||
|
*hl-LspReferenceText*
|
||||||
|
LspReferenceText used for highlighting "text" references
|
||||||
|
*hl-LspReferenceRead*
|
||||||
|
LspReferenceRead used for highlighting "read" references
|
||||||
|
*hl-LspReferenceWrite*
|
||||||
|
LspReferenceWrite used for highlighting "write" references
|
||||||
|
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
LSP EXAMPLE *lsp-extension-example*
|
LSP EXAMPLE *lsp-extension-example*
|
||||||
|
|
||||||
@@ -720,6 +724,9 @@ declaration() *vim.lsp.buf.declaration()*
|
|||||||
definition() *vim.lsp.buf.definition()*
|
definition() *vim.lsp.buf.definition()*
|
||||||
TODO: Documentation
|
TODO: Documentation
|
||||||
|
|
||||||
|
document_highlight() *vim.lsp.buf.document_highlight()*
|
||||||
|
TODO: Documentation
|
||||||
|
|
||||||
formatting({options}) *vim.lsp.buf.formatting()*
|
formatting({options}) *vim.lsp.buf.formatting()*
|
||||||
TODO: Documentation
|
TODO: Documentation
|
||||||
|
|
||||||
@@ -897,6 +904,9 @@ apply_workspace_edit({workspace_edit})
|
|||||||
buf_clear_diagnostics({bufnr}) *vim.lsp.util.buf_clear_diagnostics()*
|
buf_clear_diagnostics({bufnr}) *vim.lsp.util.buf_clear_diagnostics()*
|
||||||
TODO: Documentation
|
TODO: Documentation
|
||||||
|
|
||||||
|
buf_clear_references({bufnr}) *vim.lsp.util.buf_clear_references()*
|
||||||
|
TODO: Documentation
|
||||||
|
|
||||||
*vim.lsp.util.buf_diagnostics_save_positions()*
|
*vim.lsp.util.buf_diagnostics_save_positions()*
|
||||||
buf_diagnostics_save_positions({bufnr}, {diagnostics})
|
buf_diagnostics_save_positions({bufnr}, {diagnostics})
|
||||||
TODO: Documentation
|
TODO: Documentation
|
||||||
|
@@ -134,5 +134,23 @@ function M.references(context)
|
|||||||
request('textDocument/references', params)
|
request('textDocument/references', params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Send request to server to resolve document highlights for the
|
||||||
|
--- current text document position. This request can be associated
|
||||||
|
--- to key mapping or to events such as `CursorHold`, eg:
|
||||||
|
---
|
||||||
|
--- <pre>
|
||||||
|
--- vim.api.nvim_command [[autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()]]
|
||||||
|
--- vim.api.nvim_command [[autocmd CursorHoldI <buffer> lua vim.lsp.buf.document_highlight()]]
|
||||||
|
--- vim.api.nvim_command [[autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()]]
|
||||||
|
--- </pre>
|
||||||
|
function M.document_highlight()
|
||||||
|
local params = util.make_position_params()
|
||||||
|
request('textDocument/documentHighlight', params)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.clear_references()
|
||||||
|
util.buf_clear_references()
|
||||||
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
-- vim:sw=2 ts=2 et
|
-- vim:sw=2 ts=2 et
|
||||||
|
@@ -196,6 +196,12 @@ M['textDocument/peekDefinition'] = function(_, _, result, _)
|
|||||||
api.nvim_buf_add_highlight(headbuf, -1, 'Keyword', 0, -1)
|
api.nvim_buf_add_highlight(headbuf, -1, 'Keyword', 0, -1)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
M['textDocument/documentHighlight'] = function(_, _, result, _)
|
||||||
|
if not result then return end
|
||||||
|
local bufnr = api.nvim_get_current_buf()
|
||||||
|
util.buf_highlight_references(bufnr, result)
|
||||||
|
end
|
||||||
|
|
||||||
local function log_message(_, _, result, client_id)
|
local function log_message(_, _, result, client_id)
|
||||||
local message_type = result.type
|
local message_type = result.type
|
||||||
local message = result.message
|
local message = result.message
|
||||||
|
@@ -569,6 +569,7 @@ do
|
|||||||
local all_buffer_diagnostics = {}
|
local all_buffer_diagnostics = {}
|
||||||
|
|
||||||
local diagnostic_ns = api.nvim_create_namespace("vim_lsp_diagnostics")
|
local diagnostic_ns = api.nvim_create_namespace("vim_lsp_diagnostics")
|
||||||
|
local reference_ns = api.nvim_create_namespace("vim_lsp_references")
|
||||||
|
|
||||||
local underline_highlight_name = "LspDiagnosticsUnderline"
|
local underline_highlight_name = "LspDiagnosticsUnderline"
|
||||||
vim.cmd(string.format("highlight default %s gui=underline cterm=underline", underline_highlight_name))
|
vim.cmd(string.format("highlight default %s gui=underline cterm=underline", underline_highlight_name))
|
||||||
@@ -602,7 +603,6 @@ do
|
|||||||
|
|
||||||
function M.buf_clear_diagnostics(bufnr)
|
function M.buf_clear_diagnostics(bufnr)
|
||||||
validate { bufnr = {bufnr, 'n', true} }
|
validate { bufnr = {bufnr, 'n', true} }
|
||||||
bufnr = bufnr == 0 and api.nvim_get_current_buf() or bufnr
|
|
||||||
api.nvim_buf_clear_namespace(bufnr, diagnostic_ns, 0, -1)
|
api.nvim_buf_clear_namespace(bufnr, diagnostic_ns, 0, -1)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -683,7 +683,6 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
function M.buf_diagnostics_underline(bufnr, diagnostics)
|
function M.buf_diagnostics_underline(bufnr, diagnostics)
|
||||||
for _, diagnostic in ipairs(diagnostics) do
|
for _, diagnostic in ipairs(diagnostics) do
|
||||||
local start = diagnostic.range["start"]
|
local start = diagnostic.range["start"]
|
||||||
@@ -705,6 +704,25 @@ do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function M.buf_clear_references(bufnr)
|
||||||
|
validate { bufnr = {bufnr, 'n', true} }
|
||||||
|
api.nvim_buf_clear_namespace(bufnr, reference_ns, 0, -1)
|
||||||
|
end
|
||||||
|
|
||||||
|
function M.buf_highlight_references(bufnr, references)
|
||||||
|
validate { bufnr = {bufnr, 'n', true} }
|
||||||
|
for _, reference in ipairs(references) do
|
||||||
|
local start_pos = {reference["range"]["start"]["line"], reference["range"]["start"]["character"]}
|
||||||
|
local end_pos = {reference["range"]["end"]["line"], reference["range"]["end"]["character"]}
|
||||||
|
local document_highlight_kind = {
|
||||||
|
[protocol.DocumentHighlightKind.Text] = "LspReferenceText";
|
||||||
|
[protocol.DocumentHighlightKind.Read] = "LspReferenceRead";
|
||||||
|
[protocol.DocumentHighlightKind.Write] = "LspReferenceWrite";
|
||||||
|
}
|
||||||
|
highlight_range(bufnr, reference_ns, document_highlight_kind[reference["kind"]], start_pos, end_pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function M.buf_diagnostics_virtual_text(bufnr, diagnostics)
|
function M.buf_diagnostics_virtual_text(bufnr, diagnostics)
|
||||||
local buffer_line_diagnostics = all_buffer_diagnostics[bufnr]
|
local buffer_line_diagnostics = all_buffer_diagnostics[bufnr]
|
||||||
if not buffer_line_diagnostics then
|
if not buffer_line_diagnostics then
|
||||||
|
Reference in New Issue
Block a user