Eu tenho um arquivo com uma linha que se parece com isso:
foofoo.xy.barbar
Eu quero mudar o xy
para gh
. Eu tentei fazer 2r-> gh, mas, obviamente, isso não funcionou, pois substituiu o xy
por gg
e 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/)?
replace
repeated-commands
durron597
fonte
fonte
R
entra no modo de substituição.:help replace-mode
Para maiores informações.vt.rgh
. Mas o resultado foi o mesmo que o seu, exceto na posição do cursor.cwgh<esc>
iria funcionar bem.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?Respostas:
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
.
ex
, 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,
c
pode ser tudo o que você precisa: ele substituirá 1 o texto dentro de um movimento, pelo texto que você digitar. muitas maneiras de fazer usoc
, por exemplo: com o cursor entre o.
ex
, ct.ABC
Escapediz 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.fonte
n
para substituir até an
-ésima ocorrência do caractere de destino. Isso é útil para substituir partes de etiquetas pelo formatow_x_y_z
ea-b-c-d
. Use emf
vez det
para remover também o caractere limitador.Existem algumas maneiras de fazer isso, mas a mais simples que consigo pensar é:
TL; DR
fxcw<REPLACEMENT TEXT>
Explicação
fx
pula você para o x (vejahelp *f*
)cw
diz para alterar a palavra (consulte:h *c*
,:help *w*
e:help cw
para obter mais informações), removendo o texto "xy" e entrando no modo de inserção, permitindo que você coloque o que quiser ali.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
cw
obras 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-objects
para obter mais informaçõesciw
e objetos de texto em geral.fonte
Modo de substituição:
é a solução mais óbvia se a substituição tiver o mesmo comprimento que o original, mas você também pode:
ou:
fonte