From 7b9c063d116064bb0765c76277fe210c7ac01d0c Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 27 Sep 2025 09:09:03 +0800 Subject: vim-patch:9.1.1797: completion: autocompletion can be improved Problem: completion: autocompletion can be improved Solution: Add support for "longest" and "preinsert" in 'autocomplete'; add preinserted() (Girish Palya) * Add support for "longest" in 'completeopt' when 'autocomplete' is enabled. (Note: the cursor position does not change automatically when 'autocomplete' is enabled.) * Add support for "preinsert" when 'autocomplete' is enabled. Ensure "preinsert" works the same with and without 'autocomplete' * introduce the preinserted() Vim script function, useful for defining custom key mappings. fixes: vim/vim#18314 closes: vim/vim#18387 https://github.com/vim/vim/commit/c05335082adb21d99d96374779856444a3a0688f Co-authored-by: Girish Palya --- runtime/lua/vim/_meta/options.lua | 42 ++++++++++++++++++++++++--------------- runtime/lua/vim/_meta/vimfn.lua | 8 ++++++++ 2 files changed, 34 insertions(+), 16 deletions(-) (limited to 'runtime/lua/vim') diff --git a/runtime/lua/vim/_meta/options.lua b/runtime/lua/vim/_meta/options.lua index 6323d11d4c..4adad760e9 100644 --- a/runtime/lua/vim/_meta/options.lua +++ b/runtime/lua/vim/_meta/options.lua @@ -1183,11 +1183,22 @@ vim.go.cia = vim.go.completeitemalign --- to gather more alternatives for your candidate list, --- see 'completefuzzycollect'. --- ---- longest Only insert the longest common text of the matches. If ---- the menu is displayed you can use CTRL-L to add more ---- characters. Whether case is ignored depends on the kind ---- of completion. For buffer text the 'ignorecase' option is ---- used. +--- longest +--- When 'autocomplete' is not active, only the longest +--- common prefix of the matches is inserted. If the popup +--- menu is displayed, you can use CTRL-L to add more +--- characters. Whether case is ignored depends on the type +--- of completion. For buffer text the 'ignorecase' option +--- applies. +--- +--- When 'autocomplete' is active and no completion item is +--- selected, the longest common prefix of the matches is +--- inserted after the cursor. The prefix is taken either +--- from all displayed items or only from items in the current +--- buffer. The inserted text is highlighted with +--- `hl-PreInsert`, and the cursor position does not change +--- (similar to `"preinsert"`). Press CTRL-Y to accept. +--- See also `preinserted()`. --- --- menu Use a popup menu to show the possible completions. The --- menu is only shown when there is more than one match and @@ -1220,22 +1231,21 @@ vim.go.cia = vim.go.completeitemalign --- with "menu" or "menuone". Overrides "preview". --- --- preinsert ---- When 'autocomplete' is not active, inserts the part of the ---- first candidate word beyond the current completion leader, ---- highlighted with `hl-PreInsert`. The cursor doesn't move. ---- Requires "fuzzy" unset and "menuone" in 'completeopt'. ---- ---- When 'autocomplete' is active, inserts the longest common ---- prefix of matches (from all shown items or from the ---- current buffer items). This occurs only when no menu item ---- is selected. Press CTRL-Y to accept. +--- Inserts the text of the first completion candidate +--- beyond the current leader, highlighted with `hl-PreInsert`. +--- The cursor does not move. +--- Requires "fuzzy" to be unset, and either "menuone" in +--- 'completeopt' or 'autocomplete' enabled. When +--- 'autocomplete' is enabled, this does not work if +--- 'ignorecase' is set without 'infercase'. +--- See also `preinserted()`. --- --- preview Show extra information about the currently selected --- completion in the preview window. Only works in --- combination with "menu" or "menuone". --- ---- Only "fuzzy", "popup", "preinsert" and "preview" have an effect when ---- 'autocomplete' is enabled. +--- Only "fuzzy", "longest", "popup", "preinsert" and "preview" have an +--- effect when 'autocomplete' is enabled. --- --- This option does not apply to `cmdline-completion`. See 'wildoptions' --- for that. diff --git a/runtime/lua/vim/_meta/vimfn.lua b/runtime/lua/vim/_meta/vimfn.lua index 4302c3d689..4b50b90f65 100644 --- a/runtime/lua/vim/_meta/vimfn.lua +++ b/runtime/lua/vim/_meta/vimfn.lua @@ -6554,6 +6554,14 @@ function vim.fn.perleval(expr) end --- @return number function vim.fn.pow(x, y) end +--- Returns non-zero if text has been inserted after the cursor +--- because "preinsert" is present in 'completeopt', or if +--- "longest" is present in 'completeopt' while 'autocomplete' +--- is enabled. Otherwise returns zero. +--- +--- @return number +function vim.fn.preinserted() end + --- Return the line number of the first line at or above {lnum} --- that is not blank. Example: >vim --- let ind = indent(prevnonblank(v:lnum - 1)) -- cgit From e6b2255ac784913ff7da1ea670d28d3ba850f3a8 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 29 Sep 2025 06:17:37 +0800 Subject: vim-patch:4edaf89: runtime(doc): improve preinserted() doc Change the second "if" to "because", otherwise it may be misinterpreted that preinserted() can return non-zero just because these options are set. closes: vim/vim#18409 https://github.com/vim/vim/commit/4edaf8923335504c31810dc4c5213eaba84e7898 --- runtime/lua/vim/_meta/vimfn.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'runtime/lua/vim') diff --git a/runtime/lua/vim/_meta/vimfn.lua b/runtime/lua/vim/_meta/vimfn.lua index 4b50b90f65..830882c9c1 100644 --- a/runtime/lua/vim/_meta/vimfn.lua +++ b/runtime/lua/vim/_meta/vimfn.lua @@ -6555,9 +6555,9 @@ function vim.fn.perleval(expr) end function vim.fn.pow(x, y) end --- Returns non-zero if text has been inserted after the cursor ---- because "preinsert" is present in 'completeopt', or if +--- because "preinsert" is present in 'completeopt', or because --- "longest" is present in 'completeopt' while 'autocomplete' ---- is enabled. Otherwise returns zero. +--- is active. Otherwise returns zero. --- --- @return number function vim.fn.preinserted() end -- cgit