Ir para a próxima ocorrência da palavra que acabei de alterar


12

Se eu tiver o seguinte:

function foo(bar) {
    return bar + 1;
}

E eu uso cwpara alterar o primeiro barpara baz, como pulo para a próxima correspondência bar, para que eu possa usar .para fazer a mesma alteração?

Não posso usá-lo *, porque ele procura a palavra atual sob o cursor e, tolamente, não procurei pela barprimeira vez, portanto nnão funcionará.

Existe uma maneira simples de procurar a próxima ocorrência da palavra como era antes de eu a alterar?

Eu não quero fazer uma pesquisa e substituir, porque existem outras ocorrências barno meu arquivo que eu não quero alterar ou porque havia apenas duas instâncias bare eu esqueci :%s/bar/baz/antes de começar e isso é muito muito esforço para alterar a única instância restante.


2
Isso não segue totalmente o fluxo de trabalho que você descreveu, mas o vim-oblique aprimora a *pesquisa. Especialmente, *seleciona visualmente a palavra atual sem mover o cursor. Uma vez instalado, você pode *ciwcolocar a palavra antiga no registro de pesquisa e alterar a palavra. Então você pode usar ne ..
Statox

Pressionar n moverá você para a próxima ocorrência do último padrão pesquisado. Por que você não tentou isso?
SibiCoder

... porque não procurei chegar à primeira ocorrência, nnão funcionaria.
Roger Lipscombe

Respostas:


14

O texto com o qual você acabou de alterar cwfoi cortado no registro sem nome para que você possa reutilizá-lo com:

/<C-r>"<CR>

para pular para a próxima ocorrência do texto coberto por sua última alteração.


5

Para estender o romainl como um fluxo de trabalho completo ...

Se você deseja executar uma edição desse tipo e perceber que precisa aplicar as mesmas edições em um parágrafo / função, use os registradores "e ..

No seu exemplo, você pode executar a edição inicial do argumento. Se você entrar no modo visual (eu usaria o Visual Line apenas para ter certeza de selecionar tudo corretamente) e, em seguida, aplique uma localização e substituição.

V]] - Linha visual, até o final do parágrafo / função.

  • : - Como você está no modo visual, isso se torna :'<,'>
  • s/ - Encontrar
  • CTRL+ "- último item de arranque / exclusão (barra no exemplo)
  • / - e substituir
  • CTRL+ .- última inserção (baz no exemplo)

Esse padrão leva um tempo para se acostumar, já que você precisa usá-lo. Na maioria das vezes, você deseja aplicar a localização e a substituição a toda a função, incluindo o argumento, mas é uma boa maneira de não executar o antipadrão "Faça o trabalho, perceba que você deveria ter feito melhor, desfazer e refazer corretamente."


2

Se você não se importa em pressionar uma combinação diferente cw, acredito que você pode obter o que deseja facilmente, definindo um atalho. O que você pode fazer é colocar o seguinte

nmap <leader>a "1yiw:let @/=@1^Mciw

no seu .vimrcarquivo. Observe que ^M é uma captura da chave de retorno, e não os caracteres ^e M. Você obtém pressionando Ctrl+ Vno modo de inserção seguido de Enter. Agora, com isso definido, pressionar <leader>afará o mesmo que cw, mas agora a palavra (anterior à alteração) estará em seu "último registro de pesquisa" (ou seja, o /registro), portanto, pressionar ndepois de fazer a alteração e retornar ao modo normal, você será levado para a próxima ocorrência. Da mesma forma, pressionar pressionará Nvocê para a ocorrência anterior.

O atalho É claro que você pode escolher um atalho diferente <leader>a, mas acho que esse é um atalho muito acessível. Pessoalmente, eu configurei <leader>para ,que eu só precise pressionar ,seguido de a, mas isso ocorre porque eu não uso um teclado americano, para que o meu \fique oculto um pouco (acredito que \seja o padrão <leader>).

Explicação A ideia é realmente simples. Arranque a palavra sob o cursor para o registro de pesquisa /e faça cw. Assim nmap <leader>a "/yciwera o que eu estava buscando, mas infelizmente eu não acho que você pode arrancar para o registo de pesquisa, de modo que a solução é arrancar a palavra sob o cursor para o 1registo, em seguida, definir o /registo igual a isso, e depois fazer cw. O mesmo "1yiwacontece com a parte que puxa a palavra interna sob o cursor para o registro 1. Se você não conhece as palavras interiores, pode conferir :help iw. Depois, :let @/=@1segue uma captura de Entercoloca o conteúdo do 1registro no arquivo /. Neste ponto neNfunciona como a ocorrência seguinte e anterior da palavra sob o cursor e a ciwé feito para que a palavra sob o cursor seja excluída e o Vim seja colocado no modo de inserção.

palavra versus palavra interna Acabei de perceber que assumi que você queria a palavra inteira sob o cursor, e não apenas do ponto do cursor em diante. É por isso que eu usei em iwvez de em wqualquer lugar. Se não for esse o caso, você deve usar

nmap <leader>a "1yw:let @/=@1^Mcw

em vez de. Se o cursor estiver na primeira letra da palavra, não há diferença.

aviso Esta solução provavelmente não vai funcionar bem se você tentar usá-lo em algo que contém diferentes coisas de letras, por exemplo, tendo o suporte cursor em um \ou substituindo iwpor iW, ib, isou ipou algo (embora eu não sei por que você faria quer esse recurso com frases inteiras)

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.