No vim, impedir o retorno do cursor quando sair do modo de edição?


8

No vim, se eu entrar e sair do modo de edição sem fazer nada, o sinal de intercalação terminará com um caractere à esquerda. E se eu entrar e sair do modo de acréscimo, o cursor se move para frente e depois para trás.

Alguma maneira de configurar o vim para deixar o sinal de intercalação sozinho nesses casos?

Idealmente, só quero sempre entrar no modo de acréscimo, mas sem mover o cursor quando entro ou saio do modo.

(Atualmente, geralmente uso o modo de inserção porque não atrapalha minha posição de sinal de intercalação na entrada. Ou seja, exceto quando eu preciso anexar ao final da linha, nesse caso, eu juro pelo vim por me comportar de uma maneira tão arcaica , pressione Esc e entre no modo de acréscimo.)


1
As respostas para esta pergunta são boas. Eu só quero ressaltar que, se eles estão corretos nas suposições deles, você usa i para ir para o modo de edição, é isso que está causando o retrocesso. Se você usar 'a' (não A), ele funcionará conforme o esperado.
johnny

@ johnny Acho que não. Normalmente, estou no modo "normal", movendo-me pelo arquivo e outras coisas. Quando preciso fazer uma edição, posiciono o cursor primeiro, depois pressione "a" e descobri que o posicionei incorretamente, pois ele se move para a direita. Dado que passo 99% do meu tempo de edição em editores modernos, não há chance de me lembrar de posicionar um caractere à esquerda antes de pressionar "a". É por isso que eu esperava uma macro ou algo assim.
RomanSt

É uma questão de hábitos. É realmente irritante, mas apenas nos primeiros anos. Você vai finalmente aprender a pressionar iou asem pensar nisso, e pode ser ainda s, S, ci", etc. , em vez da limitada ie a.
Luc Hermitte

1
Eu entendo sua frustração, mas. Tente pensar no que está fazendo. Pergunte a si mesmo se há uma maneira melhor de fazê-lo (do que usar o Vim como um editor de texto comum, isto é). Eu descobri com o Vim sempre há uma maneira melhor, a maneira de fazer as coisas no Vim. Podemos ajudar, mas precisamos saber o que você está fazendo ao encontrar problemas. Por exemplo, você entra no modo de edição quando deseja excluir alguma coisa? Não, existe 'x' para excluir caracteres. Quer substituir um personagem, então há 'r'. Pense no que você deseja alcançar.
johnny

@ johnny Eu entendo o que você está falando, mas requer muito reaprendizado para fazer sentido para mim. Passo 99% do meu tempo de edição no Visual Studio e adoro isso. Só sei que não vou reaprender isso, então não adianta perder tempo.
RomanSt

Respostas:


8

Essa pergunta é freqüente entre os novos usuários do vi / Vim, e a resposta é que, no modo normal, o cursor está sempre "ligado" em um caractere, mas no modo de inserção, o cursor está sempre "entre" dois caracteres (lembre-se, o final -of-line é um caractere). Você realmente não pode ver isso ilustrado também no console Vim, mas na GUI você notará que o cursor se torna uma barra entre dois caracteres quando você entra no modo de inserção, em vez de um bloco sobre um caractere quando você está no modo normal.

Portanto, o que você está vendo não é necessariamente o cursor movendo um caractere de volta quando você sai do modo de inserção, mas apenas movendo-se para um caractere. A única direção segura de movimento é para a esquerda (ou para trás). Portanto, você tem mais de uma maneira de entrar no modo de inserção:

  • "a" entra no modo de inserção com o cursor "entre" o caractere em que o cursor estava e o próximo caractere à direita.
  • "i" entra no modo de inserção com o cursor "entre" o caractere em que o cursor estava e o caractere anterior à esquerda.

Algumas pessoas fizeram esforços para suprimir esse "movimento" de que não gostam, mas isso inevitavelmente interfere nos plugins e outros scripts do Vim que eles desejam executar no futuro.

Minha sugestão é me acostumar a usar os comandos "a" e "i" (e "A" e "I") nas circunstâncias apropriadas.

Os comandos "o" e "O" também são úteis para aprender. Vejo:

:help a
:help i
:help A
:help I
:help o
:help O

Editar: se você ainda está determinado a alterar esse comportamento, tente esta dica: Impedir que a fuga mova o cursor um caractere para a esquerda


1
Entendo o que você está dizendo, mas "i" / "Esc" / "i" / "Esc" causa um movimento líquido real real do cursor. Eu realmente acho que o VIM simplesmente não é para mim.
RomanSt

2
@romkyns: Eu acho que o que você deve fazer é usar em avez de i.
Dennis Williamson

1
@Dennis concordou que "a" é um pouco melhor porque permite que o sinal de intercalação esteja antes do primeiro caractere e depois do último caractere de uma linha - o que "i" não permite arbitrariamente. Mas eu tentei isso; o que acontece é que eu sempre substituo o cursor antes de pressionar "a" - então tenho que mover imediatamente o cursor uma posição para a esquerda. Toda vez. Ficou cansativo, então mudei para "i".
RomanSt

@ Heptite Você poderia, talvez, me indicar uma implementação defeituosa de algo que suprime o movimento? As chances de eu querer usar plug-ins ou outros scripts no futuro são praticamente nulas.
RomanSt

1
@romkyns, (não) funciona nos dois sentidos. O remapeamento <esc>impedirá que a maioria dos plug-ins <esc>funcione corretamente, mas também o incomodará quando você usará outros recursos padrão que retornam ao modo normal da mesma maneira <esc>. Aprender a usar a tecla certa em tempo real é a solução que aumenta / funciona a longo prazo.
Luc Hermitte

1

Eu acho que por quilate você quer dizer o cursor e, se estiver usando "i", ele inserirá diretamente onde está o cursor, "a" (que acredito estar procurando) move o caractere do cursor para a direita. Além disso, o turno-i (I) vai para o início da linha e o turno-a (A) vai até o final da linha.

Se entendi mal sua pergunta, peço desculpas.


1

Como o remapeamento <ESC>é considerado 'arriscado', basta combinar com uma das abordagens Evitar a Chave de Escape e ter o seguinte no meu .vimrc:

 inoremap ii <ESC>l

Nota: Verifique se não há caracteres de espaço no final da linha.

Simples, mas totalmente certificado como "funciona bem para mim", pois é exatamente isso que eu teria que digitar manualmente.

Se eu uso aou iainda recupero o comportamento do sinal de intercalação e isso me incomoda muito mais do que nunca, a próxima coisa que quero digitar é d$excluir no final de uma linha, etc.


Solução surpreendentemente simples. Melhor que me deparei.
precisa saber é o seguinte

1

Aqui está a minha solução:

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])

É engraçado. Essa mesma pergunta existe nos três sites: SO, SU, Unix + Linux.


Não acho engraçado :) Felizmente, encontrei um editor que não me deixa louco (diakonos), então isso não é mais um problema. Ainda assim, votado para quem gosta de vim.
RomanSt
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.