summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean Mackesey <s.mackesey@gmail.com>2022-03-12 07:49:06 -0800
committerGitHub <noreply@github.com>2022-03-12 16:49:06 +0100
commit1e4d5e59df389d26b772d525abe2b1a14b2b4099 (patch)
tree24bb83e93bcf69a21554fed963d47f0c3c8960fc
parent6b3728876fbb4de263f43855f7f4291503efcd58 (diff)
feat(diagnostics): additional filter options (#1610)
- root_dir. Useful to browse only project-scoped diagnostics. - buflisted status. Useful to exclude diagnostics from unlisted buffers, which are created by language servers that analyze the entire project/workspace (e.g. sumneko-lua).
-rw-r--r--doc/telescope.txt39
-rw-r--r--lua/telescope/builtin/diagnostics.lua19
-rw-r--r--lua/telescope/builtin/init.lua4
3 files changed, 40 insertions, 22 deletions
diff --git a/doc/telescope.txt b/doc/telescope.txt
index 650990a..67927cf 100644
--- a/doc/telescope.txt
+++ b/doc/telescope.txt
@@ -1461,7 +1461,7 @@ builtin.lsp_dynamic_workspace_symbols({opts}) *builtin.lsp_dynamic_workspace_sym
builtin.diagnostics({opts}) *builtin.diagnostics()*
- Lists diagnostics for current or all open buffers
+ Lists diagnostics
- Fields:
- `All severity flags can be passed as `string` or `number` as per
`:vim.diagnostic.severity:`
@@ -1474,22 +1474,27 @@ builtin.diagnostics({opts}) *builtin.diagnostics()*
{opts} (table) options to pass to the picker
Options: ~
- {bufnr} (string|number) if nil get diagnostics for all open
- buffers. Use 0 for current buffer
- {severity} (string|number) filter diagnostics by severity name
- (string) or id (number)
- {severity_limit} (string|number) keep diagnostics equal or more
- severe wrt severity name (string) or
- id (number)
- {severity_bound} (string|number) keep diagnostics equal or less
- severe wrt severity name (string) or
- id (number)
- {no_sign} (boolean) hide DiagnosticSigns from Results
- (default: false)
- {line_width} (number) set length of diagnostic entry text
- in Results
- {namespace} (number) limit your diagnostics to a specific
- namespace
+ {bufnr} (string|number) if nil get diagnostics for all open
+ buffers. Use 0 for current buffer
+ {severity} (string|number) filter diagnostics by severity name
+ (string) or id (number)
+ {severity_limit} (string|number) keep diagnostics equal or more
+ severe wrt severity name (string)
+ or id (number)
+ {severity_bound} (string|number) keep diagnostics equal or less
+ severe wrt severity name (string)
+ or id (number)
+ {root_dir} (string|boolean) if set to string, get diagnostics
+ only for buffers under this dir
+ otherwise cwd
+ {no_unlisted} (boolean) if true, get diagnostics only for
+ listed buffers
+ {no_sign} (boolean) hide DiagnosticSigns from Results
+ (default: false)
+ {line_width} (number) set length of diagnostic entry text
+ in Results
+ {namespace} (number) limit your diagnostics to a
+ specific namespace
diff --git a/lua/telescope/builtin/diagnostics.lua b/lua/telescope/builtin/diagnostics.lua
index 6b13e70..cd9c07f 100644
--- a/lua/telescope/builtin/diagnostics.lua
+++ b/lua/telescope/builtin/diagnostics.lua
@@ -41,13 +41,23 @@ local diagnostics_to_tbl = function(opts)
end
end
+ opts.root_dir = opts.root_dir == true and vim.loop.cwd() or opts.root_dir
+
local bufnr_name_map = {}
- local preprocess_diag = function(diagnostic)
+ local filter_diag = function(diagnostic)
if bufnr_name_map[diagnostic.bufnr] == nil then
bufnr_name_map[diagnostic.bufnr] = vim.api.nvim_buf_get_name(diagnostic.bufnr)
end
- local buffer_diag = {
+ local root_dir_test = not opts.root_dir
+ or string.sub(bufnr_name_map[diagnostic.bufnr], 1, #opts.root_dir) == opts.root_dir
+ local listed_test = not opts.no_unlisted or vim.api.nvim_buf_get_option(diagnostic.bufnr, "buflisted")
+
+ return root_dir_test and listed_test
+ end
+
+ local preprocess_diag = function(diagnostic)
+ return {
bufnr = diagnostic.bufnr,
filename = bufnr_name_map[diagnostic.bufnr],
lnum = diagnostic.lnum + 1,
@@ -55,11 +65,12 @@ local diagnostics_to_tbl = function(opts)
text = vim.trim(diagnostic.message:gsub("[\n]", "")),
type = severities[diagnostic.severity] or severities[1],
}
- return buffer_diag
end
for _, d in ipairs(vim.diagnostic.get(opts.bufnr, diagnosis_opts)) do
- table.insert(items, preprocess_diag(d))
+ if filter_diag(d) then
+ table.insert(items, preprocess_diag(d))
+ end
end
-- sort results by bufnr (prioritize cur buf), severity, lnum
diff --git a/lua/telescope/builtin/init.lua b/lua/telescope/builtin/init.lua
index 05247aa..27f7b60 100644
--- a/lua/telescope/builtin/init.lua
+++ b/lua/telescope/builtin/init.lua
@@ -426,7 +426,7 @@ builtin.lsp_dynamic_workspace_symbols = require_on_exported_call("telescope.buil
--
--
---- Lists diagnostics for current or all open buffers
+--- Lists diagnostics
--- - Fields:
--- - `All severity flags can be passed as `string` or `number` as per `:vim.diagnostic.severity:`
--- - Default keymaps:
@@ -436,6 +436,8 @@ builtin.lsp_dynamic_workspace_symbols = require_on_exported_call("telescope.buil
---@field severity string|number: filter diagnostics by severity name (string) or id (number)
---@field severity_limit string|number: keep diagnostics equal or more severe wrt severity name (string) or id (number)
---@field severity_bound string|number: keep diagnostics equal or less severe wrt severity name (string) or id (number)
+---@field root_dir string|boolean: if set to string, get diagnostics only for buffers under this dir otherwise cwd
+---@field no_unlisted boolean: if true, get diagnostics only for listed buffers
---@field no_sign boolean: hide DiagnosticSigns from Results (default: false)
---@field line_width number: set length of diagnostic entry text in Results
---@field namespace number: limit your diagnostics to a specific namespace