summaryrefslogtreecommitdiff
path: root/rc/filetype/wren.kak
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
            ]
        ]
    ]
]