vimniscient 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. vimniscient/__init__.py +3 -0
  2. vimniscient/__main__.py +3 -0
  3. vimniscient/answer.py +113 -0
  4. vimniscient/app.py +310 -0
  5. vimniscient/cards/foot.yaml +19 -0
  6. vimniscient/cards/lazyvim.yaml +80 -0
  7. vimniscient/cards/shell.yaml +22 -0
  8. vimniscient/cards/vim.yaml +95 -0
  9. vimniscient/cards/zathura.yaml +32 -0
  10. vimniscient/cards.py +200 -0
  11. vimniscient/cli.py +98 -0
  12. vimniscient/drills/omarchy.yaml +88 -0
  13. vimniscient/drills.py +198 -0
  14. vimniscient/endless.py +60 -0
  15. vimniscient/generate.py +102 -0
  16. vimniscient/habits.py +116 -0
  17. vimniscient/keys.py +14 -0
  18. vimniscient/lessons/sources.md +59 -0
  19. vimniscient/lessons/w1d1-words.yaml +223 -0
  20. vimniscient/lessons/w1d2-pairs.yaml +188 -0
  21. vimniscient/lessons/w1d3-sentences.yaml +247 -0
  22. vimniscient/lessons/w1d4-find.yaml +184 -0
  23. vimniscient/lessons/w1d5-lines.yaml +249 -0
  24. vimniscient/lessons/w1d6-counts.yaml +351 -0
  25. vimniscient/lessons/w1d7-review.yaml +222 -0
  26. vimniscient/lessons/w2d1-dot.yaml +195 -0
  27. vimniscient/lessons/w2d2-search.yaml +194 -0
  28. vimniscient/lessons/w2d3-cgn.yaml +196 -0
  29. vimniscient/lessons/w2d4-case-numbers.yaml +201 -0
  30. vimniscient/lessons/w2d5-insert.yaml +229 -0
  31. vimniscient/lessons/w2d6-visual.yaml +206 -0
  32. vimniscient/lessons/w2d7-review.yaml +197 -0
  33. vimniscient/lessons/w3d1-macros.yaml +240 -0
  34. vimniscient/lessons/w3d2-macros-more.yaml +170 -0
  35. vimniscient/lessons/w3d3-registers.yaml +230 -0
  36. vimniscient/lessons/w3d4-marks.yaml +188 -0
  37. vimniscient/lessons/w3d5-visual-block.yaml +201 -0
  38. vimniscient/lessons/w3d6-substitute.yaml +290 -0
  39. vimniscient/lessons/w3d7-review.yaml +204 -0
  40. vimniscient/lessons/w4d1-ranges.yaml +214 -0
  41. vimniscient/lessons/w4d2-sort-filter.yaml +243 -0
  42. vimniscient/lessons/w4d3-regex.yaml +167 -0
  43. vimniscient/lessons/w4d4-norm.yaml +158 -0
  44. vimniscient/lessons/w4d5-motions.yaml +149 -0
  45. vimniscient/lessons/w4d6-indent.yaml +143 -0
  46. vimniscient/lessons/w4d7-review.yaml +175 -0
  47. vimniscient/lessons/w5d1-arguments.yaml +133 -0
  48. vimniscient/lessons/w5d2-any-quote-bracket.yaml +136 -0
  49. vimniscient/lessons/w5d3-functions.yaml +193 -0
  50. vimniscient/lessons/w5d4-small-objects.yaml +185 -0
  51. vimniscient/lessons/w5d5-comments.yaml +161 -0
  52. vimniscient/lessons/w5d6-review.yaml +120 -0
  53. vimniscient/lessons/w6d1-code.yaml +157 -0
  54. vimniscient/lessons/w6d2-notes.yaml +163 -0
  55. vimniscient/lessons/w6d3-data.yaml +145 -0
  56. vimniscient/lessons.py +184 -0
  57. vimniscient/mnemonics.py +141 -0
  58. vimniscient/mnemonics.yaml +124 -0
  59. vimniscient/nvim/keymaps.lua +25 -0
  60. vimniscient/nvim/runner.lua +711 -0
  61. vimniscient/progress.py +496 -0
  62. vimniscient/reminders.py +220 -0
  63. vimniscient/session.py +152 -0
  64. vimniscient/settings.py +33 -0
  65. vimniscient/srs.py +56 -0
  66. vimniscient/today.py +189 -0
  67. vimniscient/ui/__init__.py +1 -0
  68. vimniscient/ui/builtin_lessons.py +99 -0
  69. vimniscient/ui/cards.py +160 -0
  70. vimniscient/ui/common.py +129 -0
  71. vimniscient/ui/drills.py +163 -0
  72. vimniscient/ui/lesson.py +193 -0
  73. vimniscient/ui/main.py +217 -0
  74. vimniscient/ui/stats.py +145 -0
  75. vimniscient/vimgolf.py +97 -0
  76. vimniscient-0.2.0.dist-info/METADATA +322 -0
  77. vimniscient-0.2.0.dist-info/RECORD +80 -0
  78. vimniscient-0.2.0.dist-info/WHEEL +4 -0
  79. vimniscient-0.2.0.dist-info/entry_points.txt +2 -0
  80. vimniscient-0.2.0.dist-info/licenses/LICENSE +661 -0
@@ -0,0 +1,170 @@
1
+ week: 3
2
+ day: 2
3
+ title: Smarter macros
4
+ intro: |
5
+ A macro can search (`/TODO<Enter>` inside it finds the next one), use
6
+ `Ctrl-a`, and run on a range with `:2,$norm @a` (*norm* for normal mode:
7
+ it types the keys on each line). `@@` plays again at the same place: the
8
+ last macro you played.
9
+ keys: ['/ in a macro', '@@', ':norm @a', 'yyp<C-a>']
10
+ tasks:
11
+ - goal: 'Uppercase the word after every TODO.'
12
+ start: |-
13
+ ▮1 TODO review this
14
+ 2 nothing here
15
+ 3 TODO test that
16
+ 4 TODO space it
17
+ target: |-
18
+ 1 TODO REVIEW this
19
+ 2 nothing here
20
+ 3 TODO TEST that
21
+ 4 TODO SPACE it
22
+ solution: 'qa/TODO<CR>wgUiwq2@a'
23
+ hint: 'Let the macro find its own place: /TODO<Enter> w gUiw.'
24
+ variants:
25
+ - goal: 'Uppercase the word after every TODO.'
26
+ start: |-
27
+ ▮a TODO check this
28
+ b fine
29
+ c TODO gloss that
30
+ d TODO tag it
31
+ target: |-
32
+ a TODO CHECK this
33
+ b fine
34
+ c TODO GLOSS that
35
+ d TODO TAG it
36
+ - start: |-
37
+ ▮1 TODO space this
38
+ 2 done
39
+ 3 TODO test that
40
+ 4 TODO sleep now
41
+ target: |-
42
+ 1 TODO SPACE this
43
+ 2 done
44
+ 3 TODO TEST that
45
+ 4 TODO SLEEP now
46
+ - start: |-
47
+ ▮x TODO macro it
48
+ y skip
49
+ z TODO record this
50
+ w TODO play that
51
+ target: |-
52
+ x TODO MACRO it
53
+ y skip
54
+ z TODO RECORD this
55
+ w TODO PLAY that
56
+ - goal: 'Turn every comma into " | ", using @a once and then @@.'
57
+ start: |-
58
+ ▮q,record
59
+ @,play
60
+ @@,again
61
+ target: |-
62
+ q | record
63
+ @ | play
64
+ @@ | again
65
+ solution: 'qa0f,xi | <Esc>jq@a@@'
66
+ hint: '0 f, x deletes the comma, i | <Esc> inserts the separator, j moves on. Then @a, then @@.'
67
+ variants:
68
+ - goal: 'Turn every comma into " | ", using @a once and then @@.'
69
+ start: |-
70
+ ▮onset,coda
71
+ head,dependent
72
+ topic,comment
73
+ target: |-
74
+ onset | coda
75
+ head | dependent
76
+ topic | comment
77
+ - start: |-
78
+ ▮key,hook
79
+ f,find
80
+ t,till
81
+ target: |-
82
+ key | hook
83
+ f | find
84
+ t | till
85
+ - start: |-
86
+ ▮Miller,seven
87
+ Cowan,four
88
+ Ebbinghaus,1885
89
+ target: |-
90
+ Miller | seven
91
+ Cowan | four
92
+ Ebbinghaus | 1885
93
+ - goal: 'Put every line in parentheses: record on the first line, then use :norm for the rest.'
94
+ start: |-
95
+ ▮spacing
96
+ testing
97
+ sleep
98
+ mnemonics
99
+ target: |-
100
+ (spacing)
101
+ (testing)
102
+ (sleep)
103
+ (mnemonics)
104
+ solution: 'qaI(<Esc>A)<Esc>q:2,$norm @a<CR>'
105
+ hint: 'No j in this macro. :2,$norm @a runs it once on every line from 2 to the end.'
106
+ variants:
107
+ - goal: 'Put every line in parentheses: record on the first line, then use :norm for the rest.'
108
+ start: |-
109
+ ▮DP
110
+ TP
111
+ CP
112
+ VP
113
+ target: |-
114
+ (DP)
115
+ (TP)
116
+ (CP)
117
+ (VP)
118
+ - start: |-
119
+ ▮encode
120
+ store
121
+ retrieve
122
+ forget
123
+ target: |-
124
+ (encode)
125
+ (store)
126
+ (retrieve)
127
+ (forget)
128
+ - start: |-
129
+ ▮q
130
+ @a
131
+ @@
132
+ norm
133
+ target: |-
134
+ (q)
135
+ (@a)
136
+ (@@)
137
+ (norm)
138
+ - goal: 'Make a numbered list of four items.'
139
+ start: |-
140
+ ▮1. Test yourself.
141
+ target: |-
142
+ 1. Test yourself.
143
+ 2. Test yourself.
144
+ 3. Test yourself.
145
+ 4. Test yourself.
146
+ solution: 'qayyp<C-a>q2@a'
147
+ hint: 'yyp copies the line, Ctrl-a bumps its number. Record that, then 2@a.'
148
+ variants:
149
+ - goal: 'Make a numbered list of four items.'
150
+ start: |-
151
+ ▮1. Review after a delay.
152
+ target: |-
153
+ 1. Review after a delay.
154
+ 2. Review after a delay.
155
+ 3. Review after a delay.
156
+ 4. Review after a delay.
157
+ - start: |-
158
+ ▮1. Space your reviews.
159
+ target: |-
160
+ 1. Space your reviews.
161
+ 2. Space your reviews.
162
+ 3. Space your reviews.
163
+ 4. Space your reviews.
164
+ - start: |-
165
+ ▮1. Record, then replay.
166
+ target: |-
167
+ 1. Record, then replay.
168
+ 2. Record, then replay.
169
+ 3. Record, then replay.
170
+ 4. Record, then replay.
@@ -0,0 +1,230 @@
1
+ week: 3
2
+ day: 3
3
+ title: Registers
4
+ intro: |
5
+ Every yank and delete goes into the unnamed register, so a delete can
6
+ replace what you meant to paste. The quote mark names a register: `"a`
7
+ means *in register a* (`"ayy`, `"ap`). Capital `"A` appends to it. `"0`
8
+ holds the last yank, untouched by deletes. `"_` is the floor: text falls
9
+ through it and is gone, so `"_d` deletes without saving anything. While
10
+ typing, `Ctrl-r a` reads register a in, and `Ctrl-r =` is a calculator.
11
+ keys: ['"ayy', '"ap', '"0p', '"_d', '"Ayy', '<C-r>0', '<C-r>=']
12
+ tasks:
13
+ - goal: 'Copy the first line to the end and delete junk, without losing it.'
14
+ start: |-
15
+ ▮named registers
16
+ junk
17
+ survive deletes:
18
+ target: |-
19
+ named registers
20
+ survive deletes:
21
+ named registers
22
+ solution: '"ayyjdd"ap'
23
+ hint: 'yy then dd would paste junk. Yank into a named register: "ayy, then later "ap.'
24
+ variants:
25
+ - goal: 'Copy "competence" to the end and delete junk, without losing "competence".'
26
+ start: |-
27
+ ▮competence
28
+ junk
29
+ performance
30
+ target: |-
31
+ competence
32
+ performance
33
+ competence
34
+ - goal: 'Copy the first line to the end and delete junk, without losing it.'
35
+ start: |-
36
+ ▮register a
37
+ junk
38
+ keeps what you yank:
39
+ target: |-
40
+ register a
41
+ keeps what you yank:
42
+ register a
43
+ - goal: 'Copy "spacing" to the end and delete junk, without losing "spacing".'
44
+ start: |-
45
+ ▮spacing
46
+ junk
47
+ beats cramming, so:
48
+ target: |-
49
+ spacing
50
+ beats cramming, so:
51
+ spacing
52
+ - goal: 'Delete the typo line, then paste the line you yanked at the end.'
53
+ start: |-
54
+ ▮0 holds the last yank
55
+ typo
56
+ even after a delete:
57
+ target: |-
58
+ 0 holds the last yank
59
+ even after a delete:
60
+ 0 holds the last yank
61
+ solution: 'yyjdd"0p'
62
+ hint: 'Register 0 always holds the last yank, even after a delete.'
63
+ variants:
64
+ - goal: 'Delete the typo line, then paste the line you yanked at the end.'
65
+ start: |-
66
+ ▮sign
67
+ typo
68
+ referent:
69
+ target: |-
70
+ sign
71
+ referent:
72
+ sign
73
+ - start: |-
74
+ ▮the yank register
75
+ typo
76
+ is zero:
77
+ target: |-
78
+ the yank register
79
+ is zero:
80
+ the yank register
81
+ - start: |-
82
+ ▮testing
83
+ typo
84
+ beats rereading:
85
+ target: |-
86
+ testing
87
+ beats rereading:
88
+ testing
89
+ - goal: 'Delete the misspelling "black hoel" and replace "blak hole" with "black hole". Keep black hole in the unnamed register.'
90
+ start: |-
91
+ ▮black hole
92
+ black hoel
93
+ blak hole
94
+ target: |-
95
+ black hole
96
+ black hole
97
+ solution: 'yyj"_ddVp'
98
+ hint: '"_dd drops the line through the floor, so the unnamed register still holds black hole. Vp pastes over the line.'
99
+ variants:
100
+ - goal: 'Delete the misspelling "sintax" and replace "syntaks" with "syntax". Keep syntax in the unnamed register.'
101
+ start: |-
102
+ ▮syntax
103
+ sintax
104
+ syntaks
105
+ target: |-
106
+ syntax
107
+ syntax
108
+ hint: '"_dd deletes into the black hole, so the unnamed register still holds syntax. Vp pastes over the line.'
109
+ - goal: 'Delete the misspelling "regsiter" and replace "registre" with "register". Keep register in the unnamed register.'
110
+ start: |-
111
+ ▮register
112
+ regsiter
113
+ registre
114
+ target: |-
115
+ register
116
+ register
117
+ - goal: 'Delete the misspelling "retreival" and replace "retrival" with "retrieval". Keep retrieval in the unnamed register.'
118
+ start: |-
119
+ ▮retrieval
120
+ retreival
121
+ retrival
122
+ target: |-
123
+ retrieval
124
+ retrieval
125
+ - goal: 'Add the last word of line 1 to the end of line 2.'
126
+ start: |-
127
+ ▮reads in: register
128
+ Ctrl-r inserts a
129
+ target: |-
130
+ reads in: register
131
+ Ctrl-r inserts a register
132
+ solution: '$yiwjA <C-r>0<Esc>'
133
+ hint: 'Yank the word, then in insert mode Ctrl-r 0 reads it in for you.'
134
+ variants:
135
+ - goal: 'Add the name from line 1 to the end of line 2.'
136
+ start: |-
137
+ ▮name: Boas
138
+ greeting: hi
139
+ target: |-
140
+ name: Boas
141
+ greeting: hi Boas
142
+ - goal: 'Add the last word of line 1 to the end of line 2.'
143
+ start: |-
144
+ ▮last yank: zero
145
+ the yank register is
146
+ target: |-
147
+ last yank: zero
148
+ the yank register is zero
149
+ - goal: 'Add the last word of line 1 to the end of line 2.'
150
+ start: |-
151
+ ▮number: four
152
+ Cowan said about
153
+ target: |-
154
+ number: four
155
+ Cowan said about four
156
+ - goal: 'Fill in the product while typing.'
157
+ start: |-
158
+ ▮Ctrl-r = is a calculator (6 * 7):
159
+ target: |-
160
+ Ctrl-r = is a calculator (6 * 7): 42
161
+ solution: 'A <C-r>=6*7<CR><Esc>'
162
+ hint: 'In insert mode, Ctrl-r = opens a calculator: type 6*7 and Enter.'
163
+ variants:
164
+ - goal: 'Fill in the difference while typing.'
165
+ start: |-
166
+ ▮Ebbinghaus to Roediger, in years (2006 - 1885):
167
+ target: |-
168
+ Ebbinghaus to Roediger, in years (2006 - 1885): 121
169
+ solution: 'A <C-r>=2006-1885<CR><Esc>'
170
+ hint: 'In insert mode, Ctrl-r = opens a calculator: type 2006-1885 and Enter.'
171
+ - goal: 'Fill in the difference while typing.'
172
+ start: |-
173
+ ▮Miller to Cowan, in years (2001 - 1956):
174
+ target: |-
175
+ Miller to Cowan, in years (2001 - 1956): 45
176
+ solution: 'A <C-r>=2001-1956<CR><Esc>'
177
+ - goal: 'Fill in the difference while typing.'
178
+ start: |-
179
+ ▮Ebbinghaus's age when he published (1885 - 1850):
180
+ target: |-
181
+ Ebbinghaus's age when he published (1885 - 1850): 35
182
+ solution: 'A <C-r>=1885-1850<CR><Esc>'
183
+ - goal: 'Collect the first and last lines in one register and paste both at the end.'
184
+ start: |-
185
+ ▮capital A
186
+ skip
187
+ appends
188
+ target: |-
189
+ capital A
190
+ skip
191
+ appends
192
+ capital A
193
+ appends
194
+ solution: '"ayyjj"Ayy"ap'
195
+ hint: 'A capital register name appends: "ayy, then "Ayy on appends, then "ap.'
196
+ variants:
197
+ - goal: 'Collect onset and coda in one register and paste both at the end.'
198
+ start: |-
199
+ ▮onset
200
+ skip
201
+ coda
202
+ target: |-
203
+ onset
204
+ skip
205
+ coda
206
+ onset
207
+ coda
208
+ hint: 'A capital register name appends: "ayy, then "Ayy on coda, then "ap.'
209
+ - goal: 'Collect encode and retrieve in one register and paste both at the end.'
210
+ start: |-
211
+ ▮encode
212
+ skip
213
+ retrieve
214
+ target: |-
215
+ encode
216
+ skip
217
+ retrieve
218
+ encode
219
+ retrieve
220
+ - goal: 'Collect the first and last lines in one register and paste both at the end.'
221
+ start: |-
222
+ ▮yank into a
223
+ skip
224
+ then append to A
225
+ target: |-
226
+ yank into a
227
+ skip
228
+ then append to A
229
+ yank into a
230
+ then append to A
@@ -0,0 +1,188 @@
1
+ week: 3
2
+ day: 4
3
+ title: Marks and jumps
4
+ intro: |
5
+ `m` marks a spot: `ma` sets mark a. The plain quote `'a` goes to its line,
6
+ the backtick `` `a `` to its exact letter, and
7
+ both work as motions: `d'a` deletes the lines from here to the mark,
8
+ `` c`a `` changes from the mark to the cursor. ` `` ` (two backticks)
9
+ jumps back to where you were before the last jump (`G`, `/`, `%` …).
10
+ keys: [ma, "'a", '`a', "d'a", "y'a", '``']
11
+ tasks:
12
+ - goal: 'Delete all the lines between BEGIN and END.'
13
+ start: |-
14
+ ▮BEGIN
15
+ rereading
16
+ highlighting
17
+ summarizing
18
+ copying notes
19
+ listening again
20
+ END
21
+ target: |-
22
+ BEGIN
23
+ END
24
+ solution: 'jma/END<CR>kd''a'
25
+ hint: 'Mark the first line to go (ma), find the last one, then d''a. (d/END<Enter> from the first line is a nice shortcut too.)'
26
+ variants:
27
+ - goal: 'Delete all the lines between BEGIN and END.'
28
+ start: |-
29
+ ▮BEGIN
30
+ nom: I
31
+ acc: me
32
+ gen: my
33
+ dat: to me
34
+ abl: from me
35
+ END
36
+ target: |-
37
+ BEGIN
38
+ END
39
+ - start: |-
40
+ ▮BEGIN
41
+ cram
42
+ reread
43
+ highlight
44
+ summarize
45
+ skim
46
+ END
47
+ target: |-
48
+ BEGIN
49
+ END
50
+ - start: |-
51
+ ▮BEGIN
52
+ mark
53
+ jump
54
+ line
55
+ letter
56
+ back
57
+ END
58
+ target: |-
59
+ BEGIN
60
+ END
61
+ - goal: 'Copy the two mark lines under "Cheat sheet".'
62
+ start: |-
63
+ ▮== Marks ==
64
+ m marks a spot
65
+ ' jumps to its line
66
+ == Cheat sheet ==
67
+ target: |-
68
+ == Marks ==
69
+ m marks a spot
70
+ ' jumps to its line
71
+ == Cheat sheet ==
72
+ m marks a spot
73
+ ' jumps to its line
74
+ solution: 'jmajy''aGp'
75
+ hint: 'ma on the first line, j to the second, y''a yanks back to the mark, G p pastes at the end.'
76
+ variants:
77
+ - goal: 'Copy rendezvous and déjà vu under "Used in English".'
78
+ start: |-
79
+ ▮== French ==
80
+ rendezvous
81
+ déjà vu
82
+ == Used in English ==
83
+ target: |-
84
+ == French ==
85
+ rendezvous
86
+ déjà vu
87
+ == Used in English ==
88
+ rendezvous
89
+ déjà vu
90
+ hint: 'ma on rendezvous, j to déjà vu, y''a yanks back to the mark, G p pastes at the end.'
91
+ - goal: 'Copy day 1 and day 7 under "Plan".'
92
+ start: |-
93
+ ▮== Spacing ==
94
+ day 1
95
+ day 7
96
+ == Plan ==
97
+ target: |-
98
+ == Spacing ==
99
+ day 1
100
+ day 7
101
+ == Plan ==
102
+ day 1
103
+ day 7
104
+ - goal: 'Copy the two jump lines under "Notes".'
105
+ start: |-
106
+ ▮== Jumps ==
107
+ 'a goes to the line
108
+ `a goes to the letter
109
+ == Notes ==
110
+ target: |-
111
+ == Jumps ==
112
+ 'a goes to the line
113
+ `a goes to the letter
114
+ == Notes ==
115
+ 'a goes to the line
116
+ `a goes to the letter
117
+ - goal: 'Change "rough, line-wise " to "humble ", using a mark.'
118
+ start: |-
119
+ The ▮rough, line-wise backtick lands on the exact letter
120
+ target: |-
121
+ The humble backtick lands on the exact letter
122
+ solution: 'mafbc`ahumble <Esc>'
123
+ hint: 'ma, go to the b of backtick, then c`a changes from the mark up to the cursor.'
124
+ variants:
125
+ - goal: 'Change "most frequent " to "commonest ", using a mark.'
126
+ start: |-
127
+ The ▮most frequent English word is the
128
+ target: |-
129
+ The commonest English word is the
130
+ solution: 'mafEc`acommonest <Esc>'
131
+ hint: 'ma, go to the E of English, then c`a changes from the mark up to the cursor.'
132
+ - goal: 'Change "quick, letter-exact " to "precise ", using a mark.'
133
+ start: |-
134
+ A ▮quick, letter-exact jump uses the backtick
135
+ target: |-
136
+ A precise jump uses the backtick
137
+ solution: 'mafjc`aprecise <Esc>'
138
+ - goal: 'Change "rarely, if ever, " to "never ", using a mark.'
139
+ start: |-
140
+ Ebbinghaus ▮rarely, if ever, used real words
141
+ target: |-
142
+ Ebbinghaus never used real words
143
+ solution: 'mafuc`anever <Esc>'
144
+ - goal: 'Fix the typo on the last line, then jump back and fix the first.'
145
+ start: |-
146
+ ▮teh start
147
+ `` jumps between
148
+ the last two spots
149
+ teh end
150
+ target: |-
151
+ the start
152
+ `` jumps between
153
+ the last two spots
154
+ the end
155
+ solution: 'Gcwthe<Esc>``.'
156
+ hint: 'G is a jump, so `` takes you back. Then . repeats the change.'
157
+ variants:
158
+ - goal: 'Fix the typo on the last line, then jump back and fix the first.'
159
+ start: |-
160
+ ▮teh noun
161
+ middle
162
+ middle
163
+ teh verb
164
+ target: |-
165
+ the noun
166
+ middle
167
+ middle
168
+ the verb
169
+ - start: |-
170
+ ▮teh mark
171
+ jump
172
+ back
173
+ teh spot
174
+ target: |-
175
+ the mark
176
+ jump
177
+ back
178
+ the spot
179
+ - start: |-
180
+ ▮teh test
181
+ wait
182
+ wait
183
+ teh retest
184
+ target: |-
185
+ the test
186
+ wait
187
+ wait
188
+ the retest