Petakan urutan huruf dalam mode sisipkan

11

Saya sudah bisa memetakan kombinasi tombol dalam mode insert:

:inoremap abc <do stuff>

Namun, ini memiliki beberapa kelemahan:

  • Saat mengetik versi parsial dari urutan, seperti ab, karakter sebenarnya tidak ditampilkan untuk waktu yang singkat, karena itu "menunggu" untuk melihat apakah Anda akan mengetik perintah lengkap. Ini tidak diinginkan; Saya ingin memetakan rantai surat tanpa berhenti jika substring sebagian dari rantai dimasukkan.

  • Jika saya mengetik ab, maka jeda (dan tunggu sampai karakter benar-benar muncul seperti disebutkan pada titik di atas), kemudian ketik c, perintah tidak dieksekusi. Saya ingin perintah dieksekusi tidak peduli berapa lama saya menunggu.

Saya akan menggunakan iab, tetapi itu tidak berhasil karena:

  1. Itu membutuhkan memasukkan spasi setelah string
  2. Saya tidak bisa menjalankan perintah arbitrer dengannya, hanya menyisipkan serangkaian teks.

Apakah ada cara untuk menjalankan perintah atau penekanan tombol jika string tertentu dimasukkan dalam mode insert, tanpa menggunakan peta (yang akan menjeda setiap kali saya mengetik adan tidak bekerja jika saya menunggu terlalu lama)?

Gagang pintu
sumber
Drawbbacks ini juga berlaku untuk :cnoremap abc <do stuff>...
Martin Tournoij
1
Tidak ada penundaan saat Anda melakukannya ab<any key>.
romainl

Jawaban:

10

Inilah satu cara untuk melakukannya:

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
sumber