Cambiar la forma del cursor en modo de operador pendiente

9

Mi cursor en Gvim:

Mi cursor en Gvim

Mi cursor en Gvim después de presionar d:

Mi cursor en Gvim después de presionar <code> d </code>

¿Hay alguna forma de cambiar el cursor en el terminal Vim cuando estoy en modo de operador pendiente? No tiene que verse exactamente como las capturas de pantalla.

Esto se realiza o:hor50-Cursoren guicursorpor Gvim. Las únicas tres opciones que veo para Vim son:

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|

Pero nada sobre el modo pendiente del operador ...

Martin Tournoij
fuente
2
No creo que sea posible (podría usar un parche de código fuente ...). Lo que hago es mirar el lado inferior derecho de la ventana de Vim para verificar las letras de comando parcialmente introducidas, que aparecen allí (con la showcmdconfiguración activada). También deshabilito todos los tiempos de espera y la esckeysopción (esto mantiene a Vim ágil pero me permite pensar en lo que quiero hacer en modo de operación pendiente, por ejemplo).
VanLaser
1
@VanLaser Sí, pero me gusta el cursor ;-)
Martin Tournoij
Jeje, puedo entender eso :)
VanLaser
Conozco C / C ++, ofrezco una recompensa de $ y puedo intentar implementarlo en el código fuente de Vim, si es posible: D
VanLaser
Puede usar vi.stackexchange.com/a/11437/10337 para detectar el modo pendiente del operador y hacer eco de un escape ansi para cambiar el cursor.
laktak

Respuestas:

3

Esto actualiza el cursor al entrar / salir del modo de operador pendiente.

Si bien es una solución un poco hacky, no creo que tenga ningún problema de rendimiento.

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

Es posible que deba cambiar el estilo del cursor SetCursor()al que prefiera:

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