Unnamed repository; edit this file 'description' to name the repository.
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
(identifier) @variable
(return "return" @keyword.control.return)
(global ["VAR" "CONST"] @keyword.storage.type
        "=" @operator)
(temp_def "temp" @keyword
      name: (identifier) @variable.member) ; not really, but temp vars are the closest thing to members that ink has
(include "INCLUDE" @keyword.control.import
         (path) @string.special.path)
(external "EXTERNAL" @keyword
          (identifier) @function)
(todo_comment "TODO" @keyword ":" @comment) @comment
(code "~" @keyword.directive)

(binary "+" @operator)
(binary "-" @operator)
(binary "*" @operator)
(binary "/" @operator)
(binary "?" @operator)
(binary "!?" @operator)
(binary "^" @operator)
(binary "==" @operator)
(binary "!=" @operator)
(binary "||" @operator)
(binary "&&" @operator)
(binary "<=" @operator)
(binary ">=" @operator)
(binary "<" @operator)
(binary ">" @operator)
(binary "%" @operator)
(binary "and" @keyword.operator)
(binary "or" @keyword.operator)
(binary "has" @keyword.operator)
(binary "hasnt" @keyword.operator)
(binary "mod" @keyword.operator)

(postfix "++" @operator)
(postfix "--" @operator)

(unary "!" @operator)
(unary "-" @operator)
(unary "not" @keyword.operator)

(assignment ["=" "+=" "-="]) @operator

(choice_only ["[" "]"] @punctuation.bracket)  ; Need to specifiy choice here, because the grammar does always tokenize these brackets (for all text), but we don't want to highlight them outside of choices.
(label ["(" ")"] @punctuation.bracket name: (_) @label)

["{" "}"] @punctuation.bracket ; Curlies are never just text, no need to qualify

["," "|" ":"] @punctuation.delimiter

(call (identifier) @function.builtin
      (#any-of? @function.builtin
       ; List Functions
       "LIST_VALUE"
       "LIST_COUNT"
       "LIST_MIN"
       "LIST_MAX"
       "LIST_RANDOM"
       "LIST_RANGE"
       "LIST_INVERT"
       ; Game Queries
       "CHOICE_COUNT"
       "TURNS"
       "TURNS_SINCE"
       "LIST_FOO"
       "SEED_RANDOM"))
(call (identifier) @function)
(call ["(" ")"] @punctuation.bracket)

(knot "==" @markup.heading.1 (identifier) @label)
(knot "function" @keyword.function
      (identifier) @function)

(stitch "=" @markup.heading.2 (identifier) @label)

(choice_mark) @markup.list.numbered
(gather_mark) @markup.list.unnumbered

(cond_arm "-" @keyword.control.conditional)
(alt_arm "-" @keyword.control.repeat)
(else) @constant.builtin

(list "LIST" @keyword.storage.type
      (identifier) @type.enum
      "=" @operator)

(list_value_def (identifier) @type.enum.variant)

(list_values (identifier) @type.enum.variant)
(list_values
      (qualified_name
            . (identifier) @type.enum
            (identifier) @type.enum.variant))

(glue) @keyword

["->" "->->" "<-"] @keyword.control

(divert (identifier) @label)
(divert (identifier) @constant.builtin
        (#any-of? @constant.builtin "END" "DONE"))

(divert (call (identifier) @label))
(divert (call (qualified_name (identifier) @label)))

(thread [(identifier) (call)] @label)

; Deal with parames *after* the general divert highlighting, so that divert parames still look like params
(params ["(" ")"] @punctuation.bracket)
(param
      "ref"? @keyword.storage.modifier
      value: [ (identifier) @variable.parameter
               (divert (identifier) @variable.parameter) ]?)

(multiline_alternatives ["shuffle" "stopping" "cycle" "once"] @keyword.control.repeat)
(alternatives ["&" "$" "~" "!"] @keyword.control.repeat)

(line_comment) @comment.line
(block_comment) @comment.block

(qualified_name "." @punctuation.delimiter)
(string) @string

(number) @constant.numeric
(boolean) @keyword.builtin.boolean

(tag "#" @punctuation.special) @tag
ighlight .nd { color: #FFDFB3 } /* Name.Decorator */ .highlight .nf { color: #FFD173 } /* Name.Function */ .highlight .nt { color: #5CCFE6 } /* Name.Tag */ .highlight .ow { color: #F29E74 } /* Operator.Word */ .highlight .w { color: #CCCAC2 } /* Text.Whitespace */ .highlight .mb { color: #DFBFFF } /* Literal.Number.Bin */ .highlight .mf { color: #DFBFFF } /* Literal.Number.Float */ .highlight .mh { color: #DFBFFF } /* Literal.Number.Hex */ .highlight .mi { color: #DFBFFF } /* Literal.Number.Integer */ .highlight .mo { color: #DFBFFF } /* Literal.Number.Oct */ .highlight .sa { color: #D5FF80 } /* Literal.String.Affix */ .highlight .sb { color: #F29E74 } /* Literal.String.Backtick */ .highlight .sc { color: #D5FF80 } /* Literal.String.Char */ .highlight .dl { color: #D5FF80 } /* Literal.String.Delimiter */ .highlight .sd { color: #95E6CB; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #D5FF80 } /* Literal.String.Double */ .highlight .se { color: #D5FF80 } /* Literal.String.Escape */ .highlight .sh { color: #D5FF80 } /* Literal.String.Heredoc */ .highlight .si { color: #D5FF80 } /* Literal.String.Interpol */ .highlight .sx { color: #D5FF80 } /* Literal.String.Other */ .highlight .sr { color: #95E6CB } /* Literal.String.Regex */ .highlight .s1 { color: #D5FF80 } /* Literal.String.Single */ .highlight .ss { color: #D5FF80 } /* Literal.String.Symbol */ .highlight .bp { color: #F28779 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #FFD173 } /* Name.Function.Magic */ .highlight .vi { color: #FFCC66 } /* Name.Variable.Instance */ .highlight .vm { color: #5CCFE6; font-style: italic } /* Name.Variable.Magic */ .highlight .il { color: #DFBFFF } /* Literal.Number.Integer.Long */

Usage

(Currently not fully documented, see the keymappings list for more.)

Surround

Functionality similar to vim-surround is built into helix. The keymappings have been inspired from vim-sandwich:

surround demo

ms acts on a selection, so select the text first and use ms<char>. mr and md work on the closest pairs found and selections are not required; use counts to act in outer pairs.

It can also act on multiple seletions (yay!). For example, to change every occurance of (use) to [use]:

Multiple characters are currently not supported, but planned.