Вы можете попробовать следующий код:
let s:option_values = {'foldmethod' : ['manual', 'indent', 'expr', 'marker', 'syntax'],
\ 'bufhidden' : ['hide', 'unload', 'delete', 'wipe'],
\ 'virtualedit' : ['block', 'insert', 'all', 'onemore'] ,}
set wildcharm=<c-z>
cnoremap <expr> <tab>
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
\ '<c-z>' :
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
function! s:SetComplete(A, L, P) abort
let option = matchstr(a:A, '^.*\ze=')
if !has_key(s:option_values, option)
return
endif
let candidates = copy(s:option_values[option])
call map(candidates, 'option . "=" . v:val')
return filter(candidates, 'v:val =~ "^" . a:A')
endfunction
Сначала он определяет словарь s:option_values, цель которого состоит в том, чтобы содержать ваши параметры (как его ключи) и их значения (как его значения, которые являются списками). Здесь, в качестве примера, 3 варианта + значения запоминаются:
'foldmethod', 'bufhidden', 'virtualedit'.
set wildcharm=<c-z>
Эта строка устанавливает 'wildcharm'опцию и сообщает Vim, что если он видит <c-z>в отображении, он должен активировать wild-меню. Без установки этой опции, если вы пишете <tab>в отображении, он просто вставит буквальный символ табуляции.
cnoremap <expr> <tab>
Начните определение отображения, которое будет вводить оценку выражения всякий раз, когда вы нажимаете <tab>в командной строке.
\ getcmdline() !~# '^\s*set\s\+\w\+=' <bar><bar> wildmenumode() ?
Отображение проверяет, совпадает ли командная строка с шаблоном ^\s*set\s\+\w\+=, который представляет собой строку, следующую за формой set option=, или если подстановочное меню активно.
\ '<c-z>' :
Если предыдущий тест пройден успешно, отображение активирует wildmenu.
\ '<c-u>' . substitute(getcmdline(), 'set', 'Set', '') . '<c-z>'
В противном случае он заменяет системную команду :setнастраиваемой командой :Setи активирует подстановочное меню.
command! -nargs=1 -complete=customlist,s:SetComplete Set exe 'set' <q-args>
Определите пользовательскую команду, :Setкоторая выполняет то же самое :set, за исключением того, что она может использовать пользовательскую функцию завершения, имя которой здесь s:SetComplete().
function! s:SetComplete(A, L, P) abort
Начните определение пользовательской функции завершения.
Он должен возвращать предложения / кандидатов через список.
Команда :Setавтоматически отправит 3 аргумента:
- ведущая часть аргумента в настоящее время завершается (то есть
option=...)
- вся командная строка
- положение курсора в нем
Смотрите :h :command-completion-customlistдля получения дополнительной информации.
let option = matchstr(a:A, '^.*\ze=')
Извлеките имя опции из аргумента, который завершается.
if !has_key(s:option_values, option)
return
endif
Проверьте, optionесть ли в вашем словаре. Если это не так, функция ничего не возвращает.
let candidates = copy(s:option_values[option])
Получить копию списка значений, которые опция может взять из вашего словаря.
call map(candidates, 'option . "=" . v:val')
Для каждого значения в списке candidatesдобавьте строку option=(где optionбудет оцениваться).
return filter(candidates, 'v:val =~ "^" . a:A')
Удалите элементы, candidatesчье начало не соответствует аргументу, который завершен, и верните результат.