Script Vim: É possível tornar um movimento personalizado não repetível?

2

Estou tentando escrever uma função de yank personalizada, mas não consigo descobrir como torná-la não repetível (como o yank normal). Eu tenho algo parecido com o seguinte:

function! s:YankMotion(type)

    if a:type ==# 'line'
        normal! '[V']y
    elseif a:type ==# 'char'
        normal! '[v']y
    else
        echom "Unexpected selection type"
        return
    endif
endfunction

nnoremap y :set opfunc=<sid>YankMotion<cr>g@

O problema é que se você fizer uma operação que seja repetível (por exemplo, cw ), então arrancar alguma coisa e executar a repetição novamente atingindo . , você esperaria disparar cw , mas tentará fazer o puxar de novo.

É possível corrigir isso?

    
por Steve Vermeulen 02.09.2013 / 18:10

1 resposta

2

O vim irá repetir o comando g@ . Infelizmente, não há como evitar isso, e como você também não pode acessar o histórico de comandos internos, é impossível restaurar o comando anteriormente emitido. (Você poderia hackear algo em conjunto para mapeamentos personalizados que dependam de repeat.vim, mas não funcionará para comandos internos.)

A única solução em que consigo pensar é alterar o mapeamento para usar o comando normal y e acionar depois do que for parte de seu "yank personalizado", por exemplo, via :autocmd on CursorMoved,CursorHold .

    
por 03.09.2013 / 16:55

Tags