Mappa una sequenza di lettere in modalità inserimento


11

Posso già mappare una combinazione di tasti in modalità inserimento:

:inoremap abc <do stuff>

Tuttavia, ciò presenta alcuni inconvenienti:

  • Quando si digita una versione parziale della sequenza, ad esempio ab, i caratteri non vengono effettivamente visualizzati per un breve periodo di tempo, poiché è "in attesa" per vedere se si sta per digitare il comando completo. Questo è indesiderabile; Voglio mappare una catena di lettere senza mettere in pausa se viene inserita una sottostringa parziale della catena.

  • Se scrivo ab, quindi metto in pausa (e aspetto che i caratteri appaiano effettivamente come indicato nel punto precedente), quindi digito il c, il comando non viene eseguito. Voglio che il comando venga eseguito, indipendentemente da quanto tempo aspetto.

Vorrei usare un iab, ma non funziona perché:

  1. Richiede l'immissione di uno spazio dopo la stringa
  2. Non posso eseguire comandi arbitrari con esso, inserire solo una stringa di testo.

Esiste un modo per eseguire un comando o sequenze di tasti se viene immessa una determinata stringa in modalità di inserimento, senza utilizzare una mappa (che si fermerà in modo fastidioso ogni volta che scrivo un ae non funziona se aspetto troppo a lungo)?


Questi drawbar sono veri anche per :cnoremap abc <do stuff>...
Martin Tournoij,

1
Non c'è ritardo quando lo fai ab<any key>.
romainl

Risposte:


10

Ecco un modo per farlo:

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.