Custom Live Templates voor Delphi 2006 en hoger |
Live Templates zitten in een XML bestand. Als je een nieuw Live Template wilt maken kun je File | New | Other doen, en dan kiezen voor de Code Template in de Other Files category:
Het resultaat is een template1.xml bestand, met de volgende inhoud:
<?xml version="1.0" encoding="utf-8" ?> <codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates" version="1.0.0"> <template name="" invoke="manual"> <description> </description> <author> </author> <code language=""><![CDATA[]]> </code> </template> </codetemplate>Waarbij de cursor midden tussen de twee dubbele quotes voor de name staat. Hier moet je de naam voor je code template invullen. Maar je kan niet zomaar alles invullen wat je wilt, want deze naam is meteen de tekst die je straks in de IDE moet intikken om de live template te activeren. Een korte pakkende naam als "log" is hierbij handiger dan een naam als "loganothermessageinlogfile". Als eerste voorbeeld wil ik hier "md" intikken, omdat ik een MessageDlg template wil maken.
<?xml version="1.0" encoding="utf-8" ?> <codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates" version="1.0.0"> <template name="md" invoke="manual"> <description>MessageDlg live template</description> <author>Bob Swart</author> <code language="Delphi"> <![CDATA[MessageDlg('|', mtInformation, [mbOK], 0);]]> </code> </template> </codetemplate>Het | teken dat tussen de quotes van de MessageDlg staat geeft aan waar de cursor komt nadat de live is geactiveerd. Hier kun je dus meteen je bericht intikken dat je wilt laten zien.
Live Template Points
Soms heb je meer dan één punt om in te vullen, en actieve Live Templates kunnen dan met behulp van de Tab toets van punt naar punt springen.
Om dergelijke punten aan te geven moeten we vóór de code tags eerst voor ieder punt een "point" tag opnemen, met daarin als attribuut de naam van het point, en optioneel een text en hint.
De inhoud van de text verschijnt als default text in de template, terwijl de hint vertoond wordt om aan te geven wat de bedoeling is.
Als we in het bestaande voorbeeld zowel de Message als de MessageType en de MessageButtons als een "point" willen aangeven (en erdoorheen willen tabben), dan kunnen we dat als volgt aangeven:
<?xml version="1.0" encoding="utf-8" ?> <codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates" version="1.0.0"> <template name="md" invoke="auto"> <description>MessageDlg live template</description> <author>Bob Swart</author> <point name="Message"> <text>Hello</text> <hint>Message</hint> </point> <point name="MessageType"> <text>mtInformation</text> <hint>Message Type</hint> </point> <point name="MessageButtons"> <text>mbOK</text> <hint>Message Buttons</hint> </point> <code language="Delphi" delimiter="|"> <![CDATA[MessageDlg('|Message|', |MessageType|, [|MessageButtons|], 0);|end|]]> </code> </template> </codetemplate>Let ook op de |end| die aan het eind van de live template staat, en aangeeft waar de cursor moet komen nadat de template gedeactiveerd is.
Deployment
Als je eenmaal een nieuw Live Template hebt beschreven in een XML bestand zoals we dat zojuist hebben gedaan, dan kun je dat bewaren, waarbij het default in de C:\Document and Settings\<user>\Local Settings\Application Data\Borland\BDS\4.0\code_templates directory komt.
Dat is niet een fijne plek vind ik zelf, dus kopieer ik het meestal naar de plek waar de reeds bestaande Live Templates staan, namelijk in de C:\Program Files\Borland\BDS\4.0\Objrepos\code_templates directory, waarbinnen al subdirectories voor c, csharp, delphi en XML te vinden zijn.
Mijn voorbeeld heb ik als md.xml in de BDS\4.0\Objrepos\code_templates\delphi directory bewaard.
Demo
Als je dan uiteindelijk in de code editor de tekst "md" intikt gevolgd door een spatie, dan wordt de "md" Live Template geactiveerd en krijg je het volgende effect:
We kunnen nu de message invullen, en met Tab of Shift+Tab navigeren van de Message naar de MessageType en de MessageButtons. Na een laatste Tab of een Escape wordt de Live Template weer gedeactiveerd, en staan we aan het eind van de gegenereerde code, precies als we met het |end| attribuut aangaven.