mirror of
https://github.com/neovim/neovim.git
synced 2025-10-22 17:11:49 +00:00
add support to show diagnostics count in statusline (#11641)
* add support to show diagnostics count in statusline * documentation
This commit is contained in:
@@ -294,6 +294,12 @@ The example will:
|
|||||||
<
|
<
|
||||||
|
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
AUTOCOMMANDS *lsp-autocommands*
|
||||||
|
|
||||||
|
*LspDiagnosticsChanged*
|
||||||
|
LspDiagnosticsChanged After receiving publishDiagnostics server response
|
||||||
|
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
Lua module: vim.lsp *lsp-core*
|
Lua module: vim.lsp *lsp-core*
|
||||||
@@ -337,7 +343,7 @@ buf_notify({bufnr}, {method}, {params}) *vim.lsp.buf_notify()*
|
|||||||
{params} (string) Parameters to send to the server
|
{params} (string) Parameters to send to the server
|
||||||
|
|
||||||
Return: ~
|
Return: ~
|
||||||
nil
|
true if any client returns true; false otherwise
|
||||||
|
|
||||||
*vim.lsp.buf_request()*
|
*vim.lsp.buf_request()*
|
||||||
buf_request({bufnr}, {method}, {params}, {callback})
|
buf_request({bufnr}, {method}, {params}, {callback})
|
||||||
@@ -758,6 +764,10 @@ rename({new_name}) *vim.lsp.buf.rename()*
|
|||||||
request({method}, {params}, {callback}) *vim.lsp.buf.request()*
|
request({method}, {params}, {callback}) *vim.lsp.buf.request()*
|
||||||
TODO: Documentation
|
TODO: Documentation
|
||||||
|
|
||||||
|
server_ready() *vim.lsp.buf.server_ready()*
|
||||||
|
Sends a notification through all clients associated with current
|
||||||
|
buffer and returns `true` if server responds.
|
||||||
|
|
||||||
signature_help() *vim.lsp.buf.signature_help()*
|
signature_help() *vim.lsp.buf.signature_help()*
|
||||||
TODO: Documentation
|
TODO: Documentation
|
||||||
|
|
||||||
@@ -903,6 +913,30 @@ 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
|
||||||
|
|
||||||
|
*vim.lsp.util.buf_diagnostics_count()*
|
||||||
|
buf_diagnostics_count({kind})
|
||||||
|
Returns the number of diagnostics of given kind for current buffer.
|
||||||
|
Useful for showing diagnostics counts in statusline. eg:
|
||||||
|
|
||||||
|
>
|
||||||
|
function! LspStatus() abort
|
||||||
|
let sl = ''
|
||||||
|
if luaeval('vim.lsp.buf.server_ready()')
|
||||||
|
let sl.='%#MyStatuslineLSP#E:'
|
||||||
|
let sl.='%#MyStatuslineLSPErrors#%{luaeval("vim.lsp.util.buf_diagnostics_count(\"Error\")")}'
|
||||||
|
let sl.='%#MyStatuslineLSP# W:'
|
||||||
|
let sl.='%#MyStatuslineLSPWarnings#%{luaeval("vim.lsp.util.buf_diagnostics_count(\"Warning\")")}'
|
||||||
|
else
|
||||||
|
let sl.='%#MyStatuslineLSPErrors#off'
|
||||||
|
endif
|
||||||
|
return sl
|
||||||
|
endfunction
|
||||||
|
let &l:statusline = '%#MyStatuslineLSP#LSP '.LspStatus()
|
||||||
|
<
|
||||||
|
|
||||||
|
Parameters: ~
|
||||||
|
{kind} Diagnostic severity kind: Error, Warning, Information or Hint.
|
||||||
|
|
||||||
buf_clear_references({bufnr}) *vim.lsp.util.buf_clear_references()*
|
buf_clear_references({bufnr}) *vim.lsp.util.buf_clear_references()*
|
||||||
TODO: Documentation
|
TODO: Documentation
|
||||||
|
@@ -893,21 +893,22 @@ function lsp.buf_request_sync(bufnr, method, params, timeout_ms)
|
|||||||
return request_results
|
return request_results
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Sends a notification to all servers attached to the buffer.
|
--- Send a notification to a server
|
||||||
---
|
-- @param bufnr [number] (optional): The number of the buffer
|
||||||
--@param bufnr (optional, number) Buffer handle, or 0 for current
|
-- @param method [string]: Name of the request method
|
||||||
--@param method (string) LSP method name
|
-- @param params [string]: Arguments to send to the server
|
||||||
--@param params (string) Parameters to send to the server
|
--
|
||||||
---
|
-- @returns true if any client returns true; false otherwise
|
||||||
--@returns nil
|
|
||||||
function lsp.buf_notify(bufnr, method, params)
|
function lsp.buf_notify(bufnr, method, params)
|
||||||
validate {
|
validate {
|
||||||
bufnr = { bufnr, 'n', true };
|
bufnr = { bufnr, 'n', true };
|
||||||
method = { method, 's' };
|
method = { method, 's' };
|
||||||
}
|
}
|
||||||
|
local resp = false
|
||||||
for_each_buffer_client(bufnr, function(client, _client_id)
|
for_each_buffer_client(bufnr, function(client, _client_id)
|
||||||
client.rpc.notify(method, params)
|
if client.rpc.notify(method, params) then resp = true end
|
||||||
end)
|
end)
|
||||||
|
return resp
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Implements 'omnifunc' compatible LSP completion.
|
--- Implements 'omnifunc' compatible LSP completion.
|
||||||
|
@@ -23,6 +23,10 @@ local function request(method, params, callback)
|
|||||||
return vim.lsp.buf_request(0, method, params, callback)
|
return vim.lsp.buf_request(0, method, params, callback)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function M.server_ready()
|
||||||
|
return not not vim.lsp.buf_notify(0, "window/progress", {})
|
||||||
|
end
|
||||||
|
|
||||||
function M.hover()
|
function M.hover()
|
||||||
local params = util.make_position_params()
|
local params = util.make_position_params()
|
||||||
request('textDocument/hover', params)
|
request('textDocument/hover', params)
|
||||||
|
@@ -33,6 +33,7 @@ M['textDocument/publishDiagnostics'] = function(_, _, result)
|
|||||||
util.buf_diagnostics_underline(bufnr, result.diagnostics)
|
util.buf_diagnostics_underline(bufnr, result.diagnostics)
|
||||||
util.buf_diagnostics_virtual_text(bufnr, result.diagnostics)
|
util.buf_diagnostics_virtual_text(bufnr, result.diagnostics)
|
||||||
-- util.set_loclist(result.diagnostics)
|
-- util.set_loclist(result.diagnostics)
|
||||||
|
vim.api.nvim_command("doautocmd User LspDiagnosticsChanged")
|
||||||
end
|
end
|
||||||
|
|
||||||
M['textDocument/references'] = function(_, _, result)
|
M['textDocument/references'] = function(_, _, result)
|
||||||
|
@@ -743,6 +743,18 @@ do
|
|||||||
api.nvim_buf_set_virtual_text(bufnr, diagnostic_ns, line, virt_texts, {})
|
api.nvim_buf_set_virtual_text(bufnr, diagnostic_ns, line, virt_texts, {})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
function M.buf_diagnostics_count(kind)
|
||||||
|
local bufnr = vim.api.nvim_get_current_buf()
|
||||||
|
local buffer_line_diagnostics = all_buffer_diagnostics[bufnr]
|
||||||
|
if not buffer_line_diagnostics then return end
|
||||||
|
local count = 0
|
||||||
|
for _, line_diags in pairs(buffer_line_diagnostics) do
|
||||||
|
for _, diag in ipairs(line_diags) do
|
||||||
|
if protocol.DiagnosticSeverity[kind] == diag.severity then count = count + 1 end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return count
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local position_sort = sort_by_key(function(v)
|
local position_sort = sort_by_key(function(v)
|
||||||
|
Reference in New Issue
Block a user