Змініть форму курсору в режимі очікування від оператора


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 Так, але мені подобається курсор ;-)
Martin Tournoij

Хе-хе, я можу це зрозуміти :)
VanLaser

Я знаю C / C ++, пропоную $ баунті і, можливо, спробую реалізувати його у вихідному коді Vim, якщо це можливо: D
VanLaser

Ви можете використовувати vi.stackexchange.com/a/11437/10337, щоб виявити режим очікування оператора та повторити втечу ансі, щоб змінити курсор.
лактак

Відповіді:


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).
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.