Gemiddeld VimScript

In de zelfstudie Basic Vim-configuratie, Ik liet je de basis zien van het configureren van een Vim editor. Nu is het tijd om meer te leren. VimScript is een volledige programmeertaal waarmee u elk type automatiseringsprogramma kunt maken dat u mogelijk nodig hebt. Deze tutorial zal je kennis naar het volgende niveau brengen met een maker van een projectdirectorystructuur, verkennen autocommands, en een blik op de Maximale geweldig uitbreiding voor MacVim.

autocommands

autocommands zijn commando's om te hebben Vim voer een actie uit wanneer een specifieke voorwaarde van toepassing is: aanmaken van nieuwe bestanden, schrijven naar een bestand, enzovoort.

Het is een geweldige manier om een ​​deel van het werk dat u in een project moet doen te automatiseren. Bijvoorbeeld, wanneer u een opslaat SASS bestand, een autocommand kan het compileren naar normaal CSS voor jou.

Het formaat voor een autocommand is:

autocmd    

waar is de editoractie waarop de opdracht moet wachten. U kunt ook meer dan één actie tegelijk opgeven door ze met een komma te scheiden.

Met 86 mogelijk om vast te houden, ik zal ze hier niet allemaal beschrijven. Om de volledige lijst te zien, kunt u typen : help autocmd-events-abc. Dit opent een andere buffer met de volledige lijst. Voor het demonstratieprogramma zal ik de BufNewFile actie om de functie uit te voeren om te controleren op en een mapstructuur voor een projectdirectory te maken.

De is een reguliere expressie voor de bestandsnaam waarop moet worden gereageerd.

De is het eigenlijke commando in VimScript uitvoeren wanneer de gebeurt die overeenkomt met de . Het moet beginnen met een dubbele punt, :, zoals je zou zien in de statusregel van de editor.

Aangezien ik veel websiteontwikkeling doe, zal de helperfunctie de benodigde projectstructuur voor een nieuwe website creëren. Daarom, de autocommand moet worden geactiveerd HTML bestand maken. Het benodigde formaat is:

functie! CreateProject (bestand) echo "Opslaan" a: bestand endfunc autocmd BufNewFile * .html: call CreateProject (expand ('%: p')) 

De functie voor het project is slechts het skelet. Naarmate de zelfstudie vordert, voeg ik meer toe aan deze functie.

Met deze in de .vimrc bestand, ziet u de bestandsnaam weerkaatst op de statusbalk wanneer u een nieuwe opent HTML bestand in een buffer. U kunt dit doen met behulp van de :nieuwe commando om een ​​nieuwe buffer te maken met de gegeven bestandsnaam, of wanneer je opent Vim met een bestandsnaam op de opdrachtregel.

De expand ( "%: p) macro geeft het volledige pad naar het nieuwe bestand wanneer het autocommand triggers. Op die manier, de functie CreateProject krijgt de naam van het bestand en de bijbehorende map.

Dit werkt prima voor eenvoudig openen en sluiten Vim zonder ooit het configuratiebestand opnieuw te laden. Soms wilt u echter het configuratiebestand aanpassen en opnieuw laden zonder het bestand te verlaten. Vim zal dan de autocmd meerdere keren per nieuwe buffer. Dat kan een zooitje veroorzaken.

U moet daarom de autocmd in om een augroup voor Autocomand Group. Wis vervolgens de groep uit voordat u een nieuwe opdracht toevoegt. De autocmd regel wordt:

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

De autocmd! vertelt Vim om te vergeten wat er eerder in deze groep was. Gebruik dit blok in plaats van het autocmd regel in de laatste lijst. Dit is een goede oefening bij het schrijven autocmds.

Met het script dat tot nu toe is aangemaakt geladen in Vim, heropenen Vim met deze commandoregel: vim test.html. De bovenstaande foto is wat u krijgt. Het geeft het pad naar het nieuwe bestand. Als u hetzelfde doet, maar met een bestand dat al bestaat, krijgt u deze prompt niet op de onderste regel.

Data structuren

VimScript heeft meer dan alleen variabelen. U kunt ook lijsten gebruiken. Een lijst is een groepering van object naar één variabele. Lijst is geweldig voor het houden van gerelateerde informatie. In het geval van het maken van een bestandsstructuur, zullen er twee lijsten zijn: lijst met te creëren mappen en een lijst met te maken bestanden.

U geeft een lijst op met de []. Maak daarom twee lijsten zoals deze:

laat dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] laat files = ["/ js / base.js", "/ css / base.css "," /doc/help.html "] 

Hierdoor worden twee lijsten gemaakt: één opgeroepen dirs en de andere 'bestanden'. Als u wilt inspecteren wat er in een lijst staat, kunt u ernaar verwijzen met een index. Onthouden, VimScript heeft op nul gebaseerde indexering. Om het eerste item te krijgen, moet u de index van nul gebruiken. Zodra dit in je is .vimrc bestand en je laadt het opnieuw, je kunt ze hiermee zien:

: echo-bestanden [0] 

Dit zal "/js/base.js" echoën naar de statusregel. U kunt ook verwijzen naar de waarden die beginnen met de meest rechtse waarde met een negatieve index. daarom,

: echo-bestanden [-2] 

zal "/css/base.css" echoën naar de statusregel. Je kunt zelfs een subgroep van elementen als deze krijgen:

: echo-bestanden [1: 2] 

Dit veroorzaakt de string ['/css/base.css', '/doc/help.html'] om te laten zien in de statusregel. Een subset van een set is nog steeds een set!

Ik had de twee lijstdefinities buiten de functie alleen voor demonstratiedoeleinden. Het is het beste om geen variabelen in de globaal bereik (dat wil zeggen: buiten een functie). Het hebben van veel globale variabelen maakt het wereldwijde bereik rommelig. Het kan ook botsen met andere scripts op de weg.

Programma Flow Control

Om elk element in de lijsten te verwerken, gebruik ik a voor-lusstructuur. EEN voor-lus herhaalt herhaaldelijk de bijgevoegde code totdat een voorwaarde optreedt. Als u elk item in de lijst wilt herhalen, wordt de code als volgt:

functie! CreateProject (bestand) laat dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] laat files = ["/ js / base.js", "/css/base.css", "/doc/help.html"] voor dir in dirs endfor voor naam in bestanden endfor endfunc autocmd BufNewFile * .html: call CreateProject (expand ('%: p')) 

De twee lijsten bevinden zich nu in de functie en twee voor loops itereren door elke lijst. Let op, er is een nieuwe variabele vóór de in verklaring en de lijst na de in uitspraak. De nieuwe variabele krijgt elk element in de reeks opeenvolgend.

Er is nog een lusstructuur in VimScript genaamd de terwijl-lus. De basisvorm is:

laat index = 0 terwijl index < len(dirs) echo l:dirs[index] l:index += 1 endwhile 

Deze code lus over elk item in de dirs lijst en echoot het naar de statusregel. Let op de nieuwe variabele inhoudsopgave. Deze variabele wordt gebruikt om het aantal keren dat de lus voorbij is te volgen en om elk item in de lijst achter elkaar te krijgen. Voor het werken met lijsten, de voor-lus is efficiënter.

De functie beëindigen

Met de datastructuren en lussen op zijn plaats, zal ik nu de code uitwerken. De rest van de code ziet er zo uit:

functie! CreateProject (bestand) laat dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] laat files = ["/ js / base.js", "/css/base.css", "/doc/help.html"] laat parent = fnamemodify (a: file, ": p: h") voor dir in dirs laat newdir = l: parent. dir if! isdirectory (l: newdir) call mkdir (l: newdir) endif endfor voor naam in bestanden laat newfile = l: parent. name if! bestandsleesbaar (nieuw bestand) oproepsysteem ("touch". l: nieuw bestand) endif endfor endfunc autocmd BufNewFile * .html: call CreateProject (expand ('%: p')) 

Ik heb een nieuwe variabele toegevoegd ouder dat is de hoofddirectorystructuur van het bestand dat aan de functie wordt gegeven. Het bevel fnamemodify kunt u verschillende delen van een pad uitpakken over verschillende platforms. U kunt er meer over lezen met behulp van de Vim help systeem: : help fnamemodify (). Opmerking, om te verwijzen naar de het dossier variabele doorgegeven aan de functie die ik had om het te vullen met de een:. De een: scope verwijst naar de eenrguments.

In elke lus, heb ik een variabele gemaakt die de bovenliggende map met de nieuwe map of bestandsnaam opsplitst. Ik kijk vervolgens of ze bestaan ​​en maak ze als ze niet bestaan. Om te controleren op het bestaan, de isDirectory () functiecontroles voor de directory, en filereadable () controleert het bestand. Ik gebruik een ! om de retourwaarde van de functies te ontkennen. Voor het maken van mappen belt u de mkdir () commando. Om lege bestanden te maken, moet u de systeemopdracht gebruiken aanraken.

Merk ook op in elke lus en if-statement moest ik de variabelen in de bovenste scopes inscannen met de l: scope. De l: scope verwijst naar overal in de functiedefinitie. Lagere bereiken nemen niet automatisch de bovenste bereiken over! Dit betrapt me de hele tijd.

Maximale geweldig

Nu krijg je zwaar gebruik van Vim, Maximale geweldig is een installatiepakket dat veel geweldige standaardinstellingen en pakketten laadt voor gebruik Vim op de Mac. Het is Ruby on Rails centraal, maar is handig voor elk type programmering.

Open het standaardprogramma in een map waarin u het pakket wilt installeren. Typ vervolgens deze opdrachten:

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

Als het klaar is, open dan Vim opnieuw en je ziet een mooie werkomgeving.

Er zijn veel interessante pakketten in deze opstelling. Veel plezier met het verkennen!

Conclusie

Nu u weet hoe u automatiseringsscripts kunt maken om uw werkproces te vergemakkelijken, kunt u experimenteren met andere handige functies.

Wanneer u een personaliseert Vim omgeving, je zult meer controle krijgen en meer kunnen doen. Onthoud dat oefenen met wat je leert de enige manier is om het te verbeteren en te onthouden. Dus, ga je gang en oefen het maken van je eigen automatiseringsscripts in VimScript!