เป็นกลุ่มสคริปต์: เป็นไปได้ที่จะทำให้การเคลื่อนไหวที่กำหนดเองไม่สามารถทำซ้ำได้?


2

ฉันพยายามเขียนฟังก์ชัน yank ที่กำหนดเอง แต่ฉันไม่สามารถหาวิธีทำให้ไม่สามารถทำซ้ำได้ (เช่น yank ปกติ) ฉันมีบางอย่างที่คล้ายกับต่อไปนี้:

function! s:YankMotion(type)

    if a:type ==# 'line'
        normal! `[V`]y
    elseif a:type ==# 'char'
        normal! `[v`]y
    else
        echom "Unexpected selection type"
        return
    endif
endfunction

nnoremap y :set opfunc=<sid>YankMotion<cr>g@

ปัญหาคือว่าถ้าคุณทำการผ่าตัดที่ทำซ้ำได้ (เช่น. cw) งัดบางสิ่งบางอย่างจากนั้นดำเนินการทำซ้ำอีกครั้งกดปุ่ม.คุณจะคาดหวังที่จะเรียกcwแต่มันพยายามที่จะทำงัดอีกครั้ง

เป็นไปได้ไหมที่จะแก้ไขปัญหานี้?


สิ่งที่คุณทำไม่เป็นงัดปกติ: .ก็ตอนนี้คำสั่งโหมดปกติและจึงทำซ้ำกับ
romainl

ใช่มันเป็นเรื่องปกติ แต่ในกรณีนี้ฉันไม่ต้องการพฤติกรรมนั้น
Steve Vermeulen

คำตอบ:


2

เป็นกลุ่มจะทำซ้ำg@คำสั่ง น่าเสียดายที่ไม่มีวิธีแก้ไขปัญหานี้และเนื่องจากคุณไม่สามารถเข้าถึงประวัติคำสั่งภายในได้จึงไม่สามารถกู้คืนคำสั่งที่ออกใช้ก่อนหน้านี้ได้ (คุณสามารถแฮ็คบางอย่างร่วมกันสำหรับการแมปที่กำหนดเองที่ต้องใช้ repeat.vim แต่มันจะไม่ทำงานสำหรับคำสั่งในตัว)

วิธีแก้ปัญหาเดียวที่ฉันสามารถคิดคือการเปลี่ยนการทำแผนที่การใช้ปกติyคำสั่งและเรียกสิ่งที่เป็นส่วนหนึ่งของ "งัดที่กำหนดเองของคุณ" หลังจากนั้นเช่นผ่านทางบน:autocmdCursorMoved,CursorHold

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