Автозаполнение для значений параметров в cmdline

10

Я не могу сосчитать, сколько раз я пытался это сделать:

:set foldmethod=syn^I

Кажется, что завершение не работает на значениях опций!

В некоторых случаях параметры представляют собой сложные строки, в которых завершение может не иметь смысла. (Например 'comments')

Но были ли предприняты какие-либо попытки обеспечить завершение wildchar для общих случаев использования?

Если нет, то как я могу заставить приведенный выше пример работать? (Предполагая, что я хочу завершить одну из строк ['manual', 'indent', 'expr', 'marker', 'syntax'].)

joeytwiddle
источник

Ответы:

3

Вы можете попробовать следующий код:

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чье начало не соответствует аргументу, который завершен, и верните результат.

user9433424
источник
2

AFAIK, мы не можем добавить cmdline-дополнение к встроенным командам, которые его не предоставляют. Либо мы «перезаписываем» команду другой, которая будет поддерживать завершение (здесь вы можете указать :Setс большой буквы S), либо мы взломаем исходный код vim, чтобы добавить то, что отсутствует.

Люк Эрмитт
источник