Использование "z =" в отображении - PullRequest
0 голосов
/ 27 ноября 2018

Если я использую <Esc>[s1z=`]a в отображении inoremap (перейти в нормальный режим, найти предыдущую орфографическую ошибку, заменить ее первым выбором, вернуться к последнему редактированию и добавить), все работает нормально.Проблема в том, что я часто не хочу первого выбора правописания.Если я уберу 1 , мне будет предложено меню правописания, но `]a, похоже, проглотит меня и высадит меня на первом символе исправленного слова, все еще находящегося в обычном режиме.Само отображение не должно искать ввод, как таковой, поскольку сам z= должен обрабатывать пункт меню.Действительно, если я запускаю эти команды вручную (без 1 , это работает как ожидалось. Я попытался сделать именованные метки и вернуться к ним, но кажется, что z= и все после того, как это будет использовано как одна вещьКто-нибудь есть какие-либо предложения о том, как продолжить отображение после того, как я сделаю выбор в меню правописания? Спасибо.

1 Ответ

0 голосов
/ 28 ноября 2018

Я думаю, что 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...