vim-kurs
(Opprinnelig sendt som mail til ITKs mailinglister, kopiert over hit.)
vim (VI iMproved, evt. Vi IMproved, eller noe) er en av mange vi-kloner. Jeg regner med at alle interesserte har kjørt vimtutor for lenge siden, så her kommer en fin liste over features folk kanskje ikke kan:
- vim har et fint hjelpesystem. Skriv ":help", evt. ":help topic" for å få hjelp om noe bestemt. :help forklarer deg selv hvordan hjelpen fungerer. ":help!", ":help 42" og ":help holy-grail" er andre meget nyttige varianter :-)
- Delete-kommandoen kan brukes til mye rart. Den vanligste formen er "dd" for bare å slette linjen man er på, men her er det mange variasjoner: "3dd" utfører kommandoen tre ganger (dvs. sletter tre linjer), "dw" sletter et helt ord, "d$" (med hurtigtast "D") sletter til slutten av linjen, "d." (med hurtigtast "x") sletter ett tegn, "3dw" sletter selvsagt tre ord, osv.. I tillegg kan delete, som de fleste andre vim-kommandoer, ta en range, dvs. man kan spesifisere hvor man skal slette fra og til. Den herlige kommandoen ":.,$d" vil f.eks. slette fra linjen man er på til slutten av fila. (":<fra>,<til>" spesifiserer rangen, "." er linjen man er på, og "$" i dette tilfellet er siste linje i fila. "d" betyr som kjent delete.) Mer informasjon om ranges i "help range".
- Dersom man ikke gidder å skrive masse lure kommandoer for å lære seg ranges, er visual mode en fin godbit. Bruk "v", markér området ditt med piltastene, og bruk så en range-kommando (som f.eks. delete, eller substitute som man skal se tidligere).
- Når man sletter ting, ønsker man gjerne å hoppe rett inn i insert-modus for å skrive noe på samme sted. En måte å gjøre dette på er selvsagt å skrive "dw" (for å slette ordet man er på) og så "i" for å gå i insert-modus, men man har en hurtigtast: bruk "c" (for "change") i stedet for d, og du hopper rett inn i insertmodus etter sletting. "cw" = change word, "ciw" = change inner word (som tar hele ordet og ikke bare fra markøren), "cc" = change line (slett linjen man er på og gå så i insert-modus), "c$" (eller "C") for å slette resten av linjen og gå i insert-modus, osv.. Det er bare ett tastetrykk, men det går utrolig fort når man først blir vant til det, tro meg. :-) (Spesialtilfeller for enkelttegn er "s" for å slette ett tegn og sette deg rett i insert-modus, eller "r" for å la deg overskrive ett tegn og sette deg så direkte tilbake i kommandomodus.)
- En fornuftig .vimrc er noe alle burde skaffe seg. Denne inneholder
kommandoer som kjøres hver gang vim starter, og er derfor fin å legge
standarddefinisjoner i. Sleng f.eks. inn
set nocompatible syntax on set ruler set pastetoggle=<F10> set showmatch set ignorecase set incsearch
Forklaring på de enkelte elementene følger: - ":set nocompatible" fører til at vim prøver å sette behagelige defaults, i stedet for å være en strict vi fra 70-tallet en gang. (Debian-maskiner har dette på som standard.)
- ":syntax on" skrur på syntax-highlighting, dvs. markerer forskjellige deler av kildekode man editerer i forskjellig farge. vim har oppsett for syntax-highlighting av ørten forskjellige språk.
- ":set ruler" gir deg konsekvent en "linjal" nederst på skjermen, som viser deg hvilken modus du er i, linjenummeret ditt, og tidvis en del andre nyttige ting.
- ":set pastetoggle=<F10>" gjør at F10 mappes om til å sette paste-modus eller ikke. Paste-modus er fint når du (surprise!) skal paste noe, f.eks. fra gpm, ettersom den skrur av linjebrekking m.m. mens du paster, så pasten ikke blir `ødelagt' av autoindenting osv.
- ":set showmatch" gjør at hver gang du skriver en høyreparentes (dvs, ), }, eller ]) vil vim et kort øyeblikk vise deg hvor den matchende parentesen står. Kjekt når man skriver kode. (Man kan også bruke "%" manuelt for å hoppe til motsatt parentes.)
- ":set ignorecase" gjør at søk blir case-insensitive, dvs. at du kan søke på "hei" og komme til "Hei". Stort sett alltid en god idé.
- ":set incsearch" aktiverer inkrementelt søk, dvs. at vim viser deg den første matchen etter hvert som du skriver inn søketeksten din.
- Tilbake til flotte vim-kommandoer. Mange vet sikkert at "dd" (i tillegg til å slette en linje) lagrer linjen i et spesielt buffer som man kan paste med "p" (mao. har man cut-and-paste; ganske nyttig ;-) ). Litt færre vet at "P" paster over linjen man er på i stedet for rett etter. Enda litt færre ser ut til å vite at man kan bruke "yy" (for "yank") for å dytte ting inn i pastebufferet uten å slette. Igjen, sparer noen tastetrykk framfor å bruke "dd" hele tiden.
- Hvis man ønsker å være ordentlig sofistikert, kan man yanke og paste inn i forskjellige registre. Registre begynner med anførselstegn, altså ", og det finnes en haug av dem (se ":help registers"). Hvis man f.eks. ønsker å yanke tre linjer inn i register a, kan man skrive "a3yy, og så paste den seinere med "ap. Fordelen er selvsagt at registrene ikke blir endret av annen cut-and-pasting man gjør. (Vel, de nummererte registrene gjør; se ":help register". :-) )
- Tilbake til noe litt enklere: "." (altså punktum) repeterer forrige kommando, stort sett uansett hva den var. Som vanlig kan man bruke "3." for å repetere tre ganger osv..
- Helt enkle ting: "/tekst" søker etter "tekst" i dokumentet.
- "*" søker også, men den søker automatisk etter det ordet som markøren befinner seg rett over der og da. Mao.: Har du markøren over ordet "tekst" og trykker *, vil vim søke seg fram til neste treff av "tekst". "#" vil søke tilbake.
- Mens vi er på søk-og-erstatt: ":%s/foo/bar/g" vil erstatte alle tilfeller av "foo" med "bar" i hele fila. "%" betyr hele filen (her kan man dytte inn en hvilken som helst range i stedet, eller som sagt bruke visual mode), "s" står for substitute, "g" står for global (så ikke bare første treff av "foo" på hver linje blir erstattet) og de to andre skulle være selvforklarende. Mange synes det er tydeligere å bruke ":%s,foo,bar,g" (dvs. erstatte skråstrekene med kommaer) – stort sett ethvert tegn kan brukes her etter fritt ønske. substitute støtter også regexes (aka regulære uttrykk), men dette er et tema som er utenfor dette kurset. :-)
- Igjen enkle ting: "u" gjør undo, ctrl-R gjør redo. Du har rett og slett uendelig med undo. :-)
- Enkelt men genialt: "gf" hopper til filnavnet under markøren, hvis det finnes. Greit når man programmerer. :-)
- Mer programmeringsting: ">>" vil skyve tekst et hakk til høyre (dvs. en shiftwidth-posisjon, se ":set sw" og ":set noexpand"/":set expand"). "<<" skyver tekst til venstre, og "==" gir den riktig indent etter gjeldende tab-regler (se ":help cindent" m.m. for mer informasjon om hvordan sette opp dette; defaults er rimelig saklige). Man kan bruke ranges og repetisjon her også, etter eget ønske.
- Dersom man liker det, har man også noe som heter folding i vim, dvs. at funksjoner kan "kollapses" ned til én linje så man kan få et bedre overblikk over filen sin. Dette er litt knotete å sette opp riktig for C, i hvert fall, men det er mulig. ":help folding". :-)
- Av og til ønsker man å paste inn en fil. ":r filnavn" gjør nytten. Av mer interessante muligheter har man ting som ":r !date –rfc", som kjører kommandoen "date –rfc" og paster resultatet. Kortform er "!!" her, men se ":help r" for mange varianter av denne.
- En ordentlig godbit for programmerere dersom man klarer å venne seg til den (som jeg dessverre ikke har gjort :-) ): Idet man holder markøren over et ord og trykker Ctrl-], dvs. Ctrl-Å på norske tastaturer, hopper vim automagisk til den filen der symbolet er definert, på riktig sted. Man trenger et "ctags"-program (f.eks. "exuberant-ctags") for å dra nytte av dette, så vim vet hva som er hvor; ":help tags". Ctrl-T hopper tilbake til der man var.
- Mer programmeringsgodbiter: '. flytter markøren til forrige linje der man gjorde en endring. `. gjør det samme, men flytter i tillegg markøren til det eksakte stedet der man gjorde endringen. Flott for å komme tilbake etter et søk, f.eks..
- En temmelig lik godbit er '^, som holder styr på hvor du gikk ut fra siste insert-kommando. Denne blir brukt av kommandoen "gi" som hopper til dette bokmerket og putter deg i insert-modus. Svært nyttig om du går ut fra insert-modus for å kopiere noe tekst eller se hva som står litt lenger oppe i filen for så å skrive videre.
- Ctrl-O er en variant av samme, bortsett fra at den er mer generisk: Ved å trykke Ctrl-O flere ganger, kan du "spille av" bevegelsene dine gjennom fila baklengs, så du kommer tilbake til punktene du var for litt siden. Ctrl-I spiller av forlengs igjen.
- Mindre nyttig: "g?" rot13-krypterer (evt. dekrypterer :-) ) området du har valgt. Ranges og repetisjoner som vanlig. :-)
- Av og til er det nyttig å kunne redigere filer i en annen encoding enn den
man har satt som standard. Jeg skal ikke gå alt for mye inn på dette, så
":help encoding" (det mest aktuelle tilfellet er vel UTF-8 :-) ). De mest
aktuelle i .vimrc er vel:
set termencoding=iso-8859-1 set fileencodings=utf-8,iso-8859-1
som spesifiserer at man bruker en iso-8859-1-terminal, men at filer man åpner godt kan være UTF-8 (vim sjekker dette først, og faller tilbake til ISO-8859-1 dersom filen ikke er UTF-8). - Mer .vimrc-magi: Man kan sette opp så gitte kommandoer kjører automatisk
når man åpner gitte filer. Min .vimrc inneholder f.eks.
au BufNewFile,BufRead mutt*,*.txt,*/.followup set tw=77 ai nocindent fileencoding=iso-8859-1
Dette fører til at nye filer, tekstfiler, filer fra mutt eller filer postet i newsreaderen min (.followup) automatisk får satt tekstbredden til 77 tegn (tw = textwidth), skrur på autoindent (ai), skrur av C-indentering (nocindent) og setter enkodingen til iso-8859-1. - Blant andre nyttige .vimrc-snutter har man
" autocomplete function! CleverTab() if strpart( getline('.'), 0, col('.')-1 ) =~ '^s*$' return "\<Tab>" else return "\<C-N>" endfunction inoremap <Tab> <C-R>=CleverTab()<CR>
Jeg skal ikke gå i detalj inn på hvordan den fungerer, men generelt gjør den tab-tasten din om til å autocomplete ord (men du kan fortsatt bruke den til å indentere som vanlig). Nyttig når du programmerer og har lange variabel- eller funksjonsnavn. :-) Tar litt tid å venne seg til, men er en super-saver :-) (Jeg mener å huske at det fantes en bedre versjon av denne på vim.org-tipsene et sted, men jeg orker ikke å slå den opp akkurat nå. :-) ) - Dersom man har to filer som ligner litt og bare vil se forskjellene, er "vimdiff fil1 fil2" en fin kommando. Evt. kan man bare bruke "diff -u" som de fleste normale mennesker gjør ;-)
- Ctrl-a hopper til nærmeste tall og øker det med én. Kjekt i en DNS-sone, f.eks.. Ctrl-x minker tallet med 1.
- Ctrl-p og Ctrl-n i insert-mode fullfører ordet for deg hvis ordet finnes i filen du har åpnet, søket går bakover med Ctrl-p og fremover med Ctrl-n.
- Siste godbiten til slutt: Dersom man har en haug med linjer med forskjellig bredde (f.eks. noen som har skrevet aaaalt for lange linjer i en mail e.l.), kan man bruke "gq}" eventuelt "gqip" for å brekke om hele avsnittet man står i (til tekstbredden man har satt med ":set tw"). Det geniale her er at den faktisk skjønner >-quoting i mail, C-kommentarer osv., så ting blir faktisk riktig, rent og pent. :-)
- Dersom du ikke finner det du leter etter her, ta en titt på denne siden: http://www.rayninfo.co.uk/vimtips.html
- For raskt oppslag: http://www.selectorweb.com/vi.html
Lenker: Start
Epost: itk@samfundet.no | Telefon: 992 15 925 | Sist endret: 2015-03-18 21:55 | Revisjon: 15 (historie, blame) | Totalt: 1905 kB | Rediger