mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	fix(health): floating window closes when opening TOC (gO)
fix(health): floating window closes when opening TOC (gO) #34794
Problem: Health check floating window gets closed when pressing 'gO' to show TOC because LSP floating preview system auto-closes on BufEnter events triggered by :lopen.
Solution: Temporarily disable BufEnter event for the current window during TOC operations and adjust window layout to prevent overlap.
(cherry picked from commit 28b7c2df52)
Co-authored-by: glepnir <glephunter@gmail.com>
			
			
This commit is contained in:
		![175700243+neovim-backports[bot]@users.noreply.github.com](/assets/img/avatar_default.png) neovim-backports[bot]
					neovim-backports[bot]
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							2ddb5d21bb
						
					
				
				
					commit
					c97ad3cb41
				
			| @@ -1,5 +1,5 @@ | ||||
| vim.keymap.set('n', 'gO', function() | ||||
|   require('vim.treesitter._headings').show_toc() | ||||
|   require('vim.treesitter._headings').show_toc(6) | ||||
| end, { buffer = 0, silent = true, desc = 'Show an Outline of the current buffer' }) | ||||
|  | ||||
| vim.keymap.set('n', ']]', function() | ||||
|   | ||||
| @@ -389,15 +389,17 @@ function M._check(mods, plugin_names) | ||||
|     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 available_lines = vim.o.lines - 12 | ||||
|     local max_height = math.min(math.floor(vim.o.lines * 0.8), available_lines) | ||||
|     local max_width = 80 | ||||
|     local float_winid | ||||
|     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, | ||||
|       offset_y = math.floor((available_lines - max_height) / 2), | ||||
|       relative = 'editor', | ||||
|       close_events = {}, | ||||
|     }) | ||||
|     vim.api.nvim_set_current_win(float_winid) | ||||
|     vim.bo[bufnr].modifiable = true | ||||
|   | ||||
| @@ -1349,10 +1349,17 @@ local function close_preview_autocmd(events, winnr, bufnrs) | ||||
|  | ||||
|   -- close the preview window when entered a buffer that is not | ||||
|   -- the floating window buffer or the buffer that spawned it | ||||
|   api.nvim_create_autocmd('BufEnter', { | ||||
|   api.nvim_create_autocmd('BufLeave', { | ||||
|     group = augroup, | ||||
|     buffer = bufnrs[1], | ||||
|     callback = function() | ||||
|       vim.schedule(function() | ||||
|         -- When jumping to the quickfix window from the preview window, | ||||
|         -- do not close the preview window. | ||||
|         if api.nvim_get_option_value('filetype', { buf = 0 }) ~= 'qf' then | ||||
|           close_preview_window(winnr, bufnrs) | ||||
|         end | ||||
|       end) | ||||
|     end, | ||||
|   }) | ||||
|  | ||||
|   | ||||
| @@ -83,8 +83,9 @@ local get_headings = function(bufnr) | ||||
|   return headings | ||||
| end | ||||
|  | ||||
| --- @param qf_height? integer height of loclist window | ||||
| --- Shows an Outline (table of contents) of the current buffer, in the loclist. | ||||
| function M.show_toc() | ||||
| function M.show_toc(qf_height) | ||||
|   local bufnr = api.nvim_get_current_buf() | ||||
|   local bufname = api.nvim_buf_get_name(bufnr) | ||||
|   local headings = get_headings(bufnr) | ||||
| @@ -102,7 +103,7 @@ function M.show_toc() | ||||
|   end | ||||
|   vim.fn.setloclist(0, headings, ' ') | ||||
|   vim.fn.setloclist(0, {}, 'a', { title = 'Table of contents' }) | ||||
|   vim.cmd.lopen() | ||||
|   vim.cmd.lopen({ count = qf_height }) | ||||
|   vim.w.qf_toc = bufname | ||||
|   -- reload syntax file after setting qf_toc variable | ||||
|   vim.bo.filetype = 'qf' | ||||
|   | ||||
| @@ -68,7 +68,10 @@ describe(':checkhealth', function() | ||||
|   end) | ||||
|  | ||||
|   it('vim.g.health', function() | ||||
|     clear() | ||||
|     clear { | ||||
|       args_rm = { '-u' }, | ||||
|       args = { '--clean', '+set runtimepath+=test/functional/fixtures' }, | ||||
|     } | ||||
|     command("let g:health = {'style':'float'}") | ||||
|     command('checkhealth lsp') | ||||
|     eq( | ||||
| @@ -77,6 +80,14 @@ describe(':checkhealth', function() | ||||
|       return vim.api.nvim_win_get_config(0).relative | ||||
|     ]]) | ||||
|     ) | ||||
|  | ||||
|     -- gO should not close the :checkhealth floating window. #34784 | ||||
|     command('checkhealth full_render') | ||||
|     local win = api.nvim_get_current_win() | ||||
|     api.nvim_win_set_cursor(win, { 5, 1 }) | ||||
|     n.feed('gO') | ||||
|     eq(true, api.nvim_win_is_valid(win)) | ||||
|     eq('qf', api.nvim_get_option_value('filetype', { buf = 0 })) | ||||
|   end) | ||||
|  | ||||
|   it("vim.provider works with a misconfigured 'shell'", function() | ||||
|   | ||||
		Reference in New Issue
	
	Block a user