Ánh xạ một chuỗi các chữ cái trong chế độ chèn


11

Tôi đã có thể ánh xạ tổ hợp phím trong chế độ chèn:

:inoremap abc <do stuff>

Tuy nhiên, điều này có một vài nhược điểm:

  • Khi nhập một phiên bản một phần của chuỗi, chẳng hạn như ab, các ký tự không thực sự được hiển thị trong một khoảng thời gian ngắn, vì nó "chờ" để xem liệu bạn có gõ lệnh đầy đủ hay không. Điều này là không mong muốn; Tôi muốn ánh xạ một chuỗi các chữ cái mà không tạm dừng nếu một chuỗi con một phần của chuỗi được nhập vào.

  • Nếu tôi gõ ab, sau đó tạm dừng (và đợi cho đến khi các ký tự thực sự xuất hiện như được đề cập ở điểm trên), sau đó nhập c, lệnh không được thực thi. Tôi muốn lệnh được thực thi cho dù tôi có đợi bao lâu.

Tôi sẽ sử dụng một iab, nhưng nó không hoạt động vì:

  1. Nó yêu cầu nhập một khoảng trắng sau chuỗi
  2. Tôi không thể thực thi các lệnh tùy ý với nó, chỉ chèn một chuỗi văn bản.

Có cách nào để thực thi lệnh hoặc tổ hợp phím nếu một chuỗi nhất định được nhập trong chế độ chèn, mà không sử dụng bản đồ (sẽ tạm dừng một cách khó chịu mỗi khi tôi nhập avà không hoạt động nếu tôi chờ quá lâu)?


Những nhược điểm này cũng đúng với :cnoremap abc <do stuff>...
Martin Tournoij 7/2/2015

1
Không có sự chậm trễ khi bạn làm ab<any key>.
romainl 7/2/2015

Câu trả lời:


10

Đây là một cách để làm điều đó:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.