mirror of
https://github.com/neovim/neovim.git
synced 2025-09-27 21:48:35 +00:00
vim-patch:9.1.1341: cannot define completion triggers
Problem: Cannot define completion triggers and act upon it
Solution: add the new option 'isexpand' and add the complete_match()
function to return the completion matches according to the
'isexpand' setting (glepnir)
Currently, completion trigger position is determined solely by the
'iskeyword' pattern (\k\+$), which causes issues when users need
different completion behaviors - such as triggering after '/' for
comments or '.' for methods. Modifying 'iskeyword' to include these
characters has undesirable side effects on other Vim functionality that
relies on keyword definitions.
Introduce a new buffer-local option 'isexpand' that allows specifying
different completion triggers and add the complete_match() function that
finds the appropriate start column for completion based on these
triggers, scanning backwards from cursor position.
This separation of concerns allows customized completion behavior
without affecting iskeyword-dependent features. The option's
buffer-local nature enables per-filetype completion triggers.
closes: vim/vim#16716
bcd5995b40
Co-authored-by: glepnir <glephunter@gmail.com>
This commit is contained in:
@@ -1477,6 +1477,59 @@ M.funcs = {
|
||||
returns = 'table',
|
||||
signature = 'complete_info([{what}])',
|
||||
},
|
||||
complete_match = {
|
||||
args = { 0, 2 },
|
||||
base = 0,
|
||||
desc = [=[
|
||||
Returns a List of matches found according to the 'isexpand'
|
||||
option. Each match is represented as a List containing
|
||||
[startcol, trigger_text] where:
|
||||
- startcol: column position where completion should start,
|
||||
or -1 if no trigger position is found. For multi-character
|
||||
triggers, returns the column of the first character.
|
||||
- trigger_text: the matching trigger string from 'isexpand',
|
||||
or empty string if no match was found or when using the
|
||||
default 'iskeyword' pattern.
|
||||
|
||||
When 'isexpand' is empty, uses the 'iskeyword' pattern
|
||||
"\k\+$" to find the start of the current keyword.
|
||||
|
||||
When no arguments are provided, uses the current cursor
|
||||
position.
|
||||
|
||||
Examples: >
|
||||
set isexpand=.,->,/,/*,abc
|
||||
func CustomComplete()
|
||||
let res = complete_match()
|
||||
if res->len() == 0 | return | endif
|
||||
let [col, trigger] = res[0]
|
||||
let items = []
|
||||
if trigger == '/*'
|
||||
let items = ['/** */']
|
||||
elseif trigger == '/'
|
||||
let items = ['/*! */', '// TODO:', '// fixme:']
|
||||
elseif trigger == '.'
|
||||
let items = ['length()']
|
||||
elseif trigger =~ '^\->'
|
||||
let items = ['map()', 'reduce()']
|
||||
elseif trigger =~ '^\abc'
|
||||
let items = ['def', 'ghk']
|
||||
endif
|
||||
if items->len() > 0
|
||||
let startcol = trigger =~ '^/' ? col : col + len(trigger)
|
||||
call complete(startcol, items)
|
||||
endif
|
||||
endfunc
|
||||
inoremap <Tab> <Cmd>call CustomComplete()<CR>
|
||||
<
|
||||
|
||||
Return type: list<list<any>>
|
||||
]=],
|
||||
name = 'complete_match',
|
||||
params = { { 'lnum', 'integer?' }, { 'col', 'integer?' } },
|
||||
returns = 'table',
|
||||
signature = 'complete_match([{lnum}, {col}])',
|
||||
},
|
||||
confirm = {
|
||||
args = { 1, 4 },
|
||||
base = 1,
|
||||
|
Reference in New Issue
Block a user