Ändern Sie die Cursorform im ausstehenden Operator-Modus

9

Mein Cursor in Gvim:

Mein Cursor in Gvim

Mein Cursor in Gvim nach dem Drücken von d:

Mein Cursor in Gvim nach dem Drücken von <code> d </ code>

Gibt es eine Möglichkeit, den Cursor im Terminal Vim im Operator Pending-Modus zu ändern? Es muss nicht genau wie die Screenshots aussehen.

Dies geschieht von o:hor50-Cursorin guicursorfür Gvim. Die einzigen drei Optionen, die ich für Vim sehe, sind:

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|

Aber nichts über den Operator Pending Mode ...

Martin Tournoij
quelle
2
Ich denke nicht, dass es möglich ist (könnte einen Quellcode-Patch verwenden ..). Ich schaue auf die rechte untere Seite des Vim-Fensters, um nach den teilweise eingeführten Befehlsbuchstaben zu suchen, die dort angezeigt werden (mit showcmdaktivierter Einstellung). Ich deaktiviere auch alle Zeitüberschreitungen und die esckeysOption (dies hält Vim bissig, erlaubt mir aber zu überlegen, was ich zum Beispiel im Op-Pending-Modus tun möchte).
VanLaser
1
@ VanLaser Ja, aber ich mag den Cursor ;-)
Martin Tournoij
Hehe, ich kann das verstehen :)
VanLaser
Ich kenne C / C ++, biete ein $ bounty an und kann versuchen, es in Vim-Quellcode zu implementieren, wenn möglich: D
VanLaser
Sie können vi.stackexchange.com/a/11437/10337 verwenden , um den anstehenden Operator-Modus zu erkennen und ein Ansi-Escape zu wiederholen, um den Cursor zu ändern.
Laktak

Antworten:

3

Dies aktualisiert den Cursor beim Aufrufen / Verlassen des anstehenden Bedienermodus.

Obwohl es eine etwas hackige Lösung ist, glaube ich nicht, dass es Leistungsprobleme gibt.

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

Möglicherweise müssen Sie den Stil des Cursors in SetCursor()den von Ihnen bevorzugten ändern :

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