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.

Roger Lipscombe
fonte
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.

romainl
fonte
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."

jecxjo
fonte
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)

Kristian
fonte