Mapear uma sequência de letras no modo de inserção

11

Já posso mapear uma combinação de teclas no modo de inserção:

:inoremap abc <do stuff>

No entanto, isso tem algumas desvantagens:

  • Ao digitar uma versão parcial da sequência, como, por exemplo ab, os caracteres não são exibidos por um curto período de tempo, pois está "aguardando" para ver se você digitará o comando completo. Isso é indesejável; Quero mapear uma cadeia de letras sem pausar se uma substring parcial da cadeia for inserida.

  • Se eu digitar ab, faça uma pausa (e aguarde até que os caracteres realmente apareçam conforme mencionado no ponto acima) e digite co comando não é executado. Quero que o comando seja executado, não importa quanto tempo espere.

Eu usaria um iab, mas isso não funciona porque:

  1. Requer a inserção de um espaço após a sequência
  2. Não consigo executar comandos arbitrários com ele, apenas insiro uma sequência de texto.

Existe alguma maneira de executar um comando ou pressionamento de tecla se uma certa string for inserida no modo de inserção, sem usar um mapa (que será pausado irritantemente toda vez que eu digitar um ae não funcionará se eu esperar muito)?

Maçaneta
fonte
Estes drawbbacks também são verdadeiras para :cnoremap abc <do stuff>...
Martin Tournoij
1
Não há demora quando você faz ab<any key>.
precisa saber é o seguinte

Respostas:

10

Aqui está uma maneira de fazer isso:

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
fonte