Odwzoruj sekwencję liter w trybie wstawiania


11

Mogę już zmapować kombinację klawiszy w trybie wstawiania:

:inoremap abc <do stuff>

Ma to jednak kilka wad:

  • Podczas wpisywania częściowej wersji sekwencji, na przykład ab, znaki nie są wyświetlane przez krótki czas, ponieważ „czeka”, aby sprawdzić, czy zamierzasz wpisać pełne polecenie. To jest niepożądane; Chcę zmapować łańcuch liter bez pauzy, jeśli zostanie wprowadzone częściowe podłańcuch łańcucha.

  • Jeśli piszę ab, pauzuj (i poczekaj, aż znaki pojawią się tak, jak wspomniano w powyższym punkcie), a następnie wpisz c, polecenie nie jest wykonywane. Chcę, aby polecenie zostało wykonane bez względu na to, jak długo będę czekać.

Chciałbym użyć iab, ale to nie działa, ponieważ:

  1. Wymaga wprowadzenia spacji po ciągu
  2. Nie mogę z nim wykonywać dowolnych poleceń, wstawiam tylko ciąg tekstu.

Czy jest jakiś sposób na wykonanie polecenia lub naciśnięcia klawisza, jeśli określony ciąg zostanie wprowadzony w trybie wstawiania, bez użycia mapy (która irytująco zatrzyma się za każdym razem, gdy wpisuję, ai nie będzie działać, jeśli będę czekać zbyt długo)?


Te wady dotyczą także :cnoremap abc <do stuff>...
Martin Tournoij,

1
Kiedy to zrobisz, nie ma opóźnienia ab<any key>.
romainl

Odpowiedzi:


10

Oto jeden ze sposobów, aby to zrobić:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.