Изменить форму курсора в режиме ожидания оператора

9

Мой курсор в Gvim:

Мой курсор в Gvim

Мой курсор в Gvim после нажатия d:

Мой курсор в Gvim после нажатия <code> d </ code>

Есть ли способ изменить курсор в терминале Vim в режиме ожидания оператора? Это не должно быть похоже на скриншоты.

Это делается o:hor50-Cursorв guicursorтечение Gvim. Для Vim я вижу только три варианта:

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|

Но ничего о режиме ожидания оператора ...

Мартин Турной
источник
2
Я не думаю, что это возможно (можно использовать патч исходного кода ..). Что я делаю, так это смотрю на правую нижнюю часть окна Vim, чтобы проверить наличие частично введенных командных букв, которые отображаются там (с showcmdвключенной настройкой). Я также отключаю все тайм-ауты и эту esckeysопцию (это позволяет Vim быстро работать, но позволяет мне думать о том, что я хочу делать в режиме ожидания, например).
VanLaser
1
@VanLaser Да, но мне нравится курсор ;-)
Мартин Турной
Хе-хе, я могу это понять :)
VanLaser
Я знаю C / C ++, предлагаю $ bounty, и я могу попытаться реализовать его в исходном коде Vim, если это возможно: D
VanLaser
Вы можете использовать vi.stackexchange.com/a/11437/10337, чтобы обнаружить режим ожидания оператора и повторить escape-запрос, чтобы изменить курсор.
Лактак

Ответы:

3

Это обновляет курсор при входе / выходе из режима ожидания оператора.

Хотя это немного хакерское решение, я не думаю, что у него есть проблемы с производительностью.

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

Возможно, вам придется изменить стиль курсора SetCursor()на тот, который вы предпочитаете:

0: blinking block.
1: blinking block.
2: steady block.
3: blinking underline.
4: steady underline.
5: blinking bar (xterm).
6: steady bar (xterm).
laktak
источник