Existe um comando no Vim / Vi para mover o cursor para o final de um destaque de pesquisa?

86

Existe algum comando no Vim / Vi para mover dentro de um segmento de pesquisa selecionado?

Por exemplo, se eu pesquisar uma palavra, há algum comando para mover o cursor para o final do segmento destacado? Digamos que eu tenha uma palavra, "FishTaco" e desejo pesquisar todas as ocorrências de "Fish" e inserir algo depois dela. Eu sei que poderia fazer uma substituição global, mas e se eu quiser fazer a alteração apenas em algumas instâncias não sequenciais?

Pude ver onde seria conveniente mover o cursor para o final do segmento realçado atual para executar uma ação.

Jordan Parmer
fonte
3
Esta não é uma resposta à pergunta, mas para atingir seu objetivo final de substituir todos Fishpor FishTaco, você pode fazer :%s/Fish\(Taco\)\@!/&Taco/, o que encontrará todos os que ainda Fishnão foram seguidos Tacoe substituirá por FishTaco. Combina uma pesquisa antecipada negativa com uma substituição que inclui o termo correspondente seguido por Taco.
Jim Stewart
@JimStewart Não tenho ideia de por que este comentário não tem pelo menos tantos + 1s quanto a resposta. Este é o nível de vim ninja.
Still.Tony

Respostas:

135

Você pode fazer isso com isto:

/Fish/e

O /eno final coloca o cursor no final da região de pesquisa (em vez do primeiro caractere por padrão.

Tim
fonte
32
Observe que você pode adicionar + n ou -n para colocar o cursor n caracteres antes ou depois do final.
Nathan Fellman
10
É importante notar que depois de já ter feito a /Fishpesquisa, você pode pular para o final com //ee do Vim 7.4, você pode usar gnpara destacar visualmente o resultado encontrado.
smathy
Dê uma olhada na resposta de @ghbarratt também, mais opções para localizar o cursor na correspondência destacada.
Nima
82

Se você quiser apenas colocar o cursor após o último caractere de Peixe, você pode usar

/Fish/e+1

que colocará o cursor após h. (Sem o+1 o cursor terminará à esquerda do último caractere.)

Se estiver particularmente interessado em colocar o cursor depois de Fish, mas apenas quando ele aparecer em "FishTaco", você pode tentar uma das seguintes opções:

Você pode usar

/FishTaco/s+4

e o cursor ficará entre Fish e Taco. O /s+4posiciona o cursor 4 posições após o início do termo de pesquisa.

Você também pode usar

/FishTaco/e-3

que colocará o cursor 3 lugares à esquerda do lado esquerdo do último caractere (final).

Você também pode usar

/FishTaco/b+4 

porque /b+4será tratado como /s+4.

ghbarratt
fonte
14
Ótima explicação, mas agora estou com fome.
Kenny
28

Se você já pesquisou /Fish, pode mudar rapidamente a pesquisa para ir ao final da correspondência via //e, que repete a última pesquisa, mas acrescenta o emodificador que já foi explicado.

Ingo Karkat
fonte
1
o // e + número é exatamente o que eu estava procurando! impressionante.
arkod de
13

/ long-regexp1 \zs long-regexp2 / .. o cursor irá parar em \ zs , veja: help \ zs

mosh
fonte
12

Depois de ter uma seleção visual, você pode usar opara alternar a posição do cursor entre o início e o fim do bloco selecionado. Quando a seleção é feita em linha, isso alterna a linha posição , o que significa que o cursor se move para a linha inicial e final da seleção, mas não para o caractere inicial ou final. Quando a seleção é baseada em caracteres, o movimento também é feito em função de caracteres.

Você também pode usar `<e`> para alternar o cursor entre o início e o fim do bloco visual, no entanto, isso afeta a própria seleção, por isso é usado para redefinir ou ajustar os limites da seleção.

Edit: Ah, mas para destaques de pesquisa isso não funcionará, porque oirá iniciar uma inserção de linha. Acho que o destaque da pesquisa não é o mesmo que uma seleção visual, desculpe :)

kprobst
fonte
Eu também não sabia disso. Isso é ótimo para modificar o início de uma seleção sem começar de novo. (por exemplo, você começou a seleção com uma palavra antes ou tarde demais)
Timothée Boucher
9

A parte "cursor no final da partida" da sua pergunta já foi respondida.

Você pode fazer :%s/Fish/FishTaco/c. Isso lhe dá a oportunidade de confirmar ou rejeitar todas as substituições e pular todo o negócio de "cursor no final da partida".

romainl
fonte
Dica incrível. Se eu inserir 'y', a substituição será feita apenas no primeiro. Como faço para confirmar para cada um?
Jordan Parmer
1
Ele vai para a próxima correspondência e espera que você digite you ne assim por diante até que não haja mais correspondências. Para aceitar todas as outras substituições, digite a; para rejeitá-las, digite q.
romainl
1
Na verdade, eu estava perdendo o gpós-final, /então não estava continuando na minha fila. Obrigado pela dica.
Jordan Parmer