From 6b01452f9b0d4b60240552adc770f9054973f516 Mon Sep 17 00:00:00 2001 From: Humberto Anjos Date: Wed, 4 Feb 2015 17:43:36 -0200 Subject: [PATCH 1/7] Detecting namespaced symbols (e.g. string/join), and trying to distinguish the first symbol in a sexp. --- grammars/clojure.cson | 58 ++++++++++++++++++++++++++++++++++++++++--- package.json | 6 ++--- 2 files changed, 58 insertions(+), 6 deletions(-) diff --git a/grammars/clojure.cson b/grammars/clojure.cson index ee921d5..1572f70 100644 --- a/grammars/clojure.cson +++ b/grammars/clojure.cson @@ -45,6 +45,9 @@ { 'include': '#constants' } + { + 'include': '#namespaced-symbol' + } { 'include': '#symbol' } @@ -90,10 +93,12 @@ 'name': 'constant.numeric.decimal.clojure' } { - 'match': '(?<=(\\s|\\(|\\[|\\{)):[a-zA-Z0-9\\#\\.\\-\\_\\:\\+\\=\\>\\<\\/\\!\\?\\*]+(?=(\\s|\\)|\\]|\\}))' - 'name': 'constant.keyword.clojure' + 'include': '#keyword' } ] + 'keyword': + 'match': '(?<=(\\s|\\(|\\[|\\{)):[a-zA-Z0-9\\#\\.\\-\\_\\:\\+\\=\\>\\<\\/\\!\\?\\*]+(?=(\\s|\\)|\\]|\\}))' + 'name': 'constant.keyword.clojure' 'keyfn': 'patterns': [ { @@ -180,6 +185,41 @@ } ] } + { + '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' + } + ] + } { 'include': '$self' } @@ -206,10 +246,22 @@ 'name': 'constant.character.escape.clojure' } ] + 'namespaced-symbol': + 'patterns': [ + { + 'match': '([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)/([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\/\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)' + 'name': 'meta.symbol.namespaced-symbol.clojure' + 'captures': + '1': + 'name': 'meta.symbol.namespace.clojure' + '2': + 'name': 'meta.symbol.clojure' + } + ] 'symbol': 'patterns': [ { - 'match': '(\\w[\\w\\d]+)' + 'match': '([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)' 'name': 'meta.symbol.clojure' } ] diff --git a/package.json b/package.json index 0d7dbb6..8bbed0b 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,13 @@ "atom": "*", "node": "*" }, - "homepage": "http://atom.github.io/language-clojure", + "homepage": "https://github.com/hanjos/language-clojure", "repository": { "type": "git", - "url": "https://github.com/atom/language-clojure" + "url": "https://github.com/hanjos/language-clojure" }, "license": "MIT", "bugs": { - "url": "https://github.com/atom/language-clojure/issues" + "url": "https://github.com/hanjos/language-clojure/issues" } } From a7f22f6107453d7cb04ba5fffb10bde9830e6284 Mon Sep 17 00:00:00 2001 From: Humberto Anjos Date: Thu, 5 Feb 2015 10:56:53 -0200 Subject: [PATCH 2/7] Understanding metadata and dynamic variables. --- grammars/clojure.cson | 75 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 3 deletions(-) diff --git a/grammars/clojure.cson b/grammars/clojure.cson index 1572f70..fa758d5 100644 --- a/grammars/clojure.cson +++ b/grammars/clojure.cson @@ -45,6 +45,12 @@ { 'include': '#constants' } + { + 'include': '#dynamic-variables' + } + { + 'include': '#metadata' + } { 'include': '#namespaced-symbol' } @@ -110,15 +116,56 @@ 'name': 'keyword.control.clojure' } ] + 'dynamic-variables': + 'match': '\\*[\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\d]+\\*' + 'name': 'meta.symbol.dynamic.clojure' 'map': 'begin': '(\\{)' + 'beginCaptures': + '1': + 'name': 'meta.map.begin.clojure' 'end': '(\\})' + 'endCaptures': + '1': + 'name': 'meta.map.end.clojure' 'name': 'meta.map.clojure' 'patterns': [ { 'include': '$self' } ] + 'metadata': + 'patterns': [ + { + 'begin': '(\\^\\{)' + 'beginCaptures': + '1': + 'name': 'meta.metadata.map.begin.clojure' + 'end': '(\\})' + 'endCaptures': + '1': + 'name': 'meta.metadata.map.end.clojure' + 'name': 'meta.metadata.map.clojure' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + 'begin': '(\\^)' + 'end': '(\\s|\\n)' + 'name': 'meta.metadata.simple.clojure' + 'patterns': [ + { + 'include': '#keyword' + } + { + 'include': '$self' + } + ] + } + ] 'quoted-sexp': 'begin': '([\'``]\\()' 'beginCaptures': @@ -171,15 +218,37 @@ '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': [ + { + 'include': '#metadata' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + 'include': '#dynamic-variables' + 'patterns': [ + { + 'include': '$self' + } + ] + } + { + 'include': '#symbol' + 'patterns': [ + { + 'include': '$self' + } + ] + } { 'include': '$self' } From bf4e5637731a9efc779f9f3e665cccb72a8d63bf Mon Sep 17 00:00:00 2001 From: Humberto Anjos Date: Thu, 5 Feb 2015 11:03:11 -0200 Subject: [PATCH 3/7] Biting the bullet and copy-and-pasting #symbol to generate entity.global.clojures. --- grammars/clojure.cson | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/grammars/clojure.cson b/grammars/clojure.cson index fa758d5..4d32295 100644 --- a/grammars/clojure.cson +++ b/grammars/clojure.cson @@ -242,7 +242,9 @@ ] } { - 'include': '#symbol' + # copied and pasted from #symbol, screw it + 'match': '([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)' + 'name': 'entity.global.clojure' 'patterns': [ { 'include': '$self' From 33ccde11dca37fa05d172523b78d707aa08a9935 Mon Sep 17 00:00:00 2001 From: Humberto Anjos Date: Thu, 5 Feb 2015 12:42:42 -0200 Subject: [PATCH 4/7] Reversing package.json for a pull request. --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 8bbed0b..0d7dbb6 100644 --- a/package.json +++ b/package.json @@ -6,13 +6,13 @@ "atom": "*", "node": "*" }, - "homepage": "https://github.com/hanjos/language-clojure", + "homepage": "http://atom.github.io/language-clojure", "repository": { "type": "git", - "url": "https://github.com/hanjos/language-clojure" + "url": "https://github.com/atom/language-clojure" }, "license": "MIT", "bugs": { - "url": "https://github.com/hanjos/language-clojure/issues" + "url": "https://github.com/atom/language-clojure/issues" } } From e06812753f1ed0f7cb3979eddfed7b75220ff22e Mon Sep 17 00:00:00 2001 From: Humberto Anjos Date: Thu, 5 Feb 2015 13:06:16 -0200 Subject: [PATCH 5/7] Properly rendering namespaced variables; detecting the beginning and end of sets. --- grammars/clojure.cson | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/grammars/clojure.cson b/grammars/clojure.cson index 4d32295..a15dbc7 100644 --- a/grammars/clojure.cson +++ b/grammars/clojure.cson @@ -52,7 +52,7 @@ 'include': '#metadata' } { - 'include': '#namespaced-symbol' + 'include': '#namespace-symbol' } { 'include': '#symbol' @@ -98,7 +98,7 @@ 'match': '(\\d+)' 'name': 'constant.numeric.decimal.clojure' } - { + { # separating the pattern for reuse 'include': '#keyword' } ] @@ -197,7 +197,13 @@ 'name': 'string.regexp.clojure' 'set': 'begin': '(\\#\\{)' + 'beginCaptures': + '1': + 'name': 'meta.set.begin.clojure' 'end': '(\\})' + 'endCaptures': + '1': + 'name': 'meta.set.end.clojure' 'name': 'meta.set.clojure' 'patterns': [ { @@ -226,6 +232,7 @@ 'name': 'meta.definition.global.clojure' 'patterns': [ { + # there may be some metadata before an actual definition 'include': '#metadata' 'patterns': [ { @@ -233,7 +240,7 @@ } ] } - { + { # dynamic variables are rendered diferently 'include': '#dynamic-variables' 'patterns': [ { @@ -242,6 +249,7 @@ ] } { + # recognizing a symbol as being defined here # copied and pasted from #symbol, screw it 'match': '([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)' 'name': 'entity.global.clojure' @@ -317,16 +325,14 @@ 'name': 'constant.character.escape.clojure' } ] - 'namespaced-symbol': + 'namespace-symbol': 'patterns': [ - { - 'match': '([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)/([\\w\\.\\-\\_\\:\\+\\=\\>\\<\\/\\!\\?\\*][\\w\\.\\-\\_\\:\\+\\=\\>\\<\\!\\?\\*\\d]+)' - 'name': 'meta.symbol.namespaced-symbol.clojure' + { # 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' - '2': - 'name': 'meta.symbol.clojure' } ] 'symbol': From 1bb409be349e544b9a2ac00df2d6220587e41e07 Mon Sep 17 00:00:00 2001 From: Humberto Anjos Date: Thu, 5 Feb 2015 21:31:55 -0200 Subject: [PATCH 6/7] Removing an unnecessary \n pattern. --- grammars/clojure.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grammars/clojure.cson b/grammars/clojure.cson index a15dbc7..d81815c 100644 --- a/grammars/clojure.cson +++ b/grammars/clojure.cson @@ -154,7 +154,7 @@ } { 'begin': '(\\^)' - 'end': '(\\s|\\n)' + 'end': '(\\s)' 'name': 'meta.metadata.simple.clojure' 'patterns': [ { From bdac0e1938546fcc679ef15fe889a1b04755acd7 Mon Sep 17 00:00:00 2001 From: Humberto Anjos Date: Thu, 5 Feb 2015 21:44:44 -0200 Subject: [PATCH 7/7] Scopes for the beginnings/ends of maps/sets are now punctuation.section.* --- grammars/clojure.cson | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/grammars/clojure.cson b/grammars/clojure.cson index d81815c..d1bed49 100644 --- a/grammars/clojure.cson +++ b/grammars/clojure.cson @@ -123,11 +123,11 @@ 'begin': '(\\{)' 'beginCaptures': '1': - 'name': 'meta.map.begin.clojure' + 'name': 'punctuation.section.map.begin.clojure' 'end': '(\\})' 'endCaptures': '1': - 'name': 'meta.map.end.clojure' + 'name': 'punctuation.section.map.end.clojure' 'name': 'meta.map.clojure' 'patterns': [ { @@ -140,11 +140,11 @@ 'begin': '(\\^\\{)' 'beginCaptures': '1': - 'name': 'meta.metadata.map.begin.clojure' + 'name': 'punctuation.section.metadata.map.begin.clojure' 'end': '(\\})' 'endCaptures': '1': - 'name': 'meta.metadata.map.end.clojure' + 'name': 'punctuation.section.metadata.map.end.clojure' 'name': 'meta.metadata.map.clojure' 'patterns': [ { @@ -199,11 +199,11 @@ 'begin': '(\\#\\{)' 'beginCaptures': '1': - 'name': 'meta.set.begin.clojure' + 'name': 'punctuation.section.set.begin.clojure' 'end': '(\\})' 'endCaptures': '1': - 'name': 'meta.set.end.clojure' + 'name': 'punctuation.section.set.end.clojure' 'name': 'meta.set.clojure' 'patterns': [ {