Como alterar o modo de tipo de comando do Vim programaticamente?

6

Existe uma maneira simples de mudar de um modo de tipo de comando para outro sem perder a linha de comando atual?

No meu arquivo ~/.vimrc , remapear o caractere <space> e <c-space> , vindo de para:

  1. N, V, O = > :
  2. I = > :
  3. : = > / = > ?

O código que realiza o comportamento acima é:

function! s:ModMapSpaceChar()
  noremap <unique> <space> :
  map <unique> <nul> <c-space>
  map! <unique> <nul> <c-space>
  noremap <unique> <c-space> /
  inoremap <unique> <c-space> <c-o>:
  cnoremap <unique> <c-space> <c-\>eg:ToggleCmdTypes()<cr><c-c>@"
  let g:CmdTypes={':' : '/', '/' : '?', '?': ':'}
  function! g:ToggleCmdTypes()
    let a=getcmdtype()
    let b=get(g:CmdTypes, a, a)
    let c=getcmdline()
    let @"=b . c
    return ''
  endfunction
endfunction

call s:ModMapSpaceChar()

O que me incomoda na minha abordagem é a função impura g:ToggleCmdTypes . Deve idealmente retornar o comando que atualmente atribui ao registro " . O comando resultante será então executado.

    
por Tim Friske 06.01.2013 / 18:16

1 resposta

1

Em vez do desvio através do registrador, você provavelmente também pode usar feedkeys() para isso, para evitar que o registro seja danificado. Isso tem apenas a desvantagem de não funcionar quando gravado e reproduzido como uma macro.

Em geral, recomendo repensar sua abordagem geral; Eu não vejo como é útil trocar os modos de linha de comando assim. Quem inicia uma busca apenas para perceber no meio do caminho que ele quer que seja executado como um comando?!

    
por 20.02.2013 / 14:12