This was my first stab at editing a language definition. I tried to add "COPY" support as well, but couldn't get it to work for whatever reason. This version supports most keywords in the spec. I'll try and add better stored procedure/function support as well as get copy working and respam.
'njoy, Mark
{ scopeName = "source.sql"; fileTypes = ( "sql", "ddl", "dml" ); foldingStartMarker = "\s*\(\s*$"; foldingStopMarker = "^\s*\)"; patterns = ( { name = "declaration.create.sql"; match = "(?i:^\s*(create)\s+(aggregate|conversion|database|domain|function|group|(unique\s+)?index|language|operator|operator class|rule|schema|sequence|table|tablespace|trigger|type|user|view)\s+)(\w+)"; captures = { 1 = { name = "keyword.function.create.sql"; }; 2 = { name = "keyword.other.sql"; }; 4 = { name = "entity.name.function.sql"; }; }; }, { name = "keyword.other.DDL.create.II.sql"; match = "(?i:\s+(on\s+|(not\s+)?null)\b)"; }, { name = "declaration.drop.sql"; match = "(?i:^\s*(drop)\s+(aggregate|conversion|database|domain|function|group|index|language|operator|operator class|rule|schema|sequence|table|tablespace|trigger|type|user|view))"; captures = { 1 = { name = "support.function.create.sql"; }; 2 = { name = "keyword.other.sql"; }; }; }, { name = "declaration.drop.sql"; match = "(?i:\s*(drop)\s+(table)\s+(\w+)(\s+cascade)?\b)"; captures = { 1 = { name = "support.function.create.sql"; }; 2 = { name = "keyword.other.table.sql"; }; 3 = { name = "entity.name.function.sql"; }; 4 = { name = "keyword.other.cascade.sql"; }; }; }, { name = "declaration.alter.sql"; match = "(?i:^\s*(alter)\s+(aggregate|conversion|database|domain|function|group|index|language|operator|operator class|rule|schema|sequence|table|tablespace|trigger|type|user|view)\s+)"; captures = { 1 = { name = "support.function.create.sql"; }; 2 = { name = "keyword.other.table.sql"; }; }; }, { name = "keyword.other.DML.sql"; match = "(?i:^\s*([\(]{0,}select(\s+distinct)?|insert\s+into|update|delete|from|where|group\sby|and|union(\s+all)?|having|order\sby)\b)"; }, { name = "keyword.other.DML.II.sql"; match = "(?i:\s+values\s+)"; }, { name = "keyword.other.sql.LUW.sql"; match = "(?i:(begin(\s+work)?|commit(\s+work)?|rollback(\s+work)?))"; }, { name = "keyword.other.authorization.sql"; match = "(?i:(grant(\swith\sgrant\soption)?|revoke))"; }, { name = "storage.type.sql"; match = "(?i:^\s*([A-Za-z0-9'_])+\s+(bigint|bigserial|bit|bit\svarying\(\d+\)|boolean|box|bytea|character\s(varying)?\(\d+\)|char\(\d+\)|var\schar\(\d+\)|cidr|circle|date|double\sprecision|inet|int|integer|interval\(\d+\)|line|lseg|macaddr|money|numeric(\(\d+,\d+\))?|oid|path|point|polygon|real|smallint|serial|text|times(\(\d+\))(\swithoutstimeszone)?|timestamp(s(\(\d+\))(\swithoutstimeszone)?)?|varchar(\(\d+\))?)\s*)"; }, { name = "storage.modifier.sql"; match = "(?i:\b(primary\s+key|references|on\sdelete(\s+cascade)?|check)\b)"; }, { name = "keyword.other.data-integrity.sql"; match = "(?i:\bin\b)"; }, { name = "string.quoted.single.sql"; begin = "'"; end = "'"; swallow = "\\."; }, { name = "keyword.other.object-comments.sql"; match = "(?i:^\s*(comment\s+on\s+(table|column|aggregate|constraint|database|domain|function|index|operator|rule|schema|sequence|trigger|type|view))\s+.*?\s+(is)\s+)"; }, { name = "comment.line.double-dash.sql"; match = "--.*$"; }, { name = "string.quoted.double.sql"; begin = """; end = """; patterns = ( { name = "string.interpolation.sql"; match = "#\{([^\}]*)\}"; } ); }, { name = "string.quoted.double.sql"; begin = "%\{"; end = "\}"; patterns = ( { name = "string.interpolation.sql"; match = "#\{([^\}]*)\}"; } ); }, { name = "string.regexp.sql"; begin = "/(?=\S.*/)"; end = "/"; patterns = ( { name = "string.interpolation.sql"; match = "#\{([^\}]*)\}"; }, { name = "string.escaped-slash.sql"; match = "\\/"; }, ); }, { name = "string.regexp.modr.sql"; begin = "%r\{"; end = "\}"; patterns = ( { name = "string.interpolation.sql"; match = "#\{([^\}]*)\}"; }, { name = "constant.character.escaped.slash.sql"; match = "\\/"; }, ); }, ); increaseIndentPattern = "^\s*(create|grant|insert|delete|update)\s*"; }