aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglepnir <glephunter@gmail.com>2025-01-08 00:09:01 +0800
committerGitHub <noreply@github.com>2025-01-07 08:09:01 -0800
commitb12b91c2743954dbe8599caa60e58e5d74aa4e76 (patch)
tree54c5a31e53e96fa15a2218e6133275796f08b076
parentd9ee0d2984e5fc30cb032785d32f42c72c7e64e1 (diff)
downloadrneovim-b12b91c2743954dbe8599caa60e58e5d74aa4e76.tar.gz
rneovim-b12b91c2743954dbe8599caa60e58e5d74aa4e76.tar.bz2
rneovim-b12b91c2743954dbe8599caa60e58e5d74aa4e76.zip
feat(health): show :checkhealth in floating window #31086
Problem: health can not shown in a floating window Solution: add g:health variable
-rw-r--r--runtime/doc/health.txt11
-rw-r--r--runtime/doc/lsp.txt2
-rw-r--r--runtime/doc/news.txt2
-rw-r--r--runtime/lua/vim/health.lua41
-rw-r--r--runtime/lua/vim/lsp/util.lua8
-rw-r--r--test/functional/plugin/health_spec.lua12
6 files changed, 66 insertions, 10 deletions
diff --git a/runtime/doc/health.txt b/runtime/doc/health.txt
index cb70961b55..bca145bd8e 100644
--- a/runtime/doc/health.txt
+++ b/runtime/doc/health.txt
@@ -21,6 +21,17 @@ To run all healthchecks, use: >vim
<
Plugin authors are encouraged to write new healthchecks. |health-dev|
+ *g:health*
+g:health This global variable controls the behavior and appearance of the
+ `health` floating window. It should be a dictionary containing the
+ following optional keys:
+ - `style`: string? Determines the display style of the `health` window.
+ Set to `'float'` to enable a floating window. Other
+ styles are not currently supported.
+
+ Example: >lua
+ vim.g.health = { style = 'float' }
+
Commands *health-commands*
*:che* *:checkhealth*
diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt
index 71e8a12ca3..16e6abe294 100644
--- a/runtime/doc/lsp.txt
+++ b/runtime/doc/lsp.txt
@@ -2024,7 +2024,7 @@ Lua module: vim.lsp.util *lsp-util*
• {zindex}? (`integer`) override `zindex`, defaults to 50
• {title}? (`string`)
• {title_pos}? (`'left'|'center'|'right'`)
- • {relative}? (`'mouse'|'cursor'`) (default: `'cursor'`)
+ • {relative}? (`'mouse'|'cursor'|'editor'`) (default: `'cursor'`)
• {anchor_bias}? (`'auto'|'above'|'below'`, default: `'auto'`) -
"auto": place window based on which side of the
cursor has more lines
diff --git a/runtime/doc/news.txt b/runtime/doc/news.txt
index 17f85154c2..931f5e117c 100644
--- a/runtime/doc/news.txt
+++ b/runtime/doc/news.txt
@@ -359,6 +359,8 @@ UI
• |vim.diagnostic.setqflist()| updates an existing quickfix list with the
given title if found
• |ui-messages| content chunks now also contain the highlight group ID.
+• |:checkhealth| can be display in a floating window and controlled by
+ the |g:health| variable.
==============================================================================
CHANGED FEATURES *news-changed*
diff --git a/runtime/lua/vim/health.lua b/runtime/lua/vim/health.lua
index 01166628b1..6dc902489f 100644
--- a/runtime/lua/vim/health.lua
+++ b/runtime/lua/vim/health.lua
@@ -11,6 +11,17 @@
--- <
--- Plugin authors are encouraged to write new healthchecks. |health-dev|
---
+--- *g:health*
+--- g:health This global variable controls the behavior and appearance of the
+--- `health` floating window. It should be a dictionary containing the
+--- following optional keys:
+--- - `style`: string? Determines the display style of the `health` window.
+--- Set to `'float'` to enable a floating window. Other
+--- styles are not currently supported.
+---
+--- Example: >lua
+--- vim.g.health = { style = 'float' }
+---
--- Commands *health-commands*
---
--- *:che* *:checkhealth*
@@ -331,13 +342,31 @@ function M._check(mods, plugin_names)
local emptybuf = vim.fn.bufnr('$') == 1 and vim.fn.getline(1) == '' and 1 == vim.fn.line('$')
- -- When no command modifiers are used:
- -- - If the current buffer is empty, open healthcheck directly.
- -- - If not specified otherwise open healthcheck in a tab.
- local buf_cmd = #mods > 0 and (mods .. ' sbuffer') or emptybuf and 'buffer' or 'tab sbuffer'
-
local bufnr = vim.api.nvim_create_buf(true, true)
- vim.cmd(buf_cmd .. ' ' .. bufnr)
+ if
+ vim.g.health
+ and type(vim.g.health) == 'table'
+ and vim.tbl_get(vim.g.health, 'style') == 'float'
+ then
+ local max_height = math.floor(vim.o.lines * 0.8)
+ local max_width = 80
+ local float_bufnr, float_winid = vim.lsp.util.open_floating_preview({}, '', {
+ height = max_height,
+ width = max_width,
+ offset_x = math.floor((vim.o.columns - max_width) / 2),
+ offset_y = math.floor((vim.o.lines - max_height) / 2) - 1,
+ relative = 'editor',
+ })
+ vim.api.nvim_set_current_win(float_winid)
+ vim.bo[float_bufnr].modifiable = true
+ vim.wo[float_winid].list = false
+ else
+ -- When no command modifiers are used:
+ -- - If the current buffer is empty, open healthcheck directly.
+ -- - If not specified otherwise open healthcheck in a tab.
+ local buf_cmd = #mods > 0 and (mods .. ' sbuffer') or emptybuf and 'buffer' or 'tab sbuffer'
+ vim.cmd(buf_cmd .. ' ' .. bufnr)
+ end
if vim.fn.bufexists('health://') == 1 then
vim.cmd.bwipe('health://')
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua
index 89b774816b..5cccb3321f 100644
--- a/runtime/lua/vim/lsp/util.lua
+++ b/runtime/lua/vim/lsp/util.lua
@@ -875,11 +875,13 @@ function M.make_floating_popup_options(width, height, opts)
return {
anchor = anchor,
+ row = row + (opts.offset_y or 0),
col = col + (opts.offset_x or 0),
height = height,
focusable = opts.focusable,
- relative = opts.relative == 'mouse' and 'mouse' or 'cursor',
- row = row + (opts.offset_y or 0),
+ relative = opts.relative == 'mouse' and 'mouse'
+ or opts.relative == 'editor' and 'editor'
+ or 'cursor',
style = 'minimal',
width = width,
border = opts.border or default_border,
@@ -1494,7 +1496,7 @@ end
--- @field title_pos? 'left'|'center'|'right'
---
--- (default: `'cursor'`)
---- @field relative? 'mouse'|'cursor'
+--- @field relative? 'mouse'|'cursor'|'editor'
---
--- - "auto": place window based on which side of the cursor has more lines
--- - "above": place the window above the cursor unless there are not enough lines
diff --git a/test/functional/plugin/health_spec.lua b/test/functional/plugin/health_spec.lua
index 753da64522..406b5c3c16 100644
--- a/test/functional/plugin/health_spec.lua
+++ b/test/functional/plugin/health_spec.lua
@@ -66,6 +66,18 @@ describe(':checkhealth', function()
eq({}, getcompletion('', 'checkhealth'))
assert_alive()
end)
+
+ it('vim.g.health', function()
+ clear()
+ command("let g:health = {'style':'float'}")
+ command('checkhealth lsp')
+ eq(
+ 'editor',
+ exec_lua([[
+ return vim.api.nvim_win_get_config(0).relative
+ ]])
+ )
+ end)
end)
describe('vim.health', function()