Я думаю, что Vim прекращает обрабатывать правую часть сопоставления, как только нажимает z=
, потому что это не полная команда (для ее завершения необходимо указать индекс предложения в меню),Команда :normal
имеет ту же проблему:
:norm[al][!] {commands}
...
{commands}
должна быть полной командой.Если {commands}
не завершает команду, последняя будет прервана, как если бы был набран <Esc>
или <C-C>
.
В качестве альтернативы, вы можете вызвать функцию feedkeys()
длянажмите z=
.Например:
ino <c-j> <c-r>=<sid>fix_typo()<cr>
fu! s:fix_typo() abort
let spell_save = &l:spell
try
setl spell
call feedkeys("\e\e[sz=", 'int')
augroup fix_typo
au!
au TextChanged * call feedkeys('`]a', 'int')
\ | exe 'au! fix_typo'
\ | aug! fix_typo
augroup END
finally
call timer_start(0, {-> execute('let &l:spell = '.spell_save)})
endtry
return ''
endfu
Этот код устанавливает отображение в режиме вставки с помощью клавиши C-j
.Вы можете использовать другую клавишу, если она вам не нравится.
Отображение вызывает функцию s:fix_typo()
, которая:
- временно включает
'spell'
, чтобы избежать ошибки E756
- нажимает клавиши
Esc Esc [s z=
, чтобы запросить подсказки - устанавливает однократную автоматическую команду прослушивания
TextChanged
для нажатия клавиш `]a
после выбора слова вменю - восстанавливает исходное значение
'spell'