mirror of
https://github.com/neovim/neovim
synced 2025-07-17 01:31:48 +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