Remapear as setas para cima e para baixo para gj-gk no modo de entrada vim sem usar c-o?

5

Mapeiei minhas teclas de setas para mover em um modo de linha visual, deixando as chaves hjkl para o movimento normal da linha lógica:

" Visual movement with the arrows and End-Home 
nnoremap <Down> gj
nnoremap <Up> gk
vnoremap <Down> gj
vnoremap <Up> gk
inoremap <Down> <C-o>gj
inoremap <Up> <C-o>gk
inoremap <Home> <C-o>g<Home>
inoremap <End>  <C-o>g<End>

Isso funciona, mas para um problema menor. Eu tenho um pouco de código na minha linha de status para mudar a cor entre o modo de entrada e o modo normal, assim:

if version >= 700
  highlight statusLine cterm=bold ctermfg=black ctermbg=red
  au InsertLeave * highlight StatusLine cterm=bold ctermfg=black ctermbg=red gui=bold guifg=black guibg=red
  au InsertEnter * highlight StatusLine cterm=bold ctermfg=black ctermbg=green   gui=bold guifg=black guibg=green
endif

... e eu notei agora (em uma máquina mais lenta do que a que eu tenho em casa) que toda vez que eu pressiono uma das setas, o interruptor de modo temporário de <ctrl>o (pelo menos, eu acho) faz o a linha de status pisca rapidamente em vermelho e depois em verde novamente.

É possível redefinir as teclas para evitar o salto temporário para o modo normal?

    
por Rmano 29.04.2014 / 01:03

1 resposta

1

Eu tenho duas ideias, mas ambas são bastante complexas:

  1. Use :inoremap <expr> e execute o reposicionamento do cursor com :call cursor() . A desvantagem é que você precisa fazer o cálculo de qual coluna empacotada está diretamente acima / abaixo do cursor.
  2. Use :inoremap <expr> para agrupar o comando <C-o>gj em :set eventignore+=InsertLeave,InsertEnter antes e depois restaurar a opção, assim:
function! IgnoreOn( motion )
    set eventignore+=InsertLeave,InsertEnter
    return "\<C-o>" . a:motion
endfunction
function! IgnoreOff()
    set eventignore-=InsertLeave,InsertEnter
    return "\<Left>\<Right>" | " Workaround for missing screen update.
endfunction
inoremap <expr> <SID>IgnoreOff IgnoreOff()
inoremap <expr> <SID>IgnoredDown IgnoreOn('gj')
inoremap <script> <Down> <SID>IgnoredDown<SID>IgnoreOff
    
por 29.04.2014 / 10:08

Tags