[TxMt] Additional Keyword support for SQL Language

Mark Cotner mcotner at yahoo.com
Sun Jul 31 11:34:42 UTC 2005


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*";
}



More information about the textmate mailing list