Mellanliggande VimScript

I handledningen Grundläggande Vim-konfiguration, Jag visade dig grunderna för att konfigurera en vim redaktör. Nu är det dags att lära sig mer. VimScript är ett fullständigt programmeringsspråk som du kan skapa vilken typ av automatiseringsprogram du behöver. Denna handledning kommer att ta din kunskap till nästa nivå med en projektkatalogstrukturskapare, utforska autokommandon, och en titt på Maximum-Toppen förlängning för MacVim.

autokommandon

autokommandon Kommandon har vim utföra en åtgärd när ett visst villkor gäller: ny fil skapande, skriva till en fil och så vidare.

Det är ett utmärkt sätt att automatisera något av det arbete du behöver göra i ett projekt. Till exempel när du sparar en SASS fil, en AUTO kan sammanställa det till normalt CSS till dig.

Formatet för en AUTO är:

autocmd    

var är redigeringsåtgärden som kommandot ska vänta på. Du kan även ange mer än en åtgärd åt gången genom att skilja dem med ett komma.

Med 86 möjliga att haka på, jag beskriver inte dem alla här. För att se hela listan kan du skriva : hjälp autocmd-events-abc. Detta öppnar en annan buffert med hela listan. För demonstrationsprogrammet kommer jag att använda BufNewFile Åtgärd för att köra funktionen för att söka efter och skapa en mappstruktur för projektkatalog.

De är ett vanligt uttryck för filnamnet till handling på.

De är det faktiska kommandot i VimScript att utföra när händer som matchar . Det måste börja med ett kolon, :, som du skulle se i redaktörens statusraden.

Eftersom jag gör en hel del webbutveckling kommer hjälparfunktionen att skapa den nödvändiga projektstrukturen för en ny webbplats. Därför AUTO måste utlösa på html fil skapande. Det behövs formatet är:

fungera! CreateProject (file) echo "Spara" a: fil endfunc autocmd BufNewFile * .html: ring CreateProject (expand ('%: p')) 

Funktionen för projektet är bara skelettet. När handledningen fortskrider, lägger jag till mer i den här funktionen.

Med detta i .vimrc fil kommer du att se filnamnet echoed till statusfältet när du öppnar ett nytt html filen i en buffert. Du kan göra detta genom att använda :ny kommandot för att skapa en ny buffert med det angivna filnamnet, eller när du öppnar vim med ett filnamn på kommandoraden.

De expand ( '%: p') makro ger hela sökvägen till den nya filen när AUTO triggers. På så sätt, funktionen CreateProject kommer att få namnet på filen, och det är katalog.

Detta fungerar bra för att helt enkelt öppna och stänga vim utan att någonsin ladda om konfigurationsfilen. Ibland vill du dock tweak konfigurationsfilen och ladda om den utan att avsluta. vim kommer då att utföra autocmd flera gånger per ny buffert. Det kan orsaka en röra.

Du behöver därför sätta autocmd in till en augroup för Autocomand Group. Rensa sedan gruppen innan du lägger till ett nytt kommando. De autocmd linjen blir:

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

De autocmd! berättar vim att glömma vad som var i denna grupp innan. Använd det här blocket istället för autocmd rad i den senaste listan. Det här är bra när du skriver autocmds.

Med skriptet hittills skapat laddat i till vim, åter öppna vim med denna kommandorad: vim test.html. Bilden ovan är vad du får. Det kommer att ge vägen till den nya filen. Om du gör samma sak, men med en fil som redan finns kommer du inte att få den här prompten i botten.

Data struktur

VimScript har mer än bara variabler. Du kan också använda listor. En lista är en gruppering av objekt till en variabel. Listan är bra för att hålla relaterad information. När det gäller att skapa en filstruktur kommer det att finnas två listor: lista över kataloger att skapa och en lista över filer som ska skapas.

Du anger en lista med []. Därför skapa två listor så här:

låt dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] låt filer = ["/ js / base.js", "/ css / base.css "," /doc/help.html ") 

Detta skapar två listor: en som heter dirs och de andra "filerna". Om du vill inspektera det som finns i en lista kan du referera det till ett index. Kom ihåg, VimScript har nollbaserad indexering. För att få det första objektet måste du använda indexet på noll. När det här är i din .vimrc fil och du laddar om det, du kan se dem med det här:

: echo-filer [0] 

Detta kommer att eko "/js/base.js" till statusraden. Du kan också referera till de värden som börjar från det högsta värdet med ett negativt index. Därför,

: echo-filer [-2] 

kommer att eko "/css/base.css" till statusraden. Du kan till och med få en undergrupp av element så här:

: echo-filer [1: 2] 

Detta kommer att orsaka strängen ['/css/base.css', '/doc/help.html'] att visa i statusraden. En underuppsättning av en uppsättning är fortfarande en uppsättning!

Jag hade de två listdefinitionerna utanför funktionen bara för demonstrationsändamål. Det är bäst att inte skapa variabler i global omfattning (dvs: utanför en funktion). Att ha en hel del globala variabler gör det globala räckhållet roligt. Det kan också kollidera med andra skript på vägen.

Programflödesreglering

För att bearbeta varje element i listorna använder jag a för-slingstruktur. en för-slingan utförs upprepade gånger den bifogade koden tills ett tillstånd händer. För att slinga över varje objekt i listan blir koden följande:

fungera! CreateProject (fil) låt dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] låt filer = ["/ js / base.js" "/css/base.css", "/doc/help.html") för dir i dirs endfor för namn i filer än endfunc autocmd BufNewFile * .html: call CreateProject (expand ('%: p')) 

De två listorna är nu inne i funktionen och två för loopar iterera genom varje lista. Observera, det finns en ny variabel före i uttalande och lista efter i påstående. Den nya variabelen förvärvar varje element i matrisen sekventiellt.

Det finns en annan loopingstruktur i VimScript ringde medan-slinga. Det är grundläggande form är:

låt index = 0 medan index < len(dirs) echo l:dirs[index] l:index += 1 endwhile 

Den här koden loopar över varje objekt i dirs lista och echo den till statusraden. Notera den nya variabeln index. Denna variabel använde för att spåra antalet gånger gått i slingan och att i följd få varje objekt i listan. För att arbeta med listor, för-slingan är mer effektiv.

Avsluta funktionen

Med datastrukturerna och slingorna på plats kommer jag nu att slutföra koden. Resten av koden ser så här ut:

fungera! CreateProject (fil) låt dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] låt filer = ["/ js / base.js" "/css/base.css", "/doc/help.html") låta förälder = fnamemodify (a: file, ": p: h") för dir i dirs låt newdir = l: parent. dir if! isdirectory (l: newdir) ringa mkdir (l: newdir) endif endfor för namn i filer låt newfile = l: parent. namnge om! filereadable (newfile) samtalssystem ("touch". l: newfile) endif endfor endfunc autocmd BufNewFile * .html: call CreateProject (expand ('%: p')) 

Jag lade till en ny variabel förälder det är den överordnade katalogstrukturen för filen som ges till funktionen. Kommandot fnamemodify kan du extrahera olika delar av en väg över plattformar. Du kan läsa mer om det med hjälp av vim hjälpsystem: : hjälp fnamemodify (). Observera, för att hänvisa till fil variabel passerade till funktionen jag var tvungen att räcka med med en:. De en: räckvidd hänvisar till enrguments.

I varje loop skapade jag en variabel som sammanfattar moderkatalogen med den nya katalogen eller filnamnet. Jag letar efter deras existens och skapar dem om de inte existerar. För att kontrollera att det finns existens isDirectory () funktionskontroller för katalogen och filereadable () kontrollerar filens existens. Jag använder a ! att negerera returvärdet från funktionerna. För att skapa kataloger, ringer du till mkdir () kommando. För att skapa tomma filer måste du använda systemkommandot Rör.

Observera också inuti varje slinga och om uttalandet jag var tvungen att räcka för de variabler som ligger i de övre skikten med l: omfattning. De l: räckvidd hänvisar till var som helst i funktionsdefinitionen. Lägre omfång arv inte automatiskt de övre delarna! Detta fångar mig hela tiden.

Maximum-Toppen

Nu när du kommer in för tung användning med vim, Maximum-Toppen är ett installationspaket som laddar upp många stora standardinställningar och paket för användning vimMac. Det är Ruby on Rails centrerad, men är användbar för någon typ av programmering.

Öppna det termiska programmet till en katalog som du vill installera paketet. Skriv sedan dessa kommandon:

git klon https://github.com/square/maximum-awesome.git cd max-awesome rake 

När den är klar öppnar du den vim igen och du kommer att se en trevlig arbetsmiljö.

Det finns många intressanta paket i denna setup. Ha kul att utforska!

Slutsats

Nu när du vet hur man skapar automatiseringsskript för att hjälpa ditt arbetsflöde, fortsätt och experimentera med andra användbara funktioner.

När du personifierar en vim miljö, kommer du att fylla mer i kontroll och kunna göra mer. Kom ihåg att öva det du lär dig är det enda sättet att förbättra och komma ihåg det. Så, fortsätt och träna med dina egna automationsskript i VimScript!