Como substituir mais de um caractere sem entrar no modo de inserção

12

Eu tenho um arquivo com uma linha que se parece com isso:

foofoo.xy.barbar

Eu quero mudar o xypara gh. Eu tentei fazer 2r-> gh, mas, obviamente, isso não funcionou, pois substituiu o xypor gge depois moveu meu cursor um ponto para a esquerda.

Existe uma maneira de fazer isso sem entrar no modo de inserção ou sem usar muito mais teclas (por exemplo :s/xy/gh/)?

durron597
fonte
2
Rentra no modo de substituição. :help replace-modePara maiores informações.
Alxndr
Eu tentei vt.rgh. Mas o resultado foi o mesmo que o seu, exceto na posição do cursor.
Gonçalo Ribeiro
2
Por que você não deseja entrar no modo de inserção? Algo como cwgh<esc>iria funcionar bem.
Doorknob
11
@ durron597 Não sei se minimize-keystrokesé uma boa etiqueta, geralmente não é exatamente sobre o que se trata , como tal. (Rejeitei as edições propostas) ... Talvez você deva discutir na meta?
Martin Tournoij

Respostas:

19

Se o novo texto tiver o mesmo tamanho do texto antigo, o modo de substituição do Vim é uma opção. No modo normal, R(esse é um "r" maiúsculo) leva você ao modo de substituição. Isso é semelhante a "substituir" em outros editores de texto: em vez de inserir novos caracteres, como no modo de inserção, a digitação substituirá o caractere sob o cursor e avançará para o próximo cursor. (Pense nisso como minúscula r, mas com mais de um caractere por vez.) Encontre a documentação para o modo de substituição por :help replace-mode.

No seu caso: com o cursor entre .e x, entre no modo de substituição pressionando R. Agora, quando você digita, gele substitui o "x" e passa para o próximo caractere, para que você possa digitar hpara substituir o "y". Sua edição está concluída agora, Escapepara retornar ao modo normal.

(Isso funciona quando o texto de substituição tem o mesmo tamanho do texto antigo, mas se a sua substituição for maior ou menor, cpode ser tudo o que você precisa: ele substituirá 1 o texto dentro de um movimento, pelo texto que você digitar. muitas maneiras de fazer uso c, por exemplo: com o cursor entre o .e x, ct.ABCEscapediz a c hange o texto (até ' t il a próxima .) com 'ABC').


1 Ele colocará o texto no movimento no nome / "registro sem nome e depois mudará para o modo de inserção, para que você possa digitar algo para substituí-lo e depois Escapevoltar ao modo normal.

alxndr
fonte
2
Isso funciona para este caso. E se você quisesse substituir esses 2 caracteres por 3 caracteres?
Gonçalo Ribeiro
11
Boa pergunta; alterado para incluir uma maneira de lidar com textos de tamanhos diferentes.
Alxndr
Sim, eu sei assim. Mas dessa forma, você entra no modo Inserir e fiquei curioso para ver se havia uma maneira de não usar o modo Inserir nesse caso. Não que eu ache isso muito útil (e ainda assim posso estar errado).
Gonçalo Ribeiro
11
Prefixo com um numeral npara substituir até a n-ésima ocorrência do caractere de destino. Isso é útil para substituir partes de etiquetas pelo formato w_x_y_ze a-b-c-d. Use em fvez de tpara remover também o caractere limitador.
Pkfm
5

Existem algumas maneiras de fazer isso, mas a mais simples que consigo pensar é:

TL; DR

fxcw<REPLACEMENT TEXT>

Explicação

  • fxpula você para o x (veja help *f*)
  • cwdiz para alterar a palavra (consulte :h *c*, :help *w*e :help cwpara obter mais informações), removendo o texto "xy" e entrando no modo de inserção, permitindo que você coloque o que quiser ali.
  • <TEXTO DE SUBSTITUIÇÃO> é o que você deseja substituí-lo por - "gh" no seu exemplo.

Uma vantagem dessa abordagem é que ela usa comandos de navegação e manipulação de texto muito comuns. Outra é que "xy" pode ter alguma extensão, e isso ainda funcionaria.

As cwobras porque o seu objeto de texto é cercado por períodos ( .), que funcionam como um limite à palavra.

Se o cursor já estiver no caractere "y" (ou qualquer caractere no texto a ser substituído), você poderá usar ciw<REPLACEMENT TEXT>. Isso diz ao vim para alterar a palavra em que você está, mesmo que você não esteja no começo. Consulte :help text-objectspara obter mais informações ciwe objetos de texto em geral.

Cody Poll
fonte
isso não o colocará no modo de inserção?
elyashiv 12/02
11
Ah - não entendi essa parte da pergunta dele. Nesse caso, sim - R é a solução mais apropriada.
Cody Poll
3

Modo de substituição:

Rgh<Esc>

é a solução mais óbvia se a substituição tiver o mesmo comprimento que o original, mas você também pode:

2sgh<Esc>

ou:

cegh<Esc>
romainl
fonte