Alterar a forma do cursor no modo pendente do operador


9

Meu cursor no Gvim:

Meu cursor no Gvim

Meu cursor no Gvim depois de pressionar d:

Meu cursor no Gvim depois de pressionar <code> d </code>

Existe alguma maneira de alterar o cursor no terminal Vim quando estiver no modo pendente do operador? Não precisa se parecer exatamente com as capturas de tela.

Isso é feito pelo o:hor50-Cursorin guicursorpara Gvim. As únicas três opções que vejo para o Vim são:

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|

Mas nada sobre o modo pendente do operador ...


2
Eu não acho que é possível (poderia usar um patch de código-fonte ..). O que faço é olhar para o lado inferior direito da janela do Vim para verificar as letras de comando parcialmente introduzidas, que aparecem lá (com a showcmdconfiguração ativada). Também desabilito todos os tempos limite e a esckeysopção (isso mantém o Vim ágil, mas permite que eu pense no que quero fazer no modo pendente de operação, por exemplo).
VanLaser

11
@VanLaser Sim, mas eu como o cursor ;-)
Martin Tournoij

Hehe, eu posso entender que :)
VanLaser

Eu sei que C / C ++, oferecer uma recompensa $ e eu posso tentar implementá-lo no código-fonte Vim, se possível: D
VanLaser

Você pode usar o vi.stackexchange.com/a/11437/10337 para detectar o modo pendente do operador e ecoar uma saída ansi para alterar o cursor.
laktak

Respostas:


3

Isso atualiza o cursor ao entrar / sair do modo pendente do operador.

Embora seja um pouco de uma solução hacky, não acho que tenha problemas de desempenho.

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

Pode ser necessário alterar o estilo do cursor SetCursor()para o que você preferir:

0: blinking block.
1: blinking block.
2: steady block.
3: blinking underline.
4: steady underline.
5: blinking bar (xterm).
6: steady bar (xterm).
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.