Substitua. com -> em locais específicos

7

Às vezes eu preciso para substituir .com ->a fixação de código.

Normalmente, pesquisar e substituir não pode ser usado porque haverá muitos (centenas de) pontos ( .) e apenas alguns deles devem ser alterados.

No entanto, encontro os que precisam ser alterados quando estou passando por uma lista de mudanças de make .

Usar o operador de repetição não funciona muito bem, porque se eu mudar uma instância e depois repetir com o comando dot, recebo o seguinte:

structBlah->.memberBlah

Se, em seguida, eu usar xpara excluir o ponto estranho, cole e o ponto não funcionará mais porque a última alteração foi uma exclusão.

Então, basicamente, o problema é que o operador de repetição repete um movimento e uma edição, enquanto aqui precisamos repetir duas edições: uma exclusão e uma inserção.

Existe alguma maneira conveniente de fazer isso? Uma ideia que tive foi usar talvez uma macro como esta:

xi-><ESC>
Tyler Durden
fonte
Quais comandos você está usando para fazer a primeira alteração? Minha primeira tentativa ingênua a<BS>-><Esc>(da mesma forma i<Del>-><Esc>) comandos são perfeitamente repetíveis para mim.
precisa saber é o seguinte
Use em svez de iexcluir um caractere e vá para o modo de inserção.
Shahbaz

Respostas:

8

O comando cw (change word) resolverá o seu problema.

Coloque o cursor no ponto e digite cw-><Escape>

something.somethingelse

torna-se em

algo-> algo mais

e o .operador ainda funcionará, porque cw é uma operação que realiza a exclusão e a substituição.

DoYouEvenCodeBro
fonte
11
Eu nunca pensei em usar a palavra mudança em um único caractere. Isso faz todo o sentido. Eu não sabia que um período é considerado uma "palavra". Existe um comando "alterar caractere" (excluir caractere e entrar no modo de entrada)?
Tyler Durden
11
@Tyler Durden Change é na verdade um comando que pode ser seguido por qualquer movimento, como o comando delete (d). Então você pode digitar cl para alterar o caractere para a esquerda, c2l para alterar 2 caracteres, c $ para alterar para o final da linha, ct; Para mudar para o ponto e vírgula, etc ...
DoYouEvenCodeBro
8
Usar cw para um único caractere é muita digitação. Basta usar s.
Kevin
11
@ Tyler Durden Haha, você tentou minha solução? Faz o mesmo com menos pressionamentos de tecla. Substitua spor cwe você a possui.
precisa
11

Você pode usar o soperador, que exclui o caractere sob o cursor e o coloca no modo de inserção. Você pode digitar a substituição e usá-la posteriormente .para repetir a substituição inteira. O fluxo de trabalho se torna:

  1. /\. para destacar todos os períodos.
  2. n para o primeiro ponto
  3. s->e depois Esc. Isso substituirá o ponto e inserirá o texto com uma única operação.
  4. n para o próximo ponto
  5. . para mudar quando necessário.

:h s para mais informações.

Tumbler41
fonte
Como eu disse na minha pergunta, isso não é prático, porque existem centenas de pontos e apenas alguns locais específicos em que a substituição precisa ser feita.
Tyler Durden
3
Ok, nesse ponto, seu problema se torna um problema de filtragem, que não é o que você pediu. Tentei responder à sua pergunta sobre duas edições. Agora isso pode ser feito em um. Eu recomendo que você editar a sua pergunta se o problema é realmente encontrar quais pontos para substituir,
Tumbler41
11
Eu disse especificamente na minha pergunta "... pesquisar e substituir não pode ser usado porque haverá muitos (centenas de) pontos (.) E apenas alguns deles devem ser alterados" . A lista de alterações está sendo usada para encontrar as instâncias em que a alteração deve ser feita, como diz minha pergunta.
Tyler Durden
11
Em seguida, faça a alteração uma vez com a ssolução proposta acima e poderá usá-la no próximo item da sua lista de alterações.
nobe4
2
@TylerDurden Esta não é uma pesquisa e substituição; @ tumbler41 sugeriu usar a pesquisa e najudar a encontrá-los, mas a principal otimização aqui é usar o s->Esc. Essas quatro teclas criam a alteração textual de que você precisa, e você pode usar .para repetir a ação onde quiser.
Desty 07/07
7

Eu recomendo usando o comando substitute:

:%s/\./->/gc

Isso vai:

:%s     substitute over all lines
/\.     match dot
/->     replace by arrow
/g      replace all on lines
c       ask for confirmation

Isso examinará todo o .seu arquivo e perguntará sempre se você deseja substituir.

Pressione ypara substituir, npara ir para o próximo ponto.

veja :h :s_cpara todas as opções.

nobe4
fonte
11
Como eu disse, isso não é prático porque existem centenas de pontos e apenas alguns locais específicos onde a substituição precisa ser feita.
Tyler Durden
11
É possível substituir :%por :g/.../para substituir apenas nas linhas correspondentes, :'<,'>pelas linhas atualmente selecionadas ou pelas :.ou :pela linha atual e use @:para repetir o comando nas linhas específicas pelas quais você navega de alguma outra maneira.
Deltab
7

Se você não deseja usar uma substituição ou o comando ponto, conforme sugerido pelas outras respostas, sua melhor aposta é provavelmente criar uma macro que possa ser usada quando o cursor estiver próximo a um ponto.

Você pode gravar a macro

qaf.vc->^[q

Que irá para o seguinte ponto na linha ( f.) selecione-o visualmente ( v) e o substitua ( c->).

Agora, quando você navega no seu código e identifica um ponto que deve ser alterado, pode chamar a macro com @a.

Você pode até colocar isso no seu .vimrcpara manter a macro entre as diferentes sessões de codificação:

let @a="f.vc->^["

Edite @grochmal sugerido nos comentários para usar um segundo registro para ter uma macro de retrocesso que parece bastante útil:

let @e="F.vc->^["
statox
fonte
Isto é o que eu faria. A única diferença é que eu usaria dois registradores let @q="F.vc->^["e let @w="f.vc->^["", e teria um ponto anterior e um próximo comando de ponto .
grochmal 07/07
@grochmal: Eu não pensei sobre isso, mas este é inteligente :-)
statox
Você não precisa de um <ESC>antes do qna macro? (Não tenho acesso a um computador, então não o testei).
Loovjo 07/07
@loovjo: você está certo, eu vou editar isso, obrigado!
Statox