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), jeg
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
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
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
:%s/pattern/replace/
en druk vervolgens opu
om ongedaan te maken, je kunt zien welke delen Vim heeft gewijzigd als jehlsearch
hebt ingeschakeld. En je kunt deze tekst weer vervangen door^R
.