Mellomliggende VimScript

I opplæringen Grunnleggende Vim-konfigurasjon, Jeg viste deg grunnleggende om å konfigurere en Vim redaktør. Nå er det på tide å lære mer. VimScript er et fullt programmeringsspråk som du kan lage alle typer automatiseringsprogram som du kanskje trenger. Denne opplæringen tar kunnskapen din til neste nivå med en prosjektkatalogstruktør, som utforsker Autocommands, og en titt på Maksimal-Awesome forlengelse for MacVim.

Autocommands

Autocommands er kommandoer å ha Vim utfør en handling når en bestemt betingelse gjelder: ny filoppretting, skriving til en fil og så videre.

Det er en fin måte å automatisere noe av arbeidet du må gjøre i et prosjekt. For eksempel, når du lagrer en SASS fil, en autocommand kan kompilere det til normalt CSS for deg.

Formatet for en autocommand er:

autocmd    

hvor er redigeringsaksjonen som kommandoen skal vente på. Du kan også angi mer enn én handling om gangen ved å skille dem med et komma.

Med 86 mulige å hekte på, jeg vil ikke beskrive dem alle her. For å se hele listen, kan du skrive inn : help autocmd-events-abc. Dette åpner en annen buffer med hele listen. For demonstrasjonsprogrammet vil jeg bruke BufNewFile handling for å kjøre funksjonen for å se etter og opprette en mappestruktur for prosjektkatalog.

De er et vanlig uttrykk for filnavnet til handling på.

De er den faktiske kommandoen i VimScript å utføre når skjer som samsvarer med . Det må starte med et kolon, :, som du ville se i statuslinjen til redaktøren.

Siden jeg gjør mye av nettsideutvikling, vil hjelperfunksjonen skape den nødvendige prosjektstrukturen for et nytt nettsted. derfor autocommand må utløse på HTML filopprettelse. Det nødvendige formatet er:

funksjon! CreateProject (fil) ekko "Lagre" a: fil endfunc autocmd BufNewFile * .html: ring CreateProject (expand ('%: p')) 

Funksjonen for prosjektet er bare skjelettet. Etter hvert som opplæringen går, legger jeg til mer i denne funksjonen.

Med dette i .vimrc fil, vil du se filnavnet echoed til statuslinjen når du åpner en ny HTML filen i en buffer. Du kan gjøre dette ved å bruke :ny kommandoen for å opprette en ny buffer med det oppgitte filnavnet, eller når du åpner Vim med et filnavn på kommandolinjen.

De utvide ( '%: p') makro gir hele banen til den nye filen når autocommand utløser. På den måten, funksjonen CreateProject vil få navnet på filen, og det er katalog.

Dette fungerer bra for bare å åpne og lukke Vim uten å laste opp konfigurasjonsfilen igjen. Noen ganger vil du imidlertid tilpasse konfigurasjonsfilen og laste den på nytt uten å avslutte. Vim vil da utføre autocmd flere ganger per ny buffer. Det kan føre til et rot.

Du trenger derfor å sette autocmd inn i en augroup til Autocomand Group. Fjern deretter gruppen før du legger til en ny kommando. De autocmd linjen blir:

Augroup CreateProject autocmd! autocmd BufNewFile * .html: ring CreateProject (expand ('%: p')) augroup END 

De autocmd! forteller Vim å glemme hva som var i denne gruppen før. Bruk denne blokken i stedet for autocmd linje i den siste oppføringen. Dette er god praksis når du skriver autocmds.

Med skriptet så langt opprettet lastet inn til Vim, re-åpne Vim med denne kommandolinjen: vim test.html. Bildet over er hva du får. Det vil gi banen til den nye filen. Hvis du gjør det samme, men med en fil som allerede eksisterer, får du ikke denne meldingen i bundlinjen.

Datastrukturer

VimScript har mer enn bare variabler. Du kan også bruke lister. En liste er en gruppering av objekt til en variabel. Liste er flott for å holde relatert informasjon. Ved opprettelse av en filstruktur vil det være to lister: liste over kataloger som skal opprettes og en liste over filer som skal opprettes.

Du angir en liste med []. Deretter opprett to lister som dette:

la dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc") la filer = ["/ js / base.js", "/ css / base.css "," /doc/help.html ") 

Dette skaper to lister: en som heter kataloger og de andre "filene". Hvis du vil inspisere hva som er på en liste, kan du referere det til en indeks. Huske, VimScript har nullbasert indeksering. For å få det første elementet må du bruke indeksen på null. Når dette er i din .vimrc fil og du laster den på nytt, du kan se dem med dette:

: ekkofiler [0] 

Dette vil ekko "/js/base.js" til statuslinjen. Du kan også referere til verdiene som starter fra høyre verdi med en negativ indeks. Derfor,

: ekkofiler [-2] 

vil ekko "/css/base.css" til statuslinjen. Du kan til og med få en undergruppe av elementer som dette:

: ekkofiler [1: 2] 

Dette vil føre til strengen ['/css/base.css', '/doc/help.html'] å vise i statuslinjen. Et undersett av et sett er fortsatt et sett!

Jeg hadde de to listdefinisjonene utenfor funksjonen bare for demonstrasjonsformål. Det er best å ikke opprette variabler i global omfang (dvs.: utenfor en funksjon). Å ha mye global variabel gjør det globale omfanget rotete. Det kan også kollidere med andre skript nedover veien.

Programflytkontroll

For å behandle hvert element i lister, vil jeg bruke a til-loop struktur. EN til-loop gjør gjentatte ganger den vedlagte koden til en tilstand oppstår. For å gå over hvert element i listen blir koden dette:

funksjon! CreateProject (fil) la dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc") la filer = ["/ js / base.js" "/css/base.css", "/doc/help.html") for dir i dirs endfor for navn i filer endfor endfunc autocmd BufNewFile * .html: call CreateProject (expand ('%: p')) 

De to lister er nå inne i funksjonen og to til løkker iterate gjennom hver liste. Merk, det er en ny variabel før i uttalelse og listen etter i uttalelse. Den nye variabelen kjøper hvert element i gruppen sekvensielt.

Det er en annen looping struktur i VimScript ringte samtidig som-sløyfe. Det er grunnleggende skjemaet er:

la indeks = 0 mens indeksen < len(dirs) echo l:dirs[index] l:index += 1 endwhile 

Denne koden løper over hvert element i kataloger liste og ekko den til statuslinjen. Legg merke til den nye variabelen index. Denne variabelen brukes til å spore antall ganger gått gjennom sløyfen og å få hvert element i listen i rekkefølge. For å jobbe med lister, til-sløyfe er mer effektiv.

Ferdiggjør funksjonen

Med datastrukturer og sløyfer på plass, vil jeg nå fullføre koden. Resten av koden ser slik ut:

funksjon! CreateProject (fil) la dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc") la filer = ["/ js / base.js" "/css/base.css", "/doc/help.html") la foreldre = fnamemodify (a: file, ": p: h") for dir in dirs la newdir = l: parent. dir if! isdirectory (l: newdir) ring mkdir (l: newdir) endif endfor for navn i filer la newfile = l: parent. navn hvis! filereadable (newfile) call system ("touch". l: newfile) endif endfor endfunc autocmd BufNewFile * .html: call CreateProject (expand ('%: p')) 

Jeg la til en ny variabel forelder det er den overordnede katalogstrukturen til filen som er gitt til funksjonen. Kommandoen fnamemodify lar deg trekke ut ulike deler av en bane over plattformer. Du kan lese mer om det ved å bruke Vim hjelpesystem: : hjelp fnamemodify (). Legg merke til, for å referere til fil variabel passert til funksjonen jeg måtte rekkevidde den med en:. De en: omfang refererer til enrguments.

I hver krets skapte jeg en variabel som konkluderer overordnet katalog med den nye katalogen eller filnavnet. Jeg ser etter deres eksistens og lager dem hvis de ikke eksisterer. For å sjekke for eksistens, isDirectory () funksjonskontroller for katalogen, og filereadable () sjekker om fileksistens. Jeg bruker a ! å negere returverdien fra funksjonene. For å lage kataloger, ringer du til mkdir () kommando. For å lage tomme filer må du bruke systemkommandoen ta på.

Legg også merke til i hver sløyfe og hvis setningen jeg måtte rekkevidde variablene som er i øvre rekkevidde med l: omfang. De l: Omfanget refererer til hvor som helst i funksjonsdefinisjonen. Nedre rekkevidde arver ikke automatisk de øvre målene! Dette fanger meg hele tiden.

Maksimal-Awesome

Nå som du kommer inn i tung bruk med Vim, Maksimal-Awesome er en oppsettpakke som laster mange gode standardverdier og pakker for bruk VimMac. Det er Ruby on Rails sentrisk, men er nyttig for alle typer programmering.

Åpne termiskprogrammet til en katalog du vil installere pakken. Skriv deretter disse kommandoene:

git klone https://github.com/square/maximum-awesome.git cd maksimal awesome rake 

Når den er fullført, så åpne Vim igjen og du vil se et fint arbeidsmiljø.

Det er mange interessante pakker i dette oppsettet. Ha det gøy å utforske!

Konklusjon

Nå som du vet hvordan du lager automatiseringsskript for å hjelpe arbeidsflyten din, kan du gå videre og eksperimentere med andre nyttige funksjoner.

Når du personliggjør en Vim miljø, vil du fylle mer i kontroll og kunne gjøre mer. Husk at å øve det du lærer er den eneste måten å forbedre og huske på. Så, fortsett og trener med å lage dine egne automatiseringsskript VimScript!