เปลี่ยนรูปร่างเคอร์เซอร์ในโหมดรอดำเนินการ


9

เคอร์เซอร์ของฉันใน Gvim:

เคอร์เซอร์ของฉันใน Gvim

เคอร์เซอร์ของฉันใน Gvim หลังจากกดd:

เคอร์เซอร์ของฉันใน Gvim หลังจากกด <code> d </code>

มีวิธีใดบ้างที่ฉันสามารถเปลี่ยนเคอร์เซอร์ใน terminal Vim เมื่ออยู่ในโหมดผู้ดำเนินการที่ค้างอยู่? มันไม่จำเป็นต้องดูเหมือนภาพหน้าจอเลย

สิ่งนี้ทำได้โดยo:hor50-CursorในguicursorGvim มีเพียงสามตัวเลือกที่ฉันเห็นสำหรับ Vim คือ:

t_SI    start insert mode (bar cursor shape)        *t_SI* *'t_SI'*
t_SR    start replace mode (underline cursor shape) *t_SR* *'t_SR'*
t_EI    end insert or replace mode (block cursor shape) *t_EI* *'t_EI'*
    |termcap-cursor-shape|

แต่ไม่มีอะไรเกี่ยวกับโอเปอเรเตอร์โหมดที่รอดำเนินการ ...


2
ฉันคิดว่ามันเป็นไปไม่ได้ (อาจใช้ซอร์สโค้ดแพตช์ .. ) สิ่งที่ฉันทำคือดูที่ด้านล่างขวาของหน้าต่าง Vim เพื่อตรวจสอบตัวอักษรคำสั่งที่แนะนำบางส่วนซึ่งจะปรากฏขึ้นที่นั่น (พร้อมshowcmdการตั้งค่า) ฉันยังปิดการใช้งานหมดเวลาและesckeysตัวเลือก (สิ่งนี้ทำให้ Vim เร็ว แต่ช่วยให้ฉันคิดในสิ่งที่ฉันต้องการทำในโหมด op-pending เป็นต้น)
VanLaser

1
@VanLaser ใช่ แต่ฉันชอบเคอร์เซอร์ ;-)
Martin Tournoij

อิอิผมสามารถเข้าใจว่า :)
VanLaser

ฉันรู้ว่า C / C ++ เสนอเงินรางวัลจำนวนมากและฉันอาจพยายามนำไปใช้ในซอร์สโค้ด Vim หากเป็นไปได้: D
VanLaser

คุณสามารถใช้vi.stackexchange.com/a/11437/10337เพื่อตรวจจับโหมดผู้ดำเนินการที่ค้างอยู่และสะท้อน ansi escape เพื่อเปลี่ยนเคอร์เซอร์
laktak

คำตอบ:


3

สิ่งนี้จะอัปเดตเคอร์เซอร์เมื่อเข้า / ออกจากโหมดรอดำเนินการ

แม้ว่ามันจะเป็นวิธีการแฮ็กเล็กน้อย แต่ฉันไม่คิดว่ามันจะมีปัญหาด้านประสิทธิภาพใด ๆ

" This is esentially:
"   exec 'silent !printf "\e[" . a:t . ' q'
"   redraw!
" but without the screen flash
function! s:setCursor(t)
    " Save existing values.
    let [l:title, l:t_ts, l:t_fs, l:titlestring] = [&title, &t_ts, &t_fs, &titlestring]

    try
        let &titleold = ''
        let &t_ts = "\e[0;0"
        let &t_fs = "\e[" . a:t . ' q'
        set title
        set titlestring=H
        redraw!
    finally
        let [&title, &t_ts, &t_fs, &titlestring] = [l:title, l:t_ts, l:t_fs, l:titlestring]
    endtry
endfunction

let s:prevmode = ''
function! DetectPendingMode(timer)
    let l:mode = mode(1)
    if l:mode is# s:prevmode
        return
    endif

    if l:mode is# 'no'
        call <SID>setCursor(4)
    elseif s:prevmode is# 'no'
        call <SID>setCursor(2)
    endif
    let s:prevmode = l:mode
endfunction

call timer_start(250, 'DetectPendingMode', {'repeat': -1})

คุณอาจต้องเปลี่ยนรูปแบบของเคอร์เซอร์เป็นรูปแบบที่SetCursor()คุณต้องการ:

0: blinking block.
1: blinking block.
2: steady block.
3: blinking underline.
4: steady underline.
5: blinking bar (xterm).
6: steady bar (xterm).
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.