Vim move o cursor um caractere no modo de inserção sem as teclas de seta

8

Isso pode parecer um pouco exagerado, mas mudei para o vim e estou muito feliz com o fluxo de trabalho agora. Tento me disciplinar a não usar as teclas de seta, pois manter as mãos nas teclas alfa o tempo todo é algo muito importante ao escrever. Portanto, quando preciso navegar, saio do modo de inserção, passo no modo normal e volto ao modo de inserção.

Há uma exceção em que isso é realmente mais perturbador: eu uso clang completecom trechos e super tabisso é ótimo. Exceto toda vez que eu obtenho uma função concluída automaticamente depois de preencher os parâmetros, fico com o cursor antes )e, para continuar, tenho que mover o cursor um caractere para a direita. Como você pode imaginar, isso acontece com muita frequência .

As únicas opções que tenho (tanto quanto sei) são: Esclaou , e não estou feliz com nenhuma delas. O primeiro me faz pressionar 3 teclas para um simples movimento de cursor de 1 caractere, o segundo me faz mover minha mão para as setas. Uma terceira opção seria mapear CTRL-Lou pesquisar .

Então, qual é a melhor maneira de fazer isso?


//snippets (clang complete + supertab):
foo($`param1`, $`param2`)

//after completion:
foo(var1, var2|)
              ^ ^
              | |
     I am here  |
                 Need to be here

| indica a posição do cursor

Bolov
fonte
Com um problema semelhante, acabei cortando o script de conclusão para não fazer eco do fechamento )se houver pelo menos um argumento na função. Então eu digito à mão. Muito mais útil agora.
Dmitry Frank
O que acontece quando você digita, )eu aposto que ele pula sem realmente inserir. (Eu não uso este plugin)
FDinoff
@FDinoff não, ele simplesmente insere outra)
bolov
11
@bolov isso é decepcionante. Você pode extrair o código que faz isso dos pares automáticos . Não tenho idéia se os plugins entrarão em conflito, eles podem. A outra opção é usar <C-O>lpara sair do modo normal para 1 comando no modo normal.
FDinoff

Respostas:

5

Mapa )para pular o existente, )se for um parêntese de fechamento

inoremap <expr> )  strpart(getline('.'), col('.')-1, 1) == ")" ? "\<Right>" : ")"

Retirado de: http://vim.wikia.com/wiki/Automatically_append_closing_characters


Resposta antiga

:h i_CTRL-O execute um comando, retorne ao modo Inserir.

Ctrl-ol moverá um caractere para a direita e retornará ao modo de inserção.

Como alternativa, alguns dos plugins de suporte permitem digitar apenas o suporte de fechamento )e eles substituem o existente.

Brett Y
fonte
11
isso não funciona se )for o último caractere na linha (e isso acontece com frequência quando você escreve o código). CTRL-O ano entanto funciona. Acho que salvamos uma chave. :)
bolov
True del )é de apenas dois caracteres e sempre o coloca após o parêntese de fechamento.
Brett Y
pular sobre as obras ')' como um encanto, obrigado
bolov
0

Digite o seguinte para encontrar as teclas de controle usadas no modo de inserção.

:help insert-index

ctrl-b não é usado, mas você pode sacrificar outra tecla.

imap <c-b> <right>

Isso funciona para mover o cursor para a direita um caractere. Ou mapeie alguns caracteres duplos.

imap jj <right>
vassoura
fonte