mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +00:00 
			
		
		
		
	fix(api): nvim__complete_set requires completeopt=popup #31177
Problem: If completeopt does not include "popup" flag, nvim__complete_set still auto-creates a floating preview window. Solution: Fail if completeopt does not include the "popup" flag.
This commit is contained in:
		| @@ -44,6 +44,7 @@ | |||||||
| #include "nvim/highlight.h" | #include "nvim/highlight.h" | ||||||
| #include "nvim/highlight_defs.h" | #include "nvim/highlight_defs.h" | ||||||
| #include "nvim/highlight_group.h" | #include "nvim/highlight_group.h" | ||||||
|  | #include "nvim/insexpand.h" | ||||||
| #include "nvim/keycodes.h" | #include "nvim/keycodes.h" | ||||||
| #include "nvim/log.h" | #include "nvim/log.h" | ||||||
| #include "nvim/lua/executor.h" | #include "nvim/lua/executor.h" | ||||||
| @@ -2255,9 +2256,13 @@ void nvim_error_event(uint64_t channel_id, Integer lvl, String data) | |||||||
| /// @return Dict containing these keys: | /// @return Dict containing these keys: | ||||||
| ///       - winid: (number) floating window id | ///       - winid: (number) floating window id | ||||||
| ///       - bufnr: (number) buffer id in floating window | ///       - bufnr: (number) buffer id in floating window | ||||||
| Dict nvim__complete_set(Integer index, Dict(complete_set) *opts, Arena *arena) | Dict nvim__complete_set(Integer index, Dict(complete_set) *opts, Arena *arena, Error *err) | ||||||
| { | { | ||||||
|   Dict rv = arena_dict(arena, 2); |   Dict rv = arena_dict(arena, 2); | ||||||
|  |   if ((get_cot_flags() & kOptCotFlagPopup) == 0) { | ||||||
|  |     api_set_error(err, kErrorTypeException, "completeopt option does not include popup"); | ||||||
|  |     return rv; | ||||||
|  |   } | ||||||
|   if (HAS_KEY(opts, complete_set, info)) { |   if (HAS_KEY(opts, complete_set, info)) { | ||||||
|     win_T *wp = pum_set_info((int)index, opts->info.data); |     win_T *wp = pum_set_info((int)index, opts->info.data); | ||||||
|     if (wp) { |     if (wp) { | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ local fn = n.fn | |||||||
| local command = n.command | local command = n.command | ||||||
| local api = n.api | local api = n.api | ||||||
| local poke_eventloop = n.poke_eventloop | local poke_eventloop = n.poke_eventloop | ||||||
|  | local exec_lua = n.exec_lua | ||||||
|  |  | ||||||
| describe('completion', function() | describe('completion', function() | ||||||
|   local screen |   local screen | ||||||
| @@ -1326,4 +1327,29 @@ describe('completion', function() | |||||||
|       ]], |       ]], | ||||||
|     }) |     }) | ||||||
|   end) |   end) | ||||||
|  |  | ||||||
|  |   describe('nvim__complete_set', function() | ||||||
|  |     it("fails when 'completeopt' does not include popup", function() | ||||||
|  |       exec_lua([[ | ||||||
|  |         function _G.omni_test(findstart, base) | ||||||
|  |           if findstart == 1 then | ||||||
|  |             return vim.fn.col('.') - 1 | ||||||
|  |           end | ||||||
|  |           return { { word = 'one' } } | ||||||
|  |         end | ||||||
|  |         vim.api.nvim_create_autocmd('CompleteChanged', { | ||||||
|  |           callback = function() | ||||||
|  |             local ok, err = pcall(vim.api.nvim__complete_set, 0, { info = '1info' }) | ||||||
|  |             if not ok then | ||||||
|  |               vim.g.err_msg = err | ||||||
|  |             end | ||||||
|  |           end, | ||||||
|  |         }) | ||||||
|  |         vim.opt.completeopt = 'menu,menuone' | ||||||
|  |         vim.opt.omnifunc = 'v:lua.omni_test' | ||||||
|  |       ]]) | ||||||
|  |       feed('S<C-X><C-O>') | ||||||
|  |       eq('completeopt option does not include popup', api.nvim_get_var('err_msg')) | ||||||
|  |     end) | ||||||
|  |   end) | ||||||
| end) | end) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 glepnir
					glepnir