Skip to content

Commit 6ed4a6c

Browse files
Bostbbatsov
authored andcommitted
Fix font-locking of namespaced keywords
See #474
1 parent d1e0a6e commit 6ed4a6c

File tree

3 files changed

+247
-152
lines changed

3 files changed

+247
-152
lines changed

clojure-mode.el

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -854,18 +854,19 @@ any number of matches of `clojure--sym-forbidden-rest-chars'."))
854854

855855
;; TODO dedupe the code for matching of keywords, type-hints and unmatched symbols
856856

857-
;; keywords: {:oneword/veryCom|pLex.stu-ff 0}
858-
(,(concat "\\(:\\)\\(" clojure--sym-regexp "\\)\\(/\\)\\(" clojure--sym-regexp "\\)")
857+
;; keywords: {:oneword/ve/yCom|pLex.stu-ff 0}
858+
(,(concat "\\(:\\{1,2\\}\\)\\(" clojure--sym-regexp "?\\)\\(/\\)\\(" clojure--sym-regexp "\\)")
859859
(1 'clojure-keyword-face)
860860
(2 font-lock-type-face)
861+
;; (2 'clojure-keyword-face)
861862
(3 'default)
862863
(4 'clojure-keyword-face))
863-
(,(concat "\\(:\\)\\(" clojure--sym-regexp "\\)")
864+
(,(concat "\\(:\\{1,2\\}\\)\\(" clojure--sym-regexp "\\)")
864865
(1 'clojure-keyword-face)
865866
(2 'clojure-keyword-face))
866867

867868
;; type-hints: #^oneword
868-
(,(concat "\\(#^\\)\\(" clojure--sym-regexp "\\)\\(/\\)\\(" clojure--sym-regexp "\\)")
869+
(,(concat "\\(#^\\)\\(" clojure--sym-regexp "?\\)\\(/\\)\\(" clojure--sym-regexp "\\)")
869870
(1 'default)
870871
(2 font-lock-type-face)
871872
(3 'default)
@@ -875,7 +876,7 @@ any number of matches of `clojure--sym-forbidden-rest-chars'."))
875876
(2 font-lock-type-face))
876877

877878
;; clojure symbols not matched by the previous regexps
878-
(,(concat "\\(" clojure--sym-regexp "\\)\\(/\\)\\(" clojure--sym-regexp "\\)")
879+
(,(concat "\\(" clojure--sym-regexp "?\\)\\(/\\)\\(" clojure--sym-regexp "\\)")
879880
(1 font-lock-type-face)
880881
(2 'default)
881882
(3 'default))

test.clj

Lines changed: 71 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
[seg.mnt]
66
[mxdCase]
77
[CmlCase]
8-
[veryCom|pLex.stu-ff]))
8+
[ve/yCom|pLex.stu-ff]))
99

1010
(defn foo [x] x)
1111
;; try to byte-recompile the clojure-mode.el when the face of 'fn' is 't'
@@ -57,7 +57,7 @@
5757
(comment ;; examples
5858

5959
SCREAMING_UPPER_CASE
60-
veryCom|pLex.stu-ff/.SCREAMING_UPPER_CASE
60+
ve/yCom|pLex.stu-ff/.SCREAMING_UPPER_CASE
6161

6262
oneword
6363
@oneword
@@ -69,8 +69,8 @@
6969
(oneword/seg.mnt)
7070
(oneword/CmlCase)
7171
(oneword/mxdCase)
72-
(oneword/veryCom|pLex.stu-ff)
73-
(oneword/.veryCom|pLex.stu-ff)
72+
(oneword/ve/yCom|pLex.stu-ff)
73+
(oneword/.ve/yCom|pLex.stu-ff)
7474

7575
seg.mnt
7676
@seg.mnt
@@ -82,8 +82,8 @@
8282
(seg.mnt/seg.mnt)
8383
(seg.mnt/CmlCase)
8484
(seg.mnt/mxdCase)
85-
(seg.mnt/veryCom|pLex.stu-ff)
86-
(seg.mnt/.veryCom|pLex.stu-ff)
85+
(seg.mnt/ve/yCom|pLex.stu-ff)
86+
(seg.mnt/.ve/yCom|pLex.stu-ff)
8787

8888
CmlCase
8989
@CmlCase
@@ -95,8 +95,8 @@
9595
(CmlCase/seg.mnt)
9696
(CmlCase/CmlCase)
9797
(CmlCase/mxdCase)
98-
(CmlCase/veryCom|pLex.stu-ff)
99-
(CmlCase/.veryCom|pLex.stu-ff)
98+
(CmlCase/ve/yCom|pLex.stu-ff)
99+
(CmlCase/.ve/yCom|pLex.stu-ff)
100100

101101
mxdCase
102102
@mxdCase
@@ -108,21 +108,48 @@
108108
(mxdCase/seg.mnt)
109109
(mxdCase/CmlCase)
110110
(mxdCase/mxdCase)
111-
(mxdCase/veryCom|pLex.stu-ff)
112-
(mxdCase/.veryCom|pLex.stu-ff)
113-
114-
veryCom|pLex.stu-ff
115-
@veryCom|pLex.stu-ff
116-
#veryCom|pLex.stu-ff
117-
#^veryCom|pLex.stu-ff ;; type-hint
118-
.veryCom|pLex.stu-ff
119-
(veryCom|pLex.stu-ff)
120-
(veryCom|pLex.stu-ff/oneword)
121-
(veryCom|pLex.stu-ff/seg.mnt)
122-
(veryCom|pLex.stu-ff/CmlCase)
123-
(veryCom|pLex.stu-ff/mxdCase)
124-
(veryCom|pLex.stu-ff/veryCom|pLex.stu-ff)
125-
(veryCom|pLex.stu-ff/.veryCom|pLex.stu-ff)
111+
(mxdCase/ve/yCom|pLex.stu-ff)
112+
(mxdCase/.ve/yCom|pLex.stu-ff)
113+
114+
ve/yCom|pLex.stu-ff
115+
@ve/yCom|pLex.stu-ff
116+
#ve/yCom|pLex.stu-ff
117+
#^ve/yCom|pLex.stu-ff ;; type-hint
118+
.ve/yCom|pLex.stu-ff
119+
(ve/yCom|pLex.stu-ff)
120+
(ve/yCom|pLex.stu-ff/oneword)
121+
(ve/yCom|pLex.stu-ff/seg.mnt)
122+
(ve/yCom|pLex.stu-ff/CmlCase)
123+
(ve/yCom|pLex.stu-ff/mxdCase)
124+
(ve/yCom|pLex.stu-ff/ve/yCom|pLex.stu-ff)
125+
(ve/yCom|pLex.stu-ff/.ve/yCom|pLex.stu-ff)
126+
127+
::foo
128+
:_::_:foo
129+
:_:_:foo
130+
:foo/:bar
131+
::_:foo
132+
::_:_:foo
133+
134+
:_:_:foo/_
135+
:_:_:foo/bar
136+
:_:_:foo/bar/eee
137+
:_:_:foo/bar_:foo
138+
:_:_:foo/bar_:_:foo
139+
140+
;; :_::_:foo/ ; invalid
141+
;; :_::_:foo/: ; invalid
142+
;; :_::_:foo/_ ; invalid
143+
;; :_::_:foo/bar ; invalid
144+
;; :_:_:foo/ ; invalid
145+
;; :_:_:foo/: ; invalid
146+
;; :::foo ; invalid
147+
;; :_::foo ; invalid
148+
;; :_:_:foo/: ; invalid
149+
;; :_:_:foo/_: ; invalid
150+
;; :_:_:foo/bar_: ; invalid
151+
;; :_:_:foo/bar_::_:foo ; invalid
152+
;; :foo/::bar ; invalid
126153

127154
:oneword
128155
{:oneword 0}
@@ -133,8 +160,8 @@
133160
{:oneword/seg.mnt 0}
134161
{:oneword/CmlCase 0}
135162
{:oneword/mxdCase 0}
136-
{:oneword/veryCom|pLex.stu-ff 0}
137-
{:oneword/.veryCom|pLex.stu-ff 0}
163+
{:oneword/ve/yCom|pLex.stu-ff 0}
164+
{:oneword/.ve/yCom|pLex.stu-ff 0}
138165

139166
{:seg.mnt 0}
140167
;; {:@seg.mnt 0} ; not allowed
@@ -144,8 +171,8 @@
144171
{:seg.mnt/seg.mnt 0}
145172
{:seg.mnt/CmlCase 0}
146173
{:seg.mnt/mxdCase 0}
147-
{:seg.mnt/veryCom|pLex.stu-ff 0}
148-
{:seg.mnt/.veryCom|pLex.stu-ff 0}
174+
{:seg.mnt/ve/yCom|pLex.stu-ff 0}
175+
{:seg.mnt/.ve/yCom|pLex.stu-ff 0}
149176

150177
:CmlCase
151178
{:CmlCase 0}
@@ -156,8 +183,8 @@
156183
{:CmlCase/seg.mnt 0}
157184
{:CmlCase/CmlCase 0}
158185
{:CmlCase/mxdCase 0}
159-
{:CmlCase/veryCom|pLex.stu-ff 0}
160-
{:CmlCase/.veryCom|pLex.stu-ff 0}
186+
{:CmlCase/ve/yCom|pLex.stu-ff 0}
187+
{:CmlCase/.ve/yCom|pLex.stu-ff 0}
161188

162189
:mxdCase
163190
{:mxdCase 0}
@@ -168,21 +195,21 @@
168195
{:mxdCase/seg.mnt 0}
169196
{:mxdCase/CmlCase 0}
170197
{:mxdCase/mxdCase 0}
171-
{:mxdCase/veryCom|pLex.stu-ff 0}
172-
{:mxdCase/.veryCom|pLex.stu-ff 0}
173-
174-
:veryCom|pLex.stu-ff
175-
{:veryCom|pLex.stu-ff 0}
176-
;; {:@veryCom|pLex.stu-ff 0} ; not allowed
177-
{:#veryCom|pLex.stu-ff 0}
178-
{:.veryCom|pLex.stu-ff 0}
179-
{:veryCom|pLex.stu-ff 0}
180-
{:veryCom|pLex.stu-ff/oneword 0}
181-
{:veryCom|pLex.stu-ff/seg.mnt 0}
182-
{:veryCom|pLex.stu-ff/CmlCase 0}
183-
{:veryCom|pLex.stu-ff/mxdCase 0}
184-
{:veryCom|pLex.stu-ff/veryCom|pLex.stu-ff 0}
185-
{:veryCom|pLex.stu-ff/.veryCom|pLex.stu-ff 0}
198+
{:mxdCase/ve/yCom|pLex.stu-ff 0}
199+
{:mxdCase/.ve/yCom|pLex.stu-ff 0}
200+
201+
:ve/yCom|pLex.stu-ff
202+
{:ve/yCom|pLex.stu-ff 0}
203+
;; {:@ve/yCom|pLex.stu-ff 0} ; not allowed
204+
{:#ve/yCom|pLex.stu-ff 0}
205+
{:.ve/yCom|pLex.stu-ff 0}
206+
{:ve/yCom|pLex.stu-ff 0}
207+
{:ve/yCom|pLex.stu-ff/oneword 0}
208+
{:ve/yCom|pLex.stu-ff/seg.mnt 0}
209+
{:ve/yCom|pLex.stu-ff/CmlCase 0}
210+
{:ve/yCom|pLex.stu-ff/mxdCase 0}
211+
{:ve/yCom|pLex.stu-ff/ve/yCom|pLex.stu-ff 0}
212+
{:ve/yCom|pLex.stu-ff/.ve/yCom|pLex.stu-ff 0}
186213
)
187214

188215
;; metadata doesn't break docstrings

0 commit comments

Comments
 (0)