Asigna una secuencia de letras en modo de inserción

11

Ya puedo asignar una combinación de teclas en modo de inserción:

:inoremap abc <do stuff>

Sin embargo, esto tiene algunos inconvenientes:

  • Al escribir una versión parcial de la secuencia, por ejemplo ab, los caracteres no se muestran realmente durante un corto período de tiempo, ya que está "esperando" para ver si va a escribir el comando completo. Esto es indeseable; Quiero mapear una cadena de letras sin pausa si se ingresa una subcadena parcial de la cadena.

  • Si escribo ab, pause (y espere hasta que los caracteres realmente aparezcan como se menciona en el punto anterior), luego escriba c, el comando no se ejecuta. Quiero que el comando se ejecute sin importar cuánto tiempo espere.

Usaría un iab, pero eso no funciona porque:

  1. Requiere ingresar un espacio después de la cadena
  2. No puedo ejecutar comandos arbitrarios con él, solo inserto una cadena de texto.

¿Hay alguna forma de ejecutar un comando o una pulsación de tecla si se ingresa una determinada cadena en modo de inserción, sin usar un mapa (que se detendrá molestamente cada vez que escribo ay no funciona si espero demasiado)?

Perilla de la puerta
fuente
Estos inconvenientes también son ciertos para :cnoremap abc <do stuff>...
Martin Tournoij
1
No hay demora cuando lo haces ab<any key>.
romainl

Respuestas:

10

Aquí hay una manera de hacer eso:

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
Steve Vermeulen
fuente