Вы можете попробовать следующий код:
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
чье начало не соответствует аргументу, который завершен, и верните результат.