Сопоставить последовательность букв в режиме вставки

11

Я уже могу сопоставить комбинацию клавиш в режиме вставки:

:inoremap abc <do stuff>

Однако у этого есть несколько недостатков:

  • При вводе частичной версии последовательности, такой как abсимволы, фактически не отображаются в течение короткого промежутка времени, так как «ждет», чтобы увидеть, собираетесь ли вы вводить полную команду. Это нежелательно; Я хочу отобразить цепочку букв без остановки, если введена частичная подстрока цепочки.

  • Если я печатаю ab, то делаю паузу (и подожду, пока символы действительно появятся, как указано выше), а затем введите c, команда не выполняется. Я хочу, чтобы команда выполнялась независимо от того, как долго я жду.

Я бы использовал iab, но это не работает, потому что:

  1. Она требует ввода пробела после строки
  2. Я не могу выполнить произвольные команды с ним, только вставить строку текста.

Есть ли способ выполнить команду или нажатия клавиш, если определенная строка введена в режиме вставки, без использования карты (которая будет раздражающе приостанавливаться каждый раз, когда я набираю, aи не будет работать, если я буду ждать слишком долго)?

Дверная ручка
источник
Эти drawbbacks также верно для :cnoremap abc <do stuff>...
Мартин Tournoij
1
Там нет задержки, когда вы делаете ab<any key>.
romainl

Ответы:

10

Вот один из способов сделать это:

let s:inputBuffer = ''

augroup _silentInsertTrigger
    autocmd!
    autocmd InsertCharPre * call <sid>OnPreEnterChar()
    autocmd InsertLeave * call <sid>OnInsertLeave()
augroup END

function! s:OnPreEnterChar()
    let s:inputBuffer .= v:char

    if s:inputBuffer[-3:] ==# 'abc'
        echo '<do stuff>'
    endif

    return v:char
endfunction

function! s:OnInsertLeave()
    let s:inputBuffer = ''
endfunction
Стив Вермейлен
источник