Ordnen Sie eine Buchstabenfolge im Einfügemodus zu


11

Ich kann bereits eine Tastenkombination im Einfügemodus zuordnen:

:inoremap abc <do stuff>

Dies hat jedoch einige Nachteile:

  • Wenn Sie eine Teilversion der Sequenz eingeben, z. B. abwerden die Zeichen für kurze Zeit nicht angezeigt, da "gewartet" wird, ob Sie den vollständigen Befehl eingeben . Dies ist unerwünscht; Ich möchte eine Buchstabenkette ohne Pause zuordnen, wenn eine Teilzeichenfolge der Kette eingegeben wird.

  • Wenn ich tippe ab, dann pausiere (und warte, bis die Zeichen tatsächlich wie oben erwähnt erscheinen), tippe dann den c, der Befehl wird nicht ausgeführt. Ich möchte, dass der Befehl ausgeführt wird, egal wie lange ich warte.

Ich würde ein verwenden iab, aber das funktioniert nicht, weil:

  1. Es muss ein Leerzeichen nach der Zeichenfolge eingegeben werden
  2. Ich kann damit keine beliebigen Befehle ausführen, sondern nur eine Textzeichenfolge einfügen.

Gibt es eine Möglichkeit, einen Befehl oder Tastenanschläge auszuführen, wenn eine bestimmte Zeichenfolge im Einfügemodus eingegeben wird, ohne eine Karte zu verwenden (die jedes Mal, awenn ich eine tippe, störend pausiert und nicht funktioniert, wenn ich zu lange warte)?


Diese Nachteile gelten auch für :cnoremap abc <do stuff>...
Martin Tournoij

1
Es gibt keine Verzögerung, wenn Sie dies tun ab<any key>.
Romainl

Antworten:


10

Hier ist eine Möglichkeit, dies zu tun:

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.