Skip to content

Commit bd2a734

Browse files
authored
Merge pull request #5 from clojure-vim/perf
Perf
2 parents 383ee83 + d5f1eee commit bd2a734

File tree

4 files changed

+55
-50
lines changed

4 files changed

+55
-50
lines changed

clj/src/vim_clojure_static/test.clj

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
test-file (str "tmp/" name ".clj")
9191
syntable (gensym "syntable")]
9292
`(test/deftest ~name
93+
(~io/make-parents ~test-file)
9394
(spit ~test-file "")
9495
(let [~syntable (syn-id-names ~test-file ~@strings)]
9596
~@(map (fn [{:keys [fmt ss λs]}]

clj/test/vim_clojure_static/syntax_test.clj

+44-23
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
(defpredicates number :clojureNumber)
1111
(defpredicates kw :clojureKeyword)
12+
(defpredicates character :clojureCharacter)
1213
(defpredicates regexp :clojureRegexp)
1314
(defpredicates regexp-escape :clojureRegexpEscape)
1415
(defpredicates regexp-char-class :clojureRegexpCharClass)
@@ -37,6 +38,7 @@
3738
"0x0" number "+0x0" number "-0x0" number ; Hexadecimal zero
3839
"3/2" number "+3/2" number "-3/2" number ; Rational
3940
"0/0" number "+0/0" number "-0/0" number ; Rational (not a syntax error)
41+
"36r0XYZ" number "16rFF" number "8r077" number ; Radix
4042
"2r1" number "+2r1" number "-2r1" number ; Radix
4143
"36R1" number "+36R1" number "-36R1" number ; Radix
4244

@@ -49,7 +51,7 @@
4951
"1.0/1" !number
5052
"01/2" !number
5153
"1/02" !number
52-
"2r2" !number
54+
; "2r2" !number ;; Removed for performance
5355
"1r0" !number
5456
"37r36" !number
5557

@@ -70,7 +72,7 @@
7072
"08.9M" !number
7173
"0x1fM" !number
7274
"3/4M" !number
73-
"2r1M" !number
75+
; "2r1M" !number ;; Removed for performance
7476

7577
;; Exponential notation
7678

@@ -84,27 +86,46 @@
8486

8587
(comment (test #'test-number-literals))
8688

87-
;; TODO: Finish me! (this was in an old git stash)
88-
;; (defsyntaxtest keywords-test
89-
;; (with-format "%s"
90-
;; ":1" kw
91-
;; ":A" kw
92-
;; ":a" kw
93-
;; ":αβγ" kw
94-
;; "::a" kw
95-
;; ":a/b" kw
96-
;; ":a:b" kw
97-
;; ":a:b/:c:b" kw
98-
;; ":a/b/c/d" kw
99-
;; "::a/b" !kw
100-
;; "::" !kw
101-
;; ":a:" !kw
102-
;; ":a/" !kw
103-
;; ":/" !kw
104-
;; ":" !kw
105-
;; ))
106-
;;
107-
;; (comment (test #'keywords-test))
89+
(defsyntaxtest test-character-literals
90+
["[%s]"
91+
["\\0" character "\\a" character "\\Z" character
92+
"\\." character "\\\\" character "\\" character
93+
"\\o7" character "\\o07" character "\\o307" character
94+
"\\o8" !character "\\o477" !character "\\o0007" !character
95+
96+
"\\u09af" character
97+
98+
"\\u0" !character "\\u01" !character "\\u012" !character
99+
"\\u01234" !character "\\u0123g" !character
100+
101+
"\\newline" character "\\new" !character
102+
"\\tab" character "\\ta" !character
103+
"\\space" character "\\sp" !character
104+
"\\return" character "\\ret" !character
105+
"\\backspace" character "\\bs" !character
106+
"\\formfeed" character "\\ff" !character]])
107+
108+
(comment (test #'test-character-literals))
109+
110+
(defsyntaxtest keywords-test
111+
["%s"
112+
[":1" kw
113+
":A" kw
114+
":a" kw
115+
":αβγ" kw
116+
"::a" kw
117+
":a/b" kw
118+
":a:b" kw
119+
":a:b/:c:b" kw
120+
":a/b/c/d" kw
121+
"::a/b" kw
122+
"::" !kw
123+
":a:" !kw
124+
":a/" !kw
125+
; ":/" !kw ; This is legal, but for simplicity we do not match it
126+
":" !kw]])
127+
128+
(comment (test #'keywords-test))
108129

109130
(defsyntaxtest test-java-regexp-literals
110131
["#\"%s\""

ftplugin/clojure.vim

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ set cpo&vim
1717

1818
let b:undo_ftplugin = 'setlocal iskeyword< define< formatoptions< comments< commentstring< lispwords<'
1919

20-
setlocal iskeyword+=?,-,*,!,+,/,=,<,>,.,:,$
20+
setlocal iskeyword+=?,-,*,!,+,/,=,<,>,.,:,$,%,&,\|
2121

2222
" There will be false positives, but this is better than missing the whole set
2323
" of user-defined def* definitions.

syntax/clojure.vim

+9-26
Original file line numberDiff line numberDiff line change
@@ -68,40 +68,23 @@ delfunction s:syntax_keyword
6868
" * Must not end in a : or /
6969
" * Must not have two adjacent colons except at the beginning
7070
" * Must not contain any reader metacharacters except for ' and #
71-
syntax match clojureKeyword "\v<:{1,2}%([^ \n\r\t()\[\]{}";@^`~\\%/]+/)*[^ \n\r\t()\[\]{}";@^`~\\%/]+:@<!>"
71+
syntax match clojureKeyword "\v<:{1,2}%([^ \n\r\t()\[\]{}";@^`~\\%/]+/)*[^ \n\r\t()\[\]{}";@^`~\\%/]+:@1<!>"
7272

7373
syntax match clojureStringEscape "\v\\%([\\btnfr"]|u\x{4}|[0-3]\o{2}|\o{1,2})" contained
7474

7575
syntax region clojureString matchgroup=clojureStringDelimiter start=/"/ skip=/\\\\\|\\"/ end=/"/ contains=clojureStringEscape,@Spell
7676

77-
syntax match clojureCharacter "\\."
78-
syntax match clojureCharacter "\\o\%([0-3]\o\{2\}\|\o\{1,2\}\)"
79-
syntax match clojureCharacter "\\u\x\{4\}"
80-
syntax match clojureCharacter "\\space"
81-
syntax match clojureCharacter "\\tab"
82-
syntax match clojureCharacter "\\newline"
83-
syntax match clojureCharacter "\\return"
84-
syntax match clojureCharacter "\\backspace"
85-
syntax match clojureCharacter "\\formfeed"
77+
syntax match clojureCharacter "\v\\%(o%([0-3]\o{2}|\o{1,2})|u\x{4}|newline|tab|space|return|backspace|formfeed|.)"
8678

87-
syntax match clojureSymbol "\v%([a-zA-Z!$&*_+=|<.>?-]|[^\x00-\x7F])+%(:?%([a-zA-Z0-9!#$%&*_+=|'<.>/?-]|[^\x00-\x7F]))*[#:]@<!"
79+
syntax match clojureSymbol "\v%([a-zA-Z!$&*_+=|<.>?-]|[^\x00-\x7F])+%(:?%([a-zA-Z0-9!#$%&*_+=|'<.>/?-]|[^\x00-\x7F]))*[#:]@1<!"
8880

89-
let s:radix_chars = "0123456789abcdefghijklmnopqrstuvwxyz"
90-
for s:radix in range(2, 36)
91-
execute 'syntax match clojureNumber "\v\c<[-+]?' . s:radix . 'r[' . strpart(s:radix_chars, 0, s:radix) . ']+>"'
92-
endfor
93-
unlet! s:radix_chars s:radix
94-
95-
syntax match clojureNumber "\v<[-+]?%(0\o*|0x\x+|[1-9]\d*)N?>"
96-
syntax match clojureNumber "\v<[-+]?%(0|[1-9]\d*|%(0|[1-9]\d*)\.\d*)%(M|[eE][-+]?\d+)?>"
97-
syntax match clojureNumber "\v<[-+]?%(0|[1-9]\d*)/%(0|[1-9]\d*)>"
81+
" NB. Correct matching of radix literals was removed for better performance.
82+
syntax match clojureNumber "\v<[-+]?%(%([2-9]|[12]\d|3[0-6])[rR][[:alnum:]]+|%(0\o*|0x\x+|[1-9]\d*)N?|%(0|[1-9]\d*|%(0|[1-9]\d*)\.\d*)%(M|[eE][-+]?\d+)?|%(0|[1-9]\d*)/%(0|[1-9]\d*))>"
9883

9984
syntax match clojureVarArg "&"
10085

101-
syntax match clojureQuote "'"
102-
syntax match clojureQuote "`"
103-
syntax match clojureUnquote "\~"
104-
syntax match clojureUnquote "\~@"
86+
syntax match clojureQuote "\v['`]"
87+
syntax match clojureUnquote "\v\~\@?"
10588
syntax match clojureMeta "\^"
10689
syntax match clojureDeref "@"
10790
syntax match clojureDispatch "\v#[\^'=<_]?"
@@ -134,14 +117,14 @@ syntax match clojureRegexpBoundary "[$^]" contained display
134117
syntax match clojureRegexpQuantifier "[?*+][?+]\=" contained display
135118
syntax match clojureRegexpQuantifier "\v\{\d+%(,|,\d+)?}\??" contained display
136119
syntax match clojureRegexpOr "|" contained display
137-
syntax match clojureRegexpBackRef "\v\\%([1-9]\d*|k\<[a-zA-z]+\>)" contained display
120+
syntax match clojureRegexpBackRef "\v\\%([1-9]\d*|k\<[[:alpha:]]+\>)" contained display
138121

139122
" Mode modifiers, mode-modified spans, lookaround, regular and atomic
140123
" grouping, and named-capturing.
141124
syntax match clojureRegexpMod "\v\(@<=\?:" contained display
142125
syntax match clojureRegexpMod "\v\(@<=\?[xdsmiuU]*-?[xdsmiuU]+:?" contained display
143126
syntax match clojureRegexpMod "\v\(@<=\?%(\<?[=!]|\>)" contained display
144-
syntax match clojureRegexpMod "\v\(@<=\?\<[a-zA-Z]+\>" contained display
127+
syntax match clojureRegexpMod "\v\(@<=\?\<[[:alpha:]]+\>" contained display
145128

146129
syntax region clojureRegexpGroup start="(" skip=/\\\\\|\\)/ end=")" matchgroup=clojureRegexpGroup contained contains=clojureRegexpMod,clojureRegexpQuantifier,clojureRegexpBoundary,clojureRegexpEscape,@clojureRegexpCharClasses
147130
syntax region clojureRegexp start=/\#"/ skip=/\\\\\|\\"/ end=/"/ contains=@clojureRegexpCharClasses,clojureRegexpEscape,clojureRegexpQuote,clojureRegexpBoundary,clojureRegexpQuantifier,clojureRegexpOr,clojureRegexpBackRef,clojureRegexpGroup keepend

0 commit comments

Comments
 (0)