Vi og batchoppdatering av filer
Vi, og den nyere versjonen Vim, er teksteditorer med avansert funksjonalitet. I denne blogposten vil vi se på hvordan vi kan gjøre samme endring i mange tekstfiler på raskest mulig måte. Dette kalles ofte for en "batch"-jobb.
Et praktisk eksempel der dette er aktuelt er i vedlikeholdet av dette nettstedet. www.psdigital.no består av statiske html-filer. Hovedmenyen er den samme på hver eneste side. Dersom vi vil endre i hovedmenyen må vi i utganspunktet åpne hver eneste html-fil (rundt 50 stk filer) og skrive inn den samme endringen i hver fil. Dette tar lang tid, gir god sjanse for feil, og er drit kjedelig! Finnes det en bedre måte å gjøre det på med Vi (eller Vim)?
Det er flere måter å gjøre dette på. For eksempel:
- Benytte map-funksjonen. Støttes både i Vi og Vim. Man mapper en (lang) tastatursekvens til en shortcut (kort tastatursekvens).
- Gjøre opptak (q) som lagres i en tastaturshortcut (kort tastatursekvens). Man åpner mange filer i Vim, går fra fil til fil og kjører shortcutten. Dette støttes bare i Vim, ikke Vi.
Batch oppdatering med avansert map i Vi
Lage forkortelse i insert mode: abbreviation
Har vi en lang setning eller uttrykk som skal gjentas ofte, kan man lage en forkortelse.
:ab ps Firmaet heter psdigtal
I insert mode kan man skrive ps og space og da vil ps erstattes med Firmaet heter psdigital
- :ab for å se alle abbreviations vi har
- :unab
for å slette abbreviation
Lage forkortelse i command mode: map (macro)
- :map v dwelp Nå kan vi gå til begynnelsen av et ord, og bare ved å trykke v i kommando mode kan vi bytte om plassen til dette ordet og det neste.
Vi må vite hvilke bokstaver vi kan bruke som egendefinerte shortcuts. I Vi er dette: g, K, q, V, v. (I Vim er dette annerledes.)
Hvis vi vil ha med Return, Esc, Backspace, Delete eller andre spesialtaster, må disse escapes med Ctrl-v. Må altså taste Ctrl-v før spesialtasten.
Se Learning the Vi editor, kapittel 7.3
Source map fra fil
Hvis vi lager en map, og så lukker Vi, er mappen mistet når vi åpner Vi igjen. Vil vi beholde en map er en løsning å skrive den til en fil, og så lese denne filen inn i Vi. Å lese en slik fil inn i en map i Vi gjøres med source kommandoen.
- :source mapfile
- Eller forkortet til :so mapfile
Åpne ett vindu med flere buffere
vi fil1.html fil2.html fil3.html test.txt test.html
vi *html
Nå åpnes alle html-filene i katalogen vi står i som buffere i samme vindu. Bare en buffer vises i vinduet om gangen. Vi kan bytte fra buffer til buffer med kommandoer som:
- List opp alle bufferne: :args (bufferen som vises i vinduet står i [firkantklammer])
- Neste buffer: :next eller :n
- Forrige buffer: :prev eller :Next eller :N
- :wn og wN lagerer og går forover/bakover i bufferne
- :rew (rewind) gå til første bufferen
- :e# bytter mellom to buffere
- :last, :first
Oppdatere menyen i psdigital.no
Jeg lagret følgende to linjer i en fil mymap

Fig. 1 Vi map for å raskt endre menyen på denne hjemmesiden. Først endre bits-or-bytes meny innslaget, deretter utvides menyen med datatips.
Først kommando er mappet til v. Jeg ønsket å endre et eksisterende menyinnslag: bits // bytes skal heller være bits & bytes. Algoritmen er rett og slett å søke opp den gamle strengen, og erstatte den med den nye. Vi gjør en manuell bekreftelse før substitusjonen skjer.
Andre kommando er mappet til q. Jeg ønsket å utvide hjemmesiden med en side for datatips for forbrukere. Andre kommando legger til dette menyinnslaget. Innslaget skal være to linjer over bits-or-bytes innslaget. Først finner vi bits-or-bytes linjen. Deretter går vi to linjer opp og legger til en ny linje (2ko). Her skriver vi inn riktig html kode. Deretter legger til vi noen space på begynnelsen av linjen slik at den får riktig innrykk.
Jeg åpnet alle html filene i vi, sourcet mymap, kjørte de to mappene på hver enkelt fil. Jeg måtte gjøre noen få manuelle steg per fil. Samtidig fikk jeg manuelt sjekket at ikke noe så feil ut.
- vi *html
- so mymap
- vyq:wn
- vyq:wn
- vyyggq:wn (for de som er under bitsbytes - ser hvilke disse er fordi cursor hopper til neste tilfelle etter første y - det er bare på disse filene det er flere enn ett treff på søkestrengen)
Referanser
- O'reilly: Learning the Vi editor, sixth edtion
https://docstore.mik.ua/orelly/unix3/vi/index.htm
- O'reilly: Learning the Vi editor, sixth edtion
https://docstore.mik.ua/orelly/unix3/vi/ch07_03.htm
- Learning the vi Editor/Vim/Modes
https://en.m.wikibooks.org/wiki/Learning_the_vi_Editor/Vim/Modes
- :source command
http://vim.1045645.n5.nabble.com/source-command-td5711594.html
- Learn Vimscript the Hard Way, Basic Mapping
http://learnvimscriptthehardway.stevelosh.com/chapters/03.html
- How can I edit multiple files in VIM?
https://unix.stackexchange.com/questions/27586/how-can-i-edit-multiple-files-in-vim
- Mapping keys in Vim - Tutorial (Part 1)
https://vim.fandom.com/wiki/Mapping_keys_in_Vim_-_Tutorial_(Part_1)