Come sostituire più di un carattere senza accedere alla modalità di inserimento


12

Ho un file con una linea simile a questa:

foofoo.xy.barbar

Voglio cambiare la xya gh. Ho provato a fare 2r-> gh, ma ovviamente non ha funzionato, in quanto ha sostituito il xycon gge quindi spostato il cursore di un punto a sinistra.

Esiste un modo per farlo senza accedere alla modalità di inserimento o senza utilizzare molte più sequenze di tasti (ad esempio :s/xy/gh/)?


2
Rentra in modalità Sostituisci. :help replace-modeper maggiori informazioni.
alxndr,

Ci ho provato vt.rgh. Ma il risultato è stato uguale al tuo tranne che per la posizione del cursore.
Gonçalo Ribeiro,

2
Perché non vuoi entrare in modalità inserimento? Qualcosa del genere cwgh<esc>avrebbe funzionato bene.
Doorknob,

1
@ durron597 Non sono sicuro se minimize-keystrokesè un tag buona, di solito non è davvero quello che la domanda è su , in quanto tale. (Ho rifiutato le modifiche proposte) ... Forse dovresti discutere su meta?
Martin Tournoij,

Risposte:


19

Se il nuovo testo ha la stessa lunghezza del vecchio, la modalità di sostituzione di Vim è un'opzione. Dalla modalità normale, R(che è una "r" maiuscola) ti porta in modalità di sostituzione. Questo è simile alla "sovrascrittura" in alcuni altri editor di testo: invece di inserire nuovi caratteri come nella modalità di inserimento, la digitazione sostituirà il carattere sotto il cursore, quindi avanzerà al cursore successivo. (Pensa come in lettere minuscole r, ma per più di un singolo carattere alla volta.) Trova la documentazione per la modalità di sostituzione con :help replace-mode.

Nel tuo caso: con il cursore tra il .e il x, entra per sostituire la modalità premendo R. Quando digiti g, sostituisce la "x" e passa al carattere successivo, quindi puoi digitare hper sostituire la "y". La modifica è terminata ora, quindi Escapeper tornare alla modalità normale.

(Funziona quando il testo sostitutivo ha la stessa lunghezza del testo precedente, ma se la sostituzione è più lunga o più corta, cpotrebbe essere tutto ciò di cui hai bisogno: sostituirà 1 il testo all'interno di un movimento, con il testo che poi digiti. molti modi di fare uso c, per esempio: con il cursore tra il .e x, ct.ABCEscapedice di c hange il testo (fino ' t il prossimo .) con 'ABC').


1 Sposterà il testo nel movimento nel nome / "registro e poi passerà alla modalità di inserimento, in modo da poter digitare qualcosa per sostituirlo, quindi Escapetornare alla modalità normale.


2
Questo funziona per questo caso. E se volessi sostituire quei 2 caratteri dicendo 3 caratteri?
Gonçalo Ribeiro,

1
Buona domanda; modificato per includere un modo per gestire testi di diversa lunghezza.
alxndr,

Sì, lo so in questo modo. Ma in quel modo si entra nella modalità Inserisci ed ero curioso di vedere se c'era un modo per non usare la modalità Inserisci in quel caso. Non che lo ritenga molto utile (eppure potrei sbagliarmi).
Gonçalo Ribeiro,

1
Prefisso con un numero nper sostituire fino alla nnona occorrenza del personaggio bersaglio. Ciò è utile per sostituire parti di etichette con il formato w_x_y_ze a-b-c-d. Utilizzare finvece di trimuovere anche il carattere limitante.
pkfm,

5

Ci sono un paio di modi in cui potresti farlo, ma il più semplice che mi viene in mente è:

TL; DR

fxcw<REPLACEMENT TEXT>

Spiegazione

  • fxti porta alla x (vedi help *f*)
  • cwdice di cambiare la parola (vedere :h *c*, :help *w*e :help cwper ulteriori informazioni), rimuovendo il testo "xy" e accedendo alla modalità di inserimento, permettendoti di inserire quello che vuoi proprio lì.
  • <TESTO DI RICAMBIO> è qualsiasi cosa tu voglia sostituirlo con - "gh" nel tuo esempio.

Un vantaggio di questo approccio è che utilizza comandi di navigazione e di manipolazione del testo molto comunemente usati. Un altro è che "xy" potrebbe essere di qualsiasi lunghezza e funzionerebbe comunque.

I cwlavori perché il vostro oggetto di testo è circondato da periodi ( .), che agiscono come un confine per la parola.

Se il cursore si trova già sul carattere "y" (o su qualsiasi carattere nel testo da sostituire), è possibile utilizzare ciw<REPLACEMENT TEXT>. Questo dice a Vim di cambiare la parola in cui ti trovi, anche se non sei all'inizio. Vedere :help text-objectsper ulteriori informazioni ciwe oggetti di testo in generale.


questo non lo metterà in modalità inserimento?
elyashiv,

1
Ah - non ho colto quella parte della sua domanda. In tal caso, yes - R è la soluzione più appropriata.
Cody Poll

3

Sostituisci modalità:

Rgh<Esc>

è la soluzione più ovvia se la sostituzione è della stessa lunghezza dell'originale, ma è anche possibile:

2sgh<Esc>

o:

cegh<Esc>
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.