C'è un comando in Vim / Vi per spostare il cursore alla fine di un'evidenziazione di ricerca?


86

Ci sono comandi in Vim / Vi per spostarsi all'interno di un segmento di ricerca selezionato?

Ad esempio, se cerco una parola, ci sono comandi per spostare il cursore alla fine del segmento evidenziato? Supponiamo che io abbia una parola, "FishTaco" e che desidero cercare tutte le istanze di "Pesce" e inserire qualcosa dopo di essa. So che potrei fare una sostituzione globale, ma cosa succede se voglio apportare la modifica solo in un paio di istanze non sequenziali?

Ho potuto vedere dove sarebbe conveniente essere in grado di spostare il cursore alla fine del segmento evidenziato corrente per eseguire un'azione.


3
Questa non è una risposta alla domanda, ma per raggiungere il tuo obiettivo finale di sostituire tutto Fishcon FishTaco, potresti farlo :%s/Fish\(Taco\)\@!/&Taco/, che troverà tutto ciò che Fishnon è già seguito Tacoe lo sostituirà con FishTaco. Combina una ricerca anticipata negativa con una sostituzione che include il termine corrispondente seguito da Taco.
Jim Stewart

@ JimStewart Non ho idea del motivo per cui questo commento non abbia almeno tanti +1 come risposta. Questo è il livello ninja vim.
Still.Tony

Risposte:


135

Puoi farlo con questo:

/Fish/e

Alla /efine il cursore si trova alla fine della regione di ricerca (invece del primo carattere per impostazione predefinita.


32
Si noti che è possibile aggiungere + n o -n per posizionare il cursore n caratteri prima o dopo la fine.
Nathan Fellman

10
Da notare che dopo aver già fatto la /Fishricerca puoi saltare alla fine con //ee da Vim 7.4 puoi usare gnper evidenziare visivamente il risultato trovato.
smathy

Dai un'occhiata anche alla risposta di @ghbarratt , più opzioni per individuare il cursore sulla corrispondenza evidenziata.
Nima

82

Se vuoi solo posizionare il cursore dopo l'ultimo carattere di Pesce, puoi usare

/Fish/e+1

che posizionerà il cursore dopo la h. (Senza il+1 cursore il cursore finirà a sinistra dell'ultimo carattere.)

Se sei particolarmente interessato a posizionare il cursore dopo Fish, ma solo quando appare in "FishTaco", puoi provare una delle seguenti opzioni:

Puoi usare

/FishTaco/s+4

e il tuo cursore finirà tra Fish e Taco. Il /s+4posiziona il cursore 4 posizioni dopo l'inizio del termine di ricerca.

Puoi anche usare

/FishTaco/e-3

che posizionerà il cursore di 3 posizioni a sinistra del lato sinistro dell'ultimo carattere (fine).

Puoi anche usare

/FishTaco/b+4 

perché /b+4verrà trattato come /s+4.


14
Ottima spiegazione, ma ora ho solo fame.
kenny

28

Se hai già cercato /Fish, puoi cambiare rapidamente la ricerca per andare alla fine della partita tramite //e, che ripete l'ultima ricerca, ma aggiunge il emodificatore che è già stato spiegato.


1
il // e + numero è esattamente quello che stavo cercando! eccezionale.
Arkod

13

/ long-regexp1 \zs long-regexp2 / .. il cursore si fermerà su \ zs , vedere: help \ zs


12

Una volta che hai una selezione visiva, puoi usare oper alternare la posizione del cursore tra l'inizio e la fine del blocco selezionato. Quando la selezione è in linea, questa alterna la linea posizione , il che significa che il cursore si sposta sulla riga iniziale e finale della selezione ma non sul carattere iniziale o finale. Quando la selezione è basata sul carattere, il movimento è anche sul carattere.

È inoltre possibile utilizzare `<e `>per spostare il cursore tra l'inizio e la fine del blocco visivo, tuttavia ciò influisce sulla selezione stessa, quindi viene utilizzato per ripristinare o regolare i limiti della selezione.

Modifica: Ah, ma per le evidenziazioni di ricerca questo non funzionerà, perché oavvierà un inserimento di riga. Immagino che l'evidenziazione della ricerca non sia la stessa di una selezione visiva, mi dispiace :)


Non lo sapevo nemmeno io. Questo è ottimo per modificare l'inizio di una selezione senza ricominciare. (es. hai iniziato la selezione una parola troppo presto o troppo tardi)
Timothée Boucher

9

La parte "cursore alla fine della corrispondenza" della tua domanda ha già una risposta.

Puoi farlo :%s/Fish/FishTaco/c. Questo ti dà l'opportunità di confermare o rifiutare ogni sostituzione e di saltare l'intera operazione "cursore alla fine della partita".


Suggerimento fantastico. Se inserisco "y" esegue la sostituzione solo al primo. Come posso confermarlo per ciascuno?
Jordan Parmer

1
Va alla corrispondenza successiva e attende che tu digiti yo ne così via fino a quando non ci sono più corrispondenze. Per accettare tutte le ulteriori sostituzioni, digitare a, per rifiutarle digitare q.
romainl

1
In realtà, mi mancava il gdopo la finale, /quindi non è stato possibile continuare nella mia linea. Grazie per il consiglio.
Jordan Parmer
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.