Kan ik een interactive: substitute (zoek & replace) doen?

Soms gebruik ik :s met een gecompliceerde regexp die al dan niet correct is, of ik “niet zeker als ik alle overeenkomsten wil vervangen.

Is er een manier waarop ik Vim kan vertellen om elke gevonden overeenkomst te bevestigen voordat deze de tekst daadwerkelijk vervangt?

Answer

Ja! Gebruik de c vlag voor :substitute. Van :help substitute:

[c] Confirm each substitution. Vim highlights the matching string (with hl-IncSearch). You can type: :s_c "y" to substitute this match "l" to substitute this match and then quit ("last") "n" to skip this match <Esc> to quit substituting "a" to substitute this and all remaining matches {not in Vi} "q" to quit substituting {not in Vi} CTRL-E to scroll the screen up {not in Vi, not available when compiled without the +insert_expand feature} CTRL-Y to scroll the screen down {not in Vi, not available when compiled without the +insert_expand feature} 

Voorbeeldgebruik is heel eenvoudig:

%s/old/new/gc 

Dit is erg handig, maar wist dit pas 2 weken geleden 🙂 En het is zelfs beschikbaar in oude “vi 🙂

Bonustip: misschien wilt u ook :set nowrapscan; dit voorkomt dat Vim zich naar boven wikkelt wanneer hij de bodem raakt. Ik “vond dit vooral handig bij het gebruik van de c vlag.

Opmerkingen

  • Ik zou ook willen toevoegen dat als je alle instanties van old op dezelfde regel wilt vervangen (niet alleen de eerste keer), je g aan het einde van het commando, dus in totaal heb je %s/old/new/gc
  • Oh, ja; ik heb set gdefault dus ik ben geneigd om het toe te voegen in voorbeelden @ e271p314 😅

Antwoord

Naast wat Carpetsmoker zei:

De &incsearch (set incsearch) instelling in Vim is erg handig. Je kunt gebruik het samen met een nuttige en weinig bekende truc.

De truc is om je complexe regex uit te proberen door alleen de / of commando. Vim zal de &incsearch instelling gebruiken om overeenkomsten interactief weer te geven. Onc Als je tevreden bent met de regex, kun je :%s//replacement gebruiken om vim de vorige zoekopdracht te laten gebruiken.

Merk op hoe het deel in // is leeg (dat is waar je de tekst plaatst om te zoeken). Als je het leeg laat, vertel je Vim om de vorige zoekregex te gebruiken. Hiermee kunt u een complexe regex typen met / en profiteren van alle voordelen van set incsearch, en vervolgens de %s//replacement commando om het zoeken en vervangen daadwerkelijk uit te voeren.

Als je iets wilt dat lijkt op incsearch voor :s commandos, bekijk dan vim-over , maar ik gebruik liever de native Vim-manier.

Reacties

  • Ik gebruikte hiervoor een variant: gebruik gewoon :%s/pattern/replace/ en druk vervolgens op u om ongedaan te maken, je kunt zien welke delen Vim heeft gewijzigd als je hlsearch hebt ingeschakeld. En je kunt deze tekst weer vervangen door ^R.

Antwoord

Mijn favoriete interactieve vervanging is zoeken met / en de overeenkomsten doorlopen met n .

selecteer match met g n en vervolgens s naar vervang de tekst door wat ik maar wil .

En herhaal door naar de volgende wedstrijd te gaan en op te drukken.

Reacties

  • Dit is een erg leuke truc, want het is: (1) interactief, (2) je kunt naar de vorige wedstrijd gaan als je per ongeluk hebt overgeslagen it (iets dat je niet kunt doen met :s/old/new/gc).

Antwoord

In Neovim is er ook de

optie waarmee u een voorbeeld van het resultaat van het :s commando kunt zien terwijl u het typt.

Answer

Ten behoeve van iedereen is incsearch bijgewerkt in vim8 om ook een voorbeeld weer te geven terwijl u het patroon typt

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *