diff --git a/grammars/clojure.cson b/grammars/clojure.cson index ee921d5..d1bed49 100644 --- a/grammars/clojure.cson +++ b/grammars/clojure.cson @@ -45,6 +45,15 @@ { 'include': '#constants' } + { + 'include': '#dynamic-variables' + } + { + 'include': '#metadata' + } + { + 'include': '#namespace-symbol' + } { 'include': '#symbol' } @@ -89,11 +98,13 @@ 'match': '(\\d+)' 'name': 'constant.numeric.decimal.clojure' } - { - 'match': '(?<=(\\s|\\(|\\[|\\{)):[a-zA-Z0-9\\#\\.\\-\\_\\:\\+\\=\\>\\<\\/\\!\\?\\*]+(?=(\\s|\\)|\\]|\\}))' - 'name': 'constant.keyword.clojure' + { # separating the pattern for reuse + 'include': '#keyword' } ] + 'keyword': + 'match': '(?<=(\\s|\\(|\\[|\\{)):[a-zA-Z0-9\\#\\.\\-\\_\\:\\+\\=\\>\\<\\/\\!\\?\\*]+(?=(\\s|\\)|\\]|\\}))' + 'name': 'constant.keyword.clojure' 'keyfn': 'patterns': [ { @@ -105,15 +116,56 @@ 'name': 'keyword.control.clojure' } ] + 'dynamic-variables': + 'match': '\\*[\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\d]+\\*' + 'name': 'meta.symbol.dynamic.clojure' 'map': 'begin': '(\\{)' + 'beginCaptures': + '1': + 'name': 'punctuation.section.map.begin.clojure' 'end': '(\\})' + 'endCaptures': + '1': + 'name': 'punctuation.section.map.end.clojure' 'name': 'meta.map.clojure' 'patterns': [ { 'include': '$self' } ] + 'metadata': + 'patterns': [ + { + 'begin': '(\\^\\{)' + 'beginCaptures': + '1': + 'name': 'punctuation.section.metadata.map.begin.clojure' + 'end': '(\\})' + 'endCaptures': + '1': + 'name': 'punctuation.section.metadata.map.end.clojure' + 'name': 'meta.metadata.map.clojure' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + 'begin': '(\\^)' + 'end': '(\\s)' + 'name': 'meta.metadata.simple.clojure' + 'patterns': [ + { + 'include': '#keyword' + } + { + 'include': '$self' + } + ] + } + ] 'quoted-sexp': 'begin': '([\'``]\\()' 'beginCaptures': @@ -145,7 +197,13 @@ 'name': 'string.regexp.clojure' 'set': 'begin': '(\\#\\{)' + 'beginCaptures': + '1': + 'name': 'punctuation.section.set.begin.clojure' 'end': '(\\})' + 'endCaptures': + '1': + 'name': 'punctuation.section.set.end.clojure' 'name': 'meta.set.clojure' 'patterns': [ { @@ -166,14 +224,75 @@ 'name': 'meta.expression.clojure' 'patterns': [ { - 'begin': '(?<=\\()(ns|def|def-|defn|defn-|defvar|defvar-|defmacro|defmacro-|deftest)\\s+(.+?)(?=\\s|\\))' + 'begin': '(?<=\\()(ns|def|def-|defn|defn-|defvar|defvar-|defmacro|defmacro-|deftest)\\s+' 'beginCaptures': '1': 'name': 'keyword.control.clojure' - '2': - 'name': 'entity.global.clojure' 'end': '(?=\\))' 'name': 'meta.definition.global.clojure' + 'patterns': [ + { + # there may be some metadata before an actual definition + 'include': '#metadata' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { # dynamic variables are rendered diferently + 'include': '#dynamic-variables' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + # recognizing a symbol as being defined here + # copied and pasted from #symbol, screw it + 'match': '([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)' + 'name': 'entity.global.clojure' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + 'include': '$self' + } + ] + } + { + 'include': '#keyfn' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + 'include': '#constants' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + 'include': '#vector' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + 'match': '(?<=\\()(.+?)(?=\\s|\\))' + 'captures': + '1': + 'name': 'entity.name.function.clojure' 'patterns': [ { 'include': '$self' @@ -206,10 +325,20 @@ 'name': 'constant.character.escape.clojure' } ] + 'namespace-symbol': + 'patterns': [ + { # copied from #symbol, plus a / at the end. Matches the "app/" part of + # "app/*config*" + 'match': '([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)/' + 'captures': + '1': + 'name': 'meta.symbol.namespace.clojure' + } + ] 'symbol': 'patterns': [ { - 'match': '(\\w[\\w\\d]+)' + 'match': '([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)' 'name': 'meta.symbol.clojure' } ]