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


11

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

:inoremap abc <do stuff>

Однак у цього є кілька недоліків:

  • Під час введення часткової версії послідовності, наприклад ab, символи фактично не відображаються протягом короткого часу, оскільки він "чекає", щоб побачити, чи збираєтесь ви вводити повну команду. Це небажано; Я хочу зіставити ланцюжок літер без пауз, якщо введено часткову підрядку ланцюжка.

  • Якщо я набираю ab, то зробіть паузу (і дочекайтеся, коли символи дійсно з’являться, як зазначено у вищевказаній точці), а потім наберіть команду c, команда не виконується. Я хочу, щоб команда виконувалася незалежно від того, як довго я чекаю.

Я б використовував iab, але це не працює, оскільки:

  1. Це вимагає введення пробілу після рядка
  2. Я не можу виконувати з ним довільні команди, лише вставляю рядок тексту.

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


Ці недоліки стосуються і :cnoremap abc <do stuff>...
Мартін Турной

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.