blob: 413cc556a43b221f098bad29d7cf53df99277816 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
provide-module -override wren %§
add-highlighter shared/wren regions
add-highlighter shared/wren/line_comment region '//' '$' fill comment
add-highlighter shared/wren/block_comment region -recurse '/\*' '/\*' '\*/' fill comment
add-highlighter shared/wren/raw_string region '"""' '(?<!\\)(?:\\\\)*"""' fill string
add-highlighter shared/wren/string region '"' '(?<!\\)(\\\\)*"' group
add-highlighter shared/wren/string/ fill string
add-highlighter shared/wren/string/ regex '\\([0"\\%abefnrtv]|x[\dA-Fa-f]{2}|u[\dA-Fa-f]{4}|U[\dA-Fa-f]{8})'0:value
add-highlighter shared/wren/string/ regex '(?<!\\)%\(.*?\)' 0:value
add-highlighter shared/wren/code default-region group
add-highlighter shared/wren/code/ regex '(?i)([a-z][\w_]*)\h*(?=[\(\{])' 1:function
add-highlighter shared/wren/code/ regex '(?i)([a-z][\w_]*)=\(.*?\)\h*(?=\{)' 1:function
add-highlighter shared/wren/code/ regex 'class\h+(?i)([a-z][\w_]*)\h*(?=\{)' 1:type
add-highlighter shared/wren/code/ regex 'construct\h+(?i)([a-z][\w_]*)\h*(?=\()' 1:meta
add-highlighter shared/wren/code/ regex 'var\h+(?i)([a-z][\w_]*)' 1:variable
add-highlighter shared/wren/code/ regex '\b_[\w_]+' 0:variable
add-highlighter shared/wren/code/ regex '\bimport\b' 0:meta
add-highlighter shared/wren/code/ regex '\b(true|false|null)\b' 0:value
add-highlighter shared/wren/code/ regex '\b(as|break|class|construct|continue|else|for|foreign|if|in|return|static|super|this|var|while)\b' 0:keyword
add-highlighter shared/wren/code/ regex '\b(Bool|Class|Fiber|Fn|List|Map|Null|Num|Object|Range|Sequence|String|System)\b' 0:+b@type
add-highlighter shared/wren/code/ regex '(-|!|~|\*|/|%|\+|\.\.\.?|<<|>>|&{1,2}|\^|\|{1,2}|[<>]=?)|\bis\b|[!=]?=|\?|:)' 0:operator
add-highlighter shared/wren/code/ regex 'class\h+([A-Za-z][\w_]*)\h+(is\h+[A-Za-z][\w_]*)\h*(?=\{)' 1:type 2:attribute
add-highlighter shared/wren/code/ regex '\b(?i)-?\d+\b' 0:value
add-highlighter shared/wren/code/ regex '\b-?0x(?i)[\da-f]+\b' 0:value
add-highlighter shared/wren/code/ regex '\b(?i)-?\d+\.\d+\b' 0:value
add-highlighter shared/wren/code/ regex '\b(?i)-?\d+\.\d+e[+-]?\d+\b' 0:value
add-highlighter shared/wren/code/ regex '^\h*import\h*"(.*?)"' 1:module
add-highlighter shared/wren/code/ regex '\bFn\.new\h*(?=[\{\(])' 0:+b@value
add-highlighter shared/wren/code/ regex '\bFiber\.new\h*(?=[\{\(])' 0:+b@value
add-highlighter shared/wren/code/ regex '\bFiber\.current\b' 0:+b@value
add-highlighter shared/wren/code/ regex '\bSystem\.clock\b' 0:+b@value
add-highlighter shared/wren/code/ regex '\bFiber\.(yield|abort|suspend)\h*(?=[\{\(])' 0:+b@function
add-highlighter shared/wren/code/ regex '\bSystem\.((print|write)(All)?)\h*(?=[\{\(])' 0:+b@function
add-highlighter shared/wren/code/ regex '\bSystem\.gc\h*(?=\()' 0:+b@function
add-highlighter shared/wren/code/ regex '\bList\.filled\h*(?=\()' 0:+b@function
add-highlighter shared/wren/code/ regex '\b(List|Map)\.new\h*(?=\()' 0:+b@value
add-highlighter shared/wren/code/ regex '\bNum\.fromString\h*(?=\()' 0:+b@function
add-highlighter shared/wren/code/ regex \
'\bNum\.(infinity|nan|pi|tau|largest|smallest|(min|max)SafeInteger)\b' 0:+b@value
add-highlighter shared/wren/code/ regex '\bObject\.same\h*(?=\()' 0:+b@function
add-highlighter shared/wren/code/ regex '\bString\.from(Byte|CodePoint)\h*(?=\()' 0:+b@function
declare-option str-list wren_static_words \
'import' 'true' 'false' 'null' 'as' 'break' 'class' 'construct' 'continue' 'else' 'for' 'foreign' 'if' 'in' 'return' 'static' 'super' 'this' \
'var' 'while' 'Bool' 'Class' 'Fiber' 'Fn' 'List' 'Map' 'Null' 'Num' 'Object' 'Range' 'Sequence' 'String' 'System'
§
hook global BufCreate (.*/)?.*\.wren %{ set-option buffer filetype wren }
hook -group wren-highlight global WinSetOption filetype=wren %{
require-module wren
add-highlighter window/wren ref wren
hook -once -always window WinSetOption filetype=.* %{
remove-highlighter window/wren
}
}
hook global WinSetOption filetype=wren %{
require-module wren
set-option window static_words %opt{wren_static_words}
hook window ModeChange pop:insert:.* -group wren-trim-indent %{ try %{ execute-keys -draft xs^\h+$<ret>d } }
hook window InsertChar \n -group wren-indent wren-indent-on-new-line
hook window InsertChar \{ -group wren-indent wren-indent-on-opening-curly-brace
hook window InsertChar \} -group wren-indent wren-indent-on-closing-curly-brace
hook window InsertChar \n -group wren-comment-insert wren-insert-comment-on-new-line
hook window InsertChar \n -group wren-closing-delimiter-insert wren-insert-closing-delimiter-on-new-line
}
define-command -hidden wren-indent-on-new-line %~
evaluate-commands -draft -itersel %=
# preserve previous line indent
try %{ execute-keys -draft <semicolon>K<a-&> }
# cleanup trailing white spaces on the previous line
try %{ execute-keys -draft kx s \h+$ <ret>d }
try %<
try %{ # line comment
execute-keys -draft kx s ^\h*// <ret>
} catch %{ # block comment
execute-keys -draft <a-?> /\* <ret> <a-K>\*/<ret>
}
> catch %<
# indent after lines with an unclosed { or (
try %< execute-keys -draft [c[({],[)}] <ret> <a-k> \A[({][^\n]*\n[^\n]*\n?\z <ret> j<a-gt> >
# deindent closing brace(s) when after cursor
try %[ execute-keys -draft x <a-k> ^\h*[})] <ret> gh / [})] <ret> m <a-S> 1<a-&> ]
>
=
~
define-command -hidden wren-indent-on-opening-curly-brace %[
# align indent with opening paren when { is entered on a new line after the closing paren
try %[ execute-keys -draft -itersel h<a-F>)M <a-k> \A\(.*\)\h*\n\h*\{\z <ret> s \A|.\z <ret> 1<a-&> ]
]
define-command -hidden wren-indent-on-closing-curly-brace %[
# align to opening curly brace when alone on a line
try %[ execute-keys -itersel -draft <a-h><a-k>^\h+\}$<ret>hms\A|.\z<ret>1<a-&> ]
]
define-command -hidden wren-insert-comment-on-new-line %[
evaluate-commands -no-hooks -draft -itersel %[
# copy // comments prefix and following white spaces
try %{ execute-keys -draft <semicolon><c-s>kx s ^\h*\K/{2,}\h* <ret> y<c-o>P<esc> }
]
]
define-command -hidden wren-insert-closing-delimiter-on-new-line %[
evaluate-commands -no-hooks -draft -itersel %[
# Wisely add '}'.
evaluate-commands -save-regs x %[
# Save previous line indent in register x.
try %[ execute-keys -draft kxs^\h+<ret>"xy ] catch %[ reg x '' ]
try %[
# Validate previous line and that it is not closed yet.
execute-keys -draft kx <a-k>^<c-r>x.*\{\h*\(?\h*$<ret> j}iJx <a-K>^<c-r>x\)?\h*\}<ret>
# Insert closing '}'.
execute-keys -draft o<c-r>x}<esc>
# Delete trailing '}' on the line below the '{'.
execute-keys -draft xs\}$<ret>d
]
]
# Wisely add ')'.
evaluate-commands -save-regs x %[
# Save previous line indent in register x.
try %[ execute-keys -draft kxs^\h+<ret>"xy ] catch %[ reg x '' ]
try %[
# Validate previous line and that it is not closed yet.
execute-keys -draft kx <a-k>^<c-r>x.*\(\h*$<ret> J}iJx <a-K>^<c-r>x\)<ret>
# Insert closing ')'.
execute-keys -draft o<c-r>x)<esc>
# Delete trailing ')' on the line below the '('.
execute-keys -draft xs\)\h*\}?\h*$<ret>d
]
]
]
]
|