Changer la forme du curseur en mode opérateur en attente

9

Mon curseur dans Gvim:

Mon curseur dans Gvim

Mon curseur dans Gvim après avoir appuyé sur d:

Mon curseur dans Gvim après avoir appuyé sur <code> d </code>

Existe-t-il un moyen de changer le curseur dans le terminal Vim en mode opérateur en attente? Il n'a pas à ressembler exactement aux captures d'écran.

Cela se fait par o:hor50-Cursorin guicursorpour Gvim. Les trois seules options que je vois pour Vim sont:

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|

Mais rien sur le mode opérateur en attente ...

Martin Tournoij
la source
2
Je ne pense pas que ce soit possible (pourrait utiliser un patch de code source ..). Ce que je fais est de regarder le côté inférieur droit de la fenêtre Vim pour vérifier les lettres de commande partiellement introduites, qui s'affichent là-bas (avec le showcmdréglage activé). Je désactive également tous les délais d'expiration et l' esckeysoption (cela garde Vim accrocheur mais me permet de penser à ce que je veux faire en mode op en attente par exemple).
VanLaser
1
@VanLaser Oui, mais j'aime le curseur ;-)
Martin Tournoij
Hehe, je peux comprendre ça :)
VanLaser
Je connais C / C ++, offre une prime $ et je peux essayer de l'implémenter dans le code source Vim, si possible: D
VanLaser
Vous pouvez utiliser vi.stackexchange.com/a/11437/10337 pour détecter le mode en attente de l'opérateur et faire écho à un échappement ansi pour changer le curseur.
laktak

Réponses:

3

Cela met à jour le curseur lorsque vous entrez / quittez le mode opérateur en attente.

Bien que ce soit un peu une solution hacky, je ne pense pas qu'il ait de problèmes de performances.

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

Vous devrez peut-être changer le style du curseur en SetCursor()celui que vous préférez:

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