feat(health): fold successful healthchecks #22866

Problem:
checkhealth can be noisy, but we don't want to omit info.

Solution:
Fold OK results by default, if 'foldenable' is enabled.
Resolves #22796
This commit is contained in:
Alexandre Teoi 2023-06-06 12:42:26 -03:00 committed by GitHub
parent 9d9af4fe27
commit 4382d2ed56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 57 additions and 1 deletions

View File

@ -106,6 +106,9 @@ The following changes to existing APIs or features add new behavior.
• `:source` without arguments treats a buffer with its 'filetype' set to "lua" • `:source` without arguments treats a buffer with its 'filetype' set to "lua"
as Lua code regardless of its extension. as Lua code regardless of its extension.
• |:checkhealth| buffer now implements |folding|. The initial folding status is
defined by the 'foldenable' option.
============================================================================== ==============================================================================
REMOVED FEATURES *news-removed* REMOVED FEATURES *news-removed*

View File

@ -9,6 +9,9 @@ endif
runtime! ftplugin/help.vim runtime! ftplugin/help.vim
setlocal wrap breakindent linebreak setlocal wrap breakindent linebreak
setlocal foldexpr=getline(v:lnum-1)=~'^=\\{78}$'?'>1':(getline(v:lnum)=~'^=\\{78}'?0:'=')
setlocal foldmethod=expr
setlocal foldtext=v:lua.require('vim.health').foldtext()
let &l:iskeyword='!-~,^*,^|,^",192-255' let &l:iskeyword='!-~,^*,^|,^",192-255'
if exists("b:undo_ftplugin") if exists("b:undo_ftplugin")

View File

@ -2,6 +2,40 @@ local M = {}
local s_output = {} local s_output = {}
-- Returns the fold text of the current healthcheck section
function M.foldtext()
local foldtext = vim.fn.foldtext()
if vim.bo.filetype ~= 'checkhealth' then
return foldtext
end
if vim.b.failedchecks == nil then
vim.b.failedchecks = vim.empty_dict()
end
if vim.b.failedchecks[foldtext] == nil then
local warning = '- WARNING '
local warninglen = string.len(warning)
local err = '- ERROR '
local errlen = string.len(err)
local failedchecks = vim.b.failedchecks
failedchecks[foldtext] = false
local foldcontent = vim.api.nvim_buf_get_lines(0, vim.v.foldstart - 1, vim.v.foldend, false)
for _, line in ipairs(foldcontent) do
if string.sub(line, 1, warninglen) == warning or string.sub(line, 1, errlen) == err then
failedchecks[foldtext] = true
break
end
end
vim.b.failedchecks = failedchecks
end
return vim.b.failedchecks[foldtext] and '+WE' .. foldtext:sub(4) or foldtext
end
-- From a path return a list [{name}, {func}, {type}] representing a healthcheck -- From a path return a list [{name}, {func}, {type}] representing a healthcheck
local function filepath_to_healthcheck(path) local function filepath_to_healthcheck(path)
path = vim.fs.normalize(path) path = vim.fs.normalize(path)

View File

@ -136,7 +136,7 @@ describe('health.vim', function()
Bar = { foreground = Screen.colors.LightGrey, background = Screen.colors.DarkGrey }, Bar = { foreground = Screen.colors.LightGrey, background = Screen.colors.DarkGrey },
}) })
command("checkhealth foo success1") command("checkhealth foo success1")
command("set nowrap laststatus=0") command("set nofoldenable nowrap laststatus=0")
screen:expect{grid=[[ screen:expect{grid=[[
^ | ^ |
{Bar:}| {Bar:}|
@ -153,6 +153,22 @@ describe('health.vim', function()
]]} ]]}
end) end)
it("fold healthchecks", function()
local screen = Screen.new(50, 7)
screen:attach()
command("checkhealth foo success1")
command("set nowrap laststatus=0")
screen:expect{grid=[[
^ |
|
+WE 4 lines: foo: ·······························|
|
+-- 8 lines: test_plug.success1: require("test_pl|
~ |
|
]]}
end)
it("gracefully handles invalid healthcheck", function() it("gracefully handles invalid healthcheck", function()
command("checkhealth non_existent_healthcheck") command("checkhealth non_existent_healthcheck")
-- luacheck: ignore 613 -- luacheck: ignore 613