Cambia la forma del cursore in modalità operatore in sospeso


9

Il mio cursore in Gvim:

Il mio cursore in Gvim

Il mio cursore in Gvim dopo aver premuto d:

Il mio cursore in Gvim dopo aver premuto <code> d </code>

È possibile cambiare il cursore nel terminale Vim in modalità operatore in sospeso? Non deve assomigliare esattamente agli screenshot.

Questo viene fatto da o:hor50-Cursorin guicursorper Gvim. Le uniche tre opzioni che vedo per Vim sono:

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|

Nulla sulla modalità in attesa dell'operatore ...


2
Non credo sia possibile (potrebbe usare una patch del codice sorgente ..). Quello che faccio è guardare il lato in basso a destra della finestra di Vim per verificare le lettere di comando parzialmente introdotte, che vengono visualizzate lì (con l' showcmdimpostazione attivata). Inoltre disabilito tutti i timeout e l' esckeysopzione (questo mantiene Vim scattante ma mi permette di pensare a cosa voglio fare in modalità op-pending per esempio).
VanLaser

1
@VanLaser Sì, ma mi piace il cursore ;-)
Martin Tournoij,

Hehe, posso capirlo :)
VanLaser

Conosco C / C ++, offro $ bounty e potrei provare a implementarlo nel codice sorgente di Vim, se possibile: D
VanLaser

È possibile utilizzare vi.stackexchange.com/a/11437/10337 per rilevare la modalità operatore in sospeso ed eseguire l'eco di una fuga ANSI per modificare il cursore.
Laktak,

Risposte:


3

Questo aggiorna il cursore quando si entra / esce dalla modalità di attesa dell'operatore.

Sebbene sia una soluzione un po 'confusa, non penso che abbia problemi di prestazioni.

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

Potrebbe essere necessario modificare lo stile del cursore in SetCursor()quello che preferisci:

0: blinking block.
1: blinking block.
2: steady block.
3: blinking underline.
4: steady underline.
5: blinking bar (xterm).
6: steady bar (xterm).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.