Я пытаюсь улучшить старую функцию завершения. Я бы хотел, чтобы он обновлял варианты, отображаемые во всплывающем меню, по мере ввода новых символов
Моя функция завершения
function! lh#icomplete#ecm(findstart, base) abort
if a:findstart
let l = getline('.')
let startcol = match(l[0:col('.')-1], '\v\S+$')
if startcol == -1
let startcol = col('.')-1
endif
" let g:debug+= ["findstart(".a:base.") -> ".(startcol)]
return startcol
else
" let g:debug += ["matching(".a:base.")"]
let words = ['un', 'deux', 'trois', 'trente-deux', 'unité']
call filter(words, 'v:val =~ a:base')
" return { 'words' : words}
return { 'words' : words, 'refresh' : 'always'}
endif
endfunction
Что я использую с
:set completefunc=lh#icomplete#ecm
:inoremap µ <c-x><c-u><c-p>
Из моего понимания документации, факта, который я использую <c-p>
, я перехожу в третье состояние (согласно | ins-завершению-меню |), и когда я набираю «любой печатный, не белый символ», я должен иметь возможность «Добавить» этот символ и уменьшит количество совпадений. "
Когда я печатаю в режиме вставки uµ
, меню завершения появляется, как и ожидалось. Увы, когда я печатаю x
(сразу после µ
), я не в режиме завершения и ux
это то, что я получаю в своем буфере.
Что я сделал неправильно или пропустил в документации?
NB: я видел, что без refresh=always
, результаты фильтруются, за исключением того, что я хотел бы снова вызвать функцию, чтобы применить пользовательский фильтр.
(На всякий случай я использую gvim 7.4-908)
источник
Ответы:
После дальнейших исследований (и некоторого реверс-инжиниринга).
Я не могу объяснить, почему завершение не строго следует документации. Я должен спросить на vim_dev, я думаю.
В любом случае, кажется, что способ сделать это состоит в регистрации слушателя,
CursorMovedI
который будет запускать завершение снова каждый раз, когда вставляется символ.Сложность состоит в том, чтобы знать, когда остановиться.
CompletionDone
бесполезно, так как будет срабатывать после каждого нажатия клавиши.InsertLeave
хорошее начало, но оно не охватывает все случаи, т.е.Я не нашел другого выхода, кроме как переопределить
<cr>
, и<c-y>
.Другие трудности заключаются в обнаружении того, когда ничего не изменилось, чтобы избежать бесконечных циклов и так далее.
В любом случае, вот мой текущий код (который будет использоваться в других плагинах). Последняя версия будет сохранена здесь . Это довольно долго, но вот оно:
Который может быть использован с:
Вы должны быть в состоянии наблюдать (косвенно) результат, примененный к выбору фрагментов C ++ для моего плагина расширителя шаблонов на этом скриншоте .
источник