Vim tips: Det grunnleggende søk og replace

Let start ved å se på søk og gjør søk og erstatt operasjoner innen Vim. Du kan gjøre et søk i normal modus ved å bruke / search
. Dette vil søke frem gjennom filen for search
. Likeledes kjører? search
vil søke bakover i filen.

Etter å ha kjørt et søk en gang, kan du gjenta det ved hjelp av n i kommandomodus, eller N reversere retning.

Når du ønsker å søke etter en tekststreng og erstatte den med en annen tekststreng, kan du bruke følgende syntaks: [utvalg] s / søk Twitter / erstatte Twitter /. Utvalget er valgfritt; hvis du bare kjøre: s / søk Twitter / erstatte Twitter /, vil det bare søke den aktuelle linjen og kamp bare den første forekomsten av et begrep

De fleste av de. tid, det er ikke tilstrekkelig, slik at du kan legge til en rekke som så:

: 8,10 s / søk Twitter / erstatte Twitter /g

I dette eksempelet området er fra linje 8 til linje 10. Jeg har også lagt til "global" alternativet, som forteller Vim for å erstatte alle forekomster på en linje, og ikke bare den første forekomsten. Uten å legge g, vil søket matche bare det første tilfellet av en streng i en gitt linje.

En annen måte å angi området er å gå inn visuell modus og velg linjene som du ønsker å søke, og trykk deretter på : å gå inn kommando-modus. For å legge inn visuelle modus fra normal modus trykker v velge vanlig visuell modus, eller V for linjevalg, eller Ctrl-v for blokk utvalg. Deretter velger du området i visuell modus og trykk:., Etterfulgt av søke kommandoen du ønsker å bruke

Hvis du ønsker å søke en hel fil, kan du bruke% som tyder på at rekkevidden:

:% s / søk Twitter / erstatte Twitter /g

Du kan også ønske å bli spurt om bekreftelse før Vim gjør et bytte. For å gjøre dette, legger confirm (c) muligheten til slutten av søk og erstatt kommando::% s / søk Twitter / erstatte Twitter /gc. Når du kjører dette søket, vil Vim gi deg en melding som ser omtrent slik ut:

erstatte med foo (y /n /a /q /l /^ E /^ Y)?

"y" og "n" er selvforklarende, men hva med resten? Å fortelle Vim å gå videre og erstatte alle forekomster av den matchet strengen, svarer med en. Hvis du innser at du ikke egentlig ønsker å gjøre endringer, kan du fortelle Vim å avslutte driften ved hjelp av q. Å fortelle Vim for å gjøre den gjeldende endring og deretter stoppe, bruk l, for sist.

^ E og ^ Y tillate deg å rulle teksten ved hjelp av Ctrl-e og Ctrl-y.

hvor du lander

søk i Vim sette markøren på det første tegnet av den matchet strengen som standard; hvis du søker etter Debian, ville det sette markøren på D. Det er vanligvis greit, men Vim har noen alternativer for å utligne markøren plasseringen fra begynnelsen av matchet strengen.

For å lande på det siste tegnet i matchet strengen, snarere enn begynnelsen, legger en /e for søket ditt:

/Debian /e

Det vil plassere markøren på n snarere enn D. Vim tillater også du angi en markør motvirket av linjen, eller fra begynnelsen eller slutten av strengen. Slik at markøren land to linjene over en matchet streng, for eksempel bruke / string Twitter /-2. Å plassere markøren to linjer under streng, bruker / string Twitter /+ 2.

For å oppveie fra begynnelsen av strengen, legger a /b eller /s med forskyvningen som du ønsker. For eksempel å flytte tre tegn fra begynnelsen av søket, vil du bruke / string Twitter /s + 3 eller / string Twitter /b + 3 - "s" for " start "eller" b "for" begynner ". Å telle fra slutten av strengen, bruk /e stedet, så / string Twitter /e-3 vil plassere markøren på den tredje tegnet fra det siste tegnet av matchet strengen.
Neste: Vim er spesialtegn

Nå som vi har fått grunnleggende søk syntaks dekket, er det på tide å se på noen av Vim spesielle tegn for å gjøre søk litt mer effektiv. Søke etter en streng er uaktuelt hvis du prøver å matche hver URL i en fil, eller hver kommentar i en bash eller Perl-skript.

Det første tegnet du ønsker å bli kjent er ydmyke prikk. I et søk, en prikk eller punktum (.), Vil matche ethvert enkelt tegn. Gjør et raskt søk ved hjelp av /. og du vil se at det stemmer, bokstavelig talt, alt -. bokstaver, tall, mellomrom, hele settet og Kaboodle

Hva om du ønsker å matche et begrep på begynnelsen eller slutten av en linje? Vim bruker cirkumflekstegnet å matche begynnelsen av en linje (^) og dollartegn å matche slutten av en linje ($). For eksempel, for å finne en linje i et bash script som begynner med en kommentar, kan du bruke #. For å finne tomme linjer, bare bruke ^ $ som vil matche ethvert linje uten noen tegn.

For å matche mellomrom, bruke \\\\ s operatør. Hvis du ønsket å finne tomme linjer som inneholder noe annet enn mellomrom, kan du bruke ^ \\\\ s. * $. Dette vil matche linjer med mellomrom, men ingen andre tegn - det vil ikke matche tomme linjer uten tomrom. Derimot, vil \\\\ S operatør matche ikke-blanke tegn.

\\\\ d Operatøren vil matche ethvert siffer i et søk, mens \\\\ D operatøren vil matche enhver ikke-sifret i et søk. Å matche noen stor bokstav, bruker \\\\ u, mens \\\\ l vil matche enhver liten bokstav. Bruke \\\\ U vil matche enhver ikke-stor bokstav, og \\\\ L vil matche enhver ikke-liten bokstav.

Det er en subtil forskjell mellom å matche enhver liten bokstav og matchende enhver ikke-stor bokstav, og matchende eventuelle stor bokstav og matchende enhver ikke-liten bokstav. Hvis du bruker \\\\ u det vil bare matche en stor bokstav - men hvis du bruker \\\\ L det vil matche enhver stor bokstav og Selge alle andre tegn som ikke er en liten bokstav; så det ville matche mellomrom, tall, tegnsetting, og så videre.

Hva skjer når du faktisk ønsker å søke etter en spesiell karakter, for eksempel et dollartegn eller vinkeltegn? Spesialtegn kan rømte med omvendt skråstrek, så bruk \\\\ $ for å søke etter et dollartegn i filen, eller \\\\ ^ for å søke etter cirkumflekstegnet, og så videre. Merk at omvendt skråstrek er i seg selv en spesiell karakter, så du må bruke to backslashes sammen.

Du kan også ønske å avgrense søketermer av ordgrenser. Si at du gjør et søk etter sig
bruker Vim. Dette vil matche sig, signatur, signering, og en rekke andre strenger som du ikke ønsker å matche. Det kan virke som en god idé å inkludere mellomrom på hver side av søkeordet, som så:

s / sikt Twitter / erstatte Twitter /gc
< p> Det vil gjøre en bedre jobb med å matche bare søkestrengen, men det vil gå glipp av strengen hvis det er på slutten av en setning, eller atskilt med komma. For å sikre at du får riktig match, bruke \\\\ å matche slutten av et ord. I så fall ville den søkefrasen bli bedre skrevet som:

s /\\\\ < sikt
\\\\ > / erstatte Twitter /gc

Antall teller

Hvis du er heldig, foreldrene dine lært deg i tidlig alder ikke å være grådig. Det er en god regel i livet, og vanligvis en god regel i å søke og erstatte bruker Vim også.

Vim lar deg spesifisere hvor mange av noe du ønsker å matche ved å legge quantifiers til begrepet. Noen av quantifiers regnes som "grådig" fordi de passer så mange av de spesifiserte tegnene som mulig. Andre er ikke grådig, fordi de matche et bestemt antall eller så få som mulig.

Som et eksempel forteller * kvantifikator Vim å matche 0 eller mer av en karakter. Så, et søk som /abc * vil matche abc, Abby, og helt.

For å matche en eller flere, bruke \\\\ + kvantifikator. Et søk etter /abc \\\\ + vil matche abc, men ikke Abby eller absolutt. For null eller en, bruke \\\\ =, som ville matche abc, Abby, og helt.

Vim kan være enda mer presis, og gjør at du kan angi et eksakt tall eller et område. Syntaksen for dette er \\\\ {0,10}, der søke ville matche 0 til 10 tilfeller av karakteren. For eksempel, for å matche en streng med minst fem store bokstaver, men ikke mer enn syv, kan du bruke /\\\\; Dette fordeler seg som "matcher begynnelsen av et ord, deretter fem til syv store bokstaver, og deretter på slutten av et ord."

Hvis du ønsker å matche en rekke tegn akkurat
, bruke \\\\ {n} der n er nummeret. Ønsker du å finne alle de tre-bokstavs ord i en fil? Bruk /\\\\ og du vil finne alle tre bokstaver streng i filen. Selvfølgelig kan som samsvarer ikke-ord strenger, slik at du kan bruke /\\\\ stedet. Den \\\\ w forteller Vim å matche "ord tegn", slik at det ikke vil matche sifre, tegnsetting og lignende.

Du kan også begrense det ned til "på de fleste" eller "minst" en viss antall tegn. Som du allerede har lært, er syntaksen for å matche et minimum til maksimum antall forekomster \\\\ {x, y}, med x være minimum og y være det maksimale. Så, bare slippe minimum eller maksimum antall, og holde komma. Å se at i aksjon, løpe /\\\\ < \\\\ w \\\\ {5,}. Som vil matche ord minst fem tegn. For å matche ord ikke lenger enn fem bokstaver, bruk /\\\\ < \\\\ w \\\\ {, 5}

Til slutt kan du bruke \\\\ {-} for å fortelle Vim å matche så lite som mulig. . La oss si at du prøver å matche HTML-koder i en fil. Søker etter kampene for mye. Hvis du har et avsnitt vedlagt i

koder, ville Vim matche hele avsnittet i stedet for individuelle koder. For å matche individuelle koder, bruk. Dette ville fortelle Vim å matche karakter og så stoppe.

La oss være ufølsom

Som du sikkert er klar over, søk i Vim er store og små bokstaver. GNOME, Gnome, og gnome er helt forskjellige, så langt som Vim er bekymret. Men hva hvis du ønsker å søke etter alle tre på samme tid, uten å ty til alvorlig regex-foo? Enkelt - fortell Vim å være case-insensitive bruker set ignorecase. Når ignorecase er satt, vil et søk etter gnome matche GNOME, Gnome, og gnome

Hvis du etter en stund, bestemmer du du vil at case-følsomhet, veksle den på igjen ved hjelp av:.. Satt noignorecase

Hvis du ikke ønsker å veksle case-følsomhet på og av hele tiden, kan du bare bruke \\\\ c og \\\\ C modifikatorer. Den \\\\ c modifier forteller Vim å være store eller små bokstaver, og \\\\ C forteller Vim å være store og små bokstaver.

For eksempel vil søke bakover gjennom teksten, slik at søket er case-sensitive, bruke? \\\\ C mønster
, så? \\\\ CGNOME vil bare matche GNOME, ikke Gnome eller Gnome. Selvfølgelig, dette fungerer for meg søker også, slik at du kan bruke /\\\\ CGNOME stedet.

Et annet triks er å bruke Smart alternativet. Bruk: sette ignorecase Smart veksling, og hvis søketermen har minst én stor bokstav, vil Vim bytte til store og små bokstaver; ellers vil den bruke case-insensitive søk.

Til slutt, hvis du ønsker å bevare case-sensitivitet, men søke etter et ord som kan ha en stor bokstav eller liten bokstav i én posisjon, kan du bruke en rekke i stedet. For å matche SuSE eller SUSE, bruker du /S [Uu] SE.

Ranges er ganske nyttig i sin egen rett. For å matche et gjennomspill j, for eksempel, kan du bruke [aj] eller [^ aj] for å passe alle tegn som ikke er et gjennomspill j. Dette fungerer med store bokstaver og tall også; [AQ] ville matche noen stor bokstav fra A til Q, og [1-5] ville matche noen siffer fra 1 til 5.

matchende ett eller flere vilkår

La oss si at du vil erstatte
Kang eller Kodos
med den mer generelle termen alien
. I stedet for å kjøre to søk, kan du bruke grener, som er atskilt med en skråstrek og rør karakter

:% s. /Kang \\\\ | Kodos /alien /gc

Du er ikke begrenset til to begrepene, heller. Hvis du ønsker å erstatte Larry, Moe og Curly med stooge, kan du bruke:% s /Larry \\\\ | Moe \\\\ | Curly /stooge /gc
.