แม็พลำดับของตัวอักษรในโหมดแทรก


11

ฉันสามารถแมปคีย์ผสมในโหมดแทรกได้แล้ว:

:inoremap abc <do stuff>

อย่างไรก็ตามสิ่งนี้มีข้อบกพร่องเล็กน้อย:

  • เมื่อพิมพ์บางส่วนของลำดับเช่นabอักขระจะไม่แสดงจริงในช่วงเวลาสั้น ๆ เนื่องจาก "รอ" เพื่อดูว่าคุณกำลังจะพิมพ์คำสั่งเต็มหรือไม่ สิ่งนี้ไม่พึงประสงค์ ฉันต้องการแมปลูกโซ่ของตัวอักษรโดยไม่หยุดถ้าสตริงย่อยบางส่วนของห่วงโซ่ถูกป้อน

  • หากฉันพิมพ์abให้หยุดชั่วคราว (และรอจนกว่าอักขระจะปรากฏจริงตามที่กล่าวไว้ในจุดด้านบน) จากนั้นพิมพ์cคำสั่งจะไม่ถูกเรียกใช้งาน ฉันต้องการให้คำสั่งดำเนินการไม่ว่าจะรอนานแค่ไหน

ฉันจะใช้iabแต่ไม่ได้ผลเพราะ:

  1. มันต้องป้อนช่องว่างหลังจากสตริง
  2. ฉันไม่สามารถดำเนินการคำสั่งโดยพลการด้วยมันเพียงแทรกสตริงของข้อความ

มีวิธีใดบ้างที่จะรันคำสั่งหรือการกดแป้นถ้ามีการป้อนสตริงที่แน่นอนในโหมดแทรกโดยไม่ต้องใช้แผนที่ (ซึ่งจะทำให้หยุดชั่วคราวทุกครั้งที่ฉันพิมพ์aและไม่ทำงานหากฉันรอนานเกินไป)?


drawbbacks เหล่านี้ยังเป็นจริงสำหรับ:cnoremap abc <do stuff>...
มาร์ติน Tournoij

1
ab<any key>มีความล่าช้าเมื่อคุณทำไม่ได้
romainl

คำตอบ:


10

นี่เป็นวิธีหนึ่งในการทำเช่นนั้น:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.