Ubah bentuk kursor dalam mode pending operator

9

Kursor saya di Gvim:

Kursor saya di Gvim

Kursor saya di Gvim setelah menekan d:

Kursor saya di Gvim setelah menekan <code> d </code>

Apakah ada cara saya dapat mengubah kursor di terminal Vim ketika dalam mode pending operator? Tidak harus persis seperti tangkapan layar.

Ini dilakukan oleh o:hor50-Cursorin guicursoruntuk Gvim. Tiga opsi yang saya lihat untuk Vim adalah:

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|

Tapi tidak ada yang tentang mode pending operator ...

Martin Tournoij
sumber
2
Saya tidak berpikir itu mungkin (bisa menggunakan patch kode sumber ..). Apa yang saya lakukan adalah melihat sisi kanan bawah jendela Vim untuk memeriksa surat perintah yang diperkenalkan sebagian, yang muncul di sana (dengan showcmdpengaturan aktif). Saya juga menonaktifkan semua timeout dan esckeysopsi (ini membuat Vim tajam tetapi memungkinkan saya untuk memikirkan apa yang ingin saya lakukan dalam mode op-pending misalnya).
VanLaser
1
@ VanLaser Ya, tapi saya suka kursor ;-)
Martin Tournoij
Hehe, saya bisa mengerti itu :)
VanLaser
Saya tahu C / C ++, menawarkan $ bounty dan saya dapat mencoba mengimplementasikannya dalam kode sumber Vim, jika mungkin: D
VanLaser
Anda dapat menggunakan vi.stackexchange.com/a/11437/10337 untuk mendeteksi mode pending operator dan mengulangi pelarian ansi untuk mengubah kursor.
laktak

Jawaban:

3

Ini memperbarui kursor ketika memasuki / keluar dari mode pending operator.

Walaupun ini sedikit solusi hacky, saya rasa tidak ada masalah kinerja.

" 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})

Anda mungkin perlu mengubah gaya kursor SetCursor()ke yang Anda inginkan:

0: blinking block.
1: blinking block.
2: steady block.
3: blinking underline.
4: steady underline.
5: blinking bar (xterm).
6: steady bar (xterm).
laktak
sumber