Sådan søges og erstattes på tværs af flere filer i Vim

I denne artikel lærer du, hvordan du interaktivt søger og udskifter på tværs af mange filer med kun to kommandoer takket være Vim.

Mens der findes en lang række metoder til at søge efter og erstatte ord i en enkelt fil, hvad gør du, når du har en streng til at opdatere på tværs af flere ikke-relaterede filer, alle med forskellige navne? Du bruger selvfølgelig kraften i kommandolinjeværktøjer!

Først skal du findalle de filer, du vil ændre. At samle, hvad der effektivt er søgeforespørgsler efter, finder faktisk kun begrænset af din fantasi.

Her er et simpelt eksempel, der finder Python-filer:

find . -name '*.py' 

De -nametest søger efter et mønster, såsom alle filer der ender på .py. Men findkan gøre meget mere med andre testbetingelser, herunder -regextests. Kør for find --helpat se de mange muligheder.

Indstil din søgning yderligere ved grepkun at hente de filer, der indeholder den streng, du vil ændre, f.eks. Ved at tilføje:

grep -le '\' 

Den -lmulighed giver dig bare filnavnene for alle filer, der indeholder et mønster (angivet med -e), der matcher ”en hval”.

Du kan også bruge Vims imponerende, :bufdosom lader dig køre den samme kommando på tværs af flere buffere. Det fungerer interaktivt med alle disse filer uden kedeligt at åbne, gemme og lukke hver fil, en ad gangen.

Lad os sætte dine stærke find+ grepresultater i Vim med:

vim `find . -name '*.py' \ -exec grep -le '\' {} \;` 

Brug af backtick-udvidelse til at overføre vores søgning til Vim åbner flere buffere klar til brug. (Gør :h backtick-expansioni Vim for mere.)

Nu kan du anvende Vim-kommandoen :bufdopå alle disse filer og udføre handlinger såsom interaktiv søgning og erstat:

:bufdo %s/a whale/a bowl of petunias/gce 

For g"global" vil forekomsten af ​​mønsteret ændre på alle linjer. Den evil udelade fejl, hvis mønstret ikke er fundet. Den cvalgmulighed gør denne interaktive. Hvis du føler dig selvsikker, kan du udelade det for at foretage ændringerne uden at gennemgå hver enkelt.

Når du er færdig med at gennemgå alle bufferne, skal du gemme alt det arbejde, du har afsluttet med:

:bufdo wq! 

Sæt dig derefter i glans over din sparede tid og kræfter.