about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--edit.mu45
1 files changed, 44 insertions, 1 deletions
diff --git a/edit.mu b/edit.mu
index 6472c04e..e6ef67f6 100644
--- a/edit.mu
+++ b/edit.mu
@@ -173,7 +173,9 @@ recipe render [
     break-unless curr:address:duplex-list
     off-screen?:boolean <- greater-or-equal row:number, screen-height:number
     break-if off-screen?:boolean
-    # update before-cursor at the start of each iteration, and row/column at the end
+    # update editor-data.before-cursor
+    # Doing so at the start of each iteration ensures it stays one step behind
+    # the current character.
     {
       at-cursor-row?:boolean <- equal row:number, cursor-row:number
       break-unless at-cursor-row?:boolean
@@ -317,6 +319,30 @@ recipe event-loop [
     # otherwise it's a special key to control the editor
     k:address:number <- maybe-convert e:event, keycode:variant
     assert k:address:number, [event was of unknown type; neither keyboard nor mouse]
+    before-cursor:address:address:duplex-list <- get-address editor:address:editor-data/deref, before-cursor:offset
+    cursor-row:address:number <- get-address editor:address:editor-data/deref, cursor-row:offset
+    cursor-column:address:number <- get-address editor:address:editor-data/deref, cursor-column:offset
+    # arrows; update cursor-row and cursor-column, leave before-cursor to 'render'
+    {
+      next-character?:boolean <- equal k:address:number/deref, 65514:literal/right-arrow
+      break-unless next-character?:boolean
+      next:address:duplex-list <- next-duplex before-cursor:address:address:duplex-list/deref
+      break-unless next:address:duplex-list
+      before-cursor:address:address:duplex-list/deref <- copy next:address:duplex-list
+      nextc:character <- get before-cursor:address:address:duplex-list/deref/deref, value:offset
+      # if it's a newline
+      {
+        at-newline?:boolean <- equal nextc:character, 10:literal/newline
+        break-unless at-newline?:boolean
+        cursor-row:address:number/deref <- add cursor-row:address:number/deref, 1:literal
+        cursor-column:address:number/deref <- copy 0:literal
+        break +render:label
+      }
+      # otherwise
+      cursor-column:address:number/deref <- add cursor-column:address:number/deref, 1:literal
+    }
+    +render
+    render editor:address:editor-data
     loop
   }
 ]
@@ -452,6 +478,23 @@ scenario editor-moves-cursor-down-after-inserting-newline [
   ]
 ]
 
+scenario editor-moves-cursor-right-with-key [
+  assume-screen 10:literal/width, 5:literal/height
+  assume-console [
+    press 65514  # right arrow
+    type [0]
+  ]
+  run [
+    1:address:array:character <- new [abc]
+    2:address:editor-data <- new-editor 1:address:array:character, screen:address, 0:literal/top, 0:literal/left, 5:literal/right
+    event-loop screen:address, console:address, 2:address:editor-data
+  ]
+  screen-should-contain [
+    .a0bc      .
+    .          .
+  ]
+]
+
 ## helpers for drawing editor borders
 
 recipe draw-box [
roblem' href='/akkartik/mu/commit/012transform.cc?h=main&id=5a4810855d34ce74b787d70383a712eef9e053f4'>5a481085 ^
215365d4 ^


37e4573b ^

dd2e01e4 ^
f1e09b14 ^
b24eb476 ^
dd2e01e4 ^
363be37f ^
37e4573b ^


91abd257 ^
363be37f ^
37e4573b ^


322ce34d ^
3ba63579 ^
7cca03bd ^
3ba63579 ^

7858a06a ^











3ba63579 ^
dd2e01e4 ^
363be37f ^
3ba63579 ^

b24eb476 ^
05d17773 ^
b24eb476 ^
05d17773 ^
3ba63579 ^
b24eb476 ^
05d17773 ^
3ba63579 ^





9cc16d04 ^
7f73795c ^
0f125d5f ^

37e4573b ^
a70ce311 ^





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