about summary refs log blame commit diff stats
path: root/html/edit/003-shortcuts.mu.html
blob: d45dfea6588d9ea240970eb4be3ccd933fd7eca5 (plain) (tree)
1
2
3
4
5
6
7
8
9
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316




                                                                                          

                                                
                                   
                                                                                                               
                                           

                       


                                                                                                 
                                       
                                      

                               
                            
                              
                                   

                             
                             
                            
                                                        
                              

        



                               






















                                                                                 

         
       
                             
                         








                                                                                                                                                


                                                                                                                                                                                                                            
                                                                                                                                               




                                                                                     
                                                                                                                                                                                                                                   












                                                                                                                                                                     
                                                                                                                                                                                                                                                               
                                                                                                                                               




                                                                                     
                                                                                                                                                                                                                                   
















                                                                                                                                                                                    

                                                                                                                                                                                                                                                                             










                                                                                                                                                                                                                                                               
                                                                                                                                               





                                                                                                                                                       
                                                                                                                                                                                                                                   




















                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                                                                                                     







                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              














                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                        







                                                                                                                                                                                                                     
                                                                                                                                                                                                                









                                                                                                                                                                                      
                                                                                                                                                                                                                      





                                                                                                                                                                            
                                                                                                                                                                                      
































































































                                                                                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                    





















                                                                                                                                                                                                                              
                                                                                                                                                






                                                                                                                                                        
                                                                                                                                                                                                                                    















                                                                                                                                                                                                                                                                        
                                                                                                                                                













                                                                                                                                                                
                                                                                                                                                                                                                                    
















                                                                                                                                                                                                                                                                
                                                                                                                                                




                                                                                         
                                                                                                                                                                                                                                    












                                                                                                                                                                                                                              
                                                                                                                                                                                                                                    














                                                                                                                                                                                                                 
                                                                                                                                                                                                                                                                                                                              




                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       













                                                                                                                                                                                                                                                                                
                                                                                                                                                                                                                
                                                                                                                  
                                                                                                                                                                                                                                        

                                                                                                                                                           
                                                                                                                                                                                                                

                                                                                                                                                                          
























































































































                                                                                                                                                                                                                                                                                                            
                                                                                              
                                                                                              































                                                                                                                                                                                                                                    
                                                                                              
                                                                                              



















































































































































































































































































































































































































































































                                                                                                                                                                                                                                                                                                 
                                                                                                                                                                                                                                        



                                                                                                                                                                                
                                                                                                                                                                                                                                        























































































































































































































































                                                                                                                                                                                                                                                                                      
                                                                                            
























































































                                                                                                                                                                                                                                                                                                  
                                                                              




                                                                                                                                                                                                
                                                                                                              

















































                                                                                                                                                                                                                                                                                                                                  










































                                                                                                                                                                                                                                     
                                               





                                                                                                                                                                                                                                     
                                               








































































































































































































                                                                                                                                                                                                                                                                             
                                               

























                                                                                                                                                                                                                                     
                                               


















































                                                                                                                                                                                                                                     
                                               





































































































































































                                                                                                                                                                                                                                                                                                  
                                               













































































































































































































































































































































                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
                                                                                                                        














































































































                                                                                                                                                                                                                                     
                                               

























































                                                                                                                                                                                                                                     
                                               





























































                                                                                                                                                                                                                                     
                                               






























































































































































































































































































                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
                                               































                                                                                                                                                                                                                                                                                                                                                  
                                                                              













































                                                                                                                                                                                                                                     
                                               

























                                                                                                                                                                                                                                     
                                               





                                                                                                                                     
                                               





                                                                                                                                                                                                                                     
                                               


























                                                                                                                                                                                                                                     
                                               


































                                                                                                                                                                                                                                     
                                               

























                                                                                                                                                                                                                                     
                                               






























                                                                                                                                                                                                                                     
                                               































                                                                                                                                                                                                                                     
                                               



























































                                                                                                                                                                                                                                     
                                               


































                                                                                                                                                                                                                                     
                                               












































                                                                                                                                                                                                                                                                                                                                                         
                                                                              


































                                                                                                                                                                                                                                                                                         
                                               











                                                                                                                                                                                                                                     
                                               





                                                                                                                                                                                                                                     
                                               

























                                                                                                                                                                                                                                     
                                               





                                                                                                                                  
                                               













                                                                                                                                                                                                                                     
                                               













                                                                                                                                                                                                                                     
                                               



































                                                                                                                                                                                                                                     
                                               











                                                                                                                                                                                                                                     
                                               





                                                                                                                                                                                                                                     
                                               




























































































                                                                                                                                                                                                                                     
                                               




























                                                                                                                                                                                                                               
                                               








                                                                                                                                                                                                                                     
                                               





                                                                                                                        
                                               





                                                                                                                                                                                                                                     
                                               
























                                                                                                                                                                                                                               
                                               





                                                                                                                                                                                                                                     
                                               





































































































                                                                                                                                                                                                                                                                
                                               





                                                                                                                                                                                                                                     
                                               

























                                                                                                                                                                                                                              
                                               





                                                                                                                                                                                                                                     
                                               
























                                                                                                                                                                                                                              
                                               





                                                                                                                                                                                                                                     
                                               
























                                                                                                                                                                                                                               
                                               





                                                                                                                                                                                                                                     
                                               





                                                                                                                                                                          
                                               





                                                                                                                                                                                                                                     
                                               





















































































                                                                                                                                                                                                                                                                                                                               
                                               





                                                                                                                        
                                               





                                                                                                                                                                                                                                     
                                               





                                                                                                                        
                                               





                                                                                                                                                                                                                                     
                                               




















































                                                                                                                                                                                                                                     
                                               

































                                                                                                                                                                                                                                     
                                               





                                                                                                                                                                                                                                     
                                               





                                                                                                                          
                                               





                                                                                                                                                                                                                                     
                                               




















































                                                                                                                                                                                                                                     
                                               


























































                                                                                                                                                                                                                                     
                                               



































































































































































































































































































                                                                                                                                                                                                                                                                                                                                                                                                                                            
                                               





































                                                                                                                                                                                                                                                                  


       
                                     
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - edit/003-shortcuts.mu</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="none">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #aaaaaa; background-color: #080808; }
body { font-size: 12pt; font-family: monospace; color: #aaaaaa; background-color: #080808; }
a { color:#eeeeee; text-decoration: none; }
a:hover { text-decoration: underline; }
* { font-size: 12pt; font-size: 1em; }
.Conceal { color: #4e4e4e; }
.muScenario { color: #00af00; }
.Special { color: #c00000; }
.Delimiter { color: #800080; }
.SalientComment { color: #00ffff; }
.Constant { color: #00a0a0; }
.LineNr { color: #444444; }
.muRecipe { color: #ff8700; }
.Comment { color: #9090ff; }
.Comment a { color:#0000ee; text-decoration:underline; }
.muControl { color: #c0a020; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">   1 </span><span class="SalientComment">## special shortcuts for manipulating the editor</span>
<span id="L2" class="LineNr">   2 </span><span class="Comment"># Some keys on the keyboard generate unicode characters, others generate</span>
<span id="L3" class="LineNr">   3 </span><span class="Comment"># terminfo key codes. We need to modify different places in the two cases.</span>
<span id="L4" class="LineNr">   4 </span>
<span id="L5" class="LineNr">   5 </span><span class="Comment"># tab - insert two spaces</span>
<span id="L6" class="LineNr">   6 </span>
<span id="L7" class="LineNr">   7 </span><span class="muScenario">scenario</span> editor-inserts-two-spaces-on-tab [
<span id="L8" class="LineNr">   8 </span>  <span class="Constant">local-scope</span>
<span id="L9" class="LineNr">   9 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L10" class="LineNr">  10 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
<span id="L11" class="LineNr">  11 </span><span class="Constant">cd]</span>
<span id="L12" class="LineNr">  12 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L13" class="LineNr">  13 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L14" class="LineNr">  14 </span>  $clear-trace
<span id="L15" class="LineNr">  15 </span>  assume-console [
<span id="L16" class="LineNr">  16 </span>  <span class="Conceal">¦</span> press tab
<span id="L17" class="LineNr">  17 </span>  ]
<span id="L18" class="LineNr">  18 </span>  run [
<span id="L19" class="LineNr">  19 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L20" class="LineNr">  20 </span>  ]
<span id="L21" class="LineNr">  21 </span>  screen-should-contain [
<span id="L22" class="LineNr">  22 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L23" class="LineNr">  23 </span>  <span class="Conceal">¦</span><span class="Constant"> .  ab      .</span>
<span id="L24" class="LineNr">  24 </span>  <span class="Conceal">¦</span><span class="Constant"> .cd        .</span>
<span id="L25" class="LineNr">  25 </span>  ]
<span id="L26" class="LineNr">  26 </span>  <span class="Comment"># we render at most two editor rows worth (one row for each space)</span>
<span id="L27" class="LineNr">  27 </span>  check-trace-count-for-label-lesser-than<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L28" class="LineNr">  28 </span>]
<span id="L29" class="LineNr">  29 </span>
<span id="L30" class="LineNr">  30 </span><span class="muScenario">scenario</span> editor-inserts-two-spaces-and-wraps-line-on-tab [
<span id="L31" class="LineNr">  31 </span>  <span class="Constant">local-scope</span>
<span id="L32" class="LineNr">  32 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L33" class="LineNr">  33 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abcd]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L34" class="LineNr">  34 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L35" class="LineNr">  35 </span>  $clear-trace
<span id="L36" class="LineNr">  36 </span>  assume-console [
<span id="L37" class="LineNr">  37 </span>  <span class="Conceal">¦</span> press tab
<span id="L38" class="LineNr">  38 </span>  ]
<span id="L39" class="LineNr">  39 </span>  run [
<span id="L40" class="LineNr">  40 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L41" class="LineNr">  41 </span>  ]
<span id="L42" class="LineNr">  42 </span>  screen-should-contain [
<span id="L43" class="LineNr">  43 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L44" class="LineNr">  44 </span>  <span class="Conceal">¦</span><span class="Constant"> .  ab↩     .</span>
<span id="L45" class="LineNr">  45 </span>  <span class="Conceal">¦</span><span class="Constant"> .cd        .</span>
<span id="L46" class="LineNr">  46 </span>  ]
<span id="L47" class="LineNr">  47 </span>  <span class="Comment"># we re-render the whole editor</span>
<span id="L48" class="LineNr">  48 </span>  check-trace-count-for-label-greater-than<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L49" class="LineNr">  49 </span>]
<span id="L50" class="LineNr">  50 </span>
<span id="L51" class="LineNr">  51 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L52" class="LineNr">  52 </span>  <span class="Delimiter">{</span>
<span id="L53" class="LineNr">  53 </span>  <span class="Conceal">¦</span> tab?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">9/tab</span>
<span id="L54" class="LineNr">  54 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> tab?
<span id="L55" class="LineNr">  55 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;insert-character-begin&gt;</span>
<span id="L56" class="LineNr">  56 </span>  <span class="Conceal">¦</span> <span class="Comment"># todo: decompose insert-at-cursor into editor update and screen update,</span>
<span id="L57" class="LineNr">  57 </span>  <span class="Conceal">¦</span> <span class="Comment"># so that 'tab' doesn't render the current line multiple times</span>
<span id="L58" class="LineNr">  58 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L203'>insert-at-cursor</a> editor, <span class="Constant">32/space</span>, <a href='../081print.mu.html#L16'>screen</a>
<span id="L59" class="LineNr">  59 </span>  <span class="Conceal">¦</span> go-render? <span class="Special">&lt;-</span> <a href='002-typing.mu.html#L203'>insert-at-cursor</a> editor, <span class="Constant">32/space</span>, <a href='../081print.mu.html#L16'>screen</a>
<span id="L60" class="LineNr">  60 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;insert-character-end&gt;</span>
<span id="L61" class="LineNr">  61 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L62" class="LineNr">  62 </span>  <span class="Delimiter">}</span>
<span id="L63" class="LineNr">  63 </span>]
<span id="L64" class="LineNr">  64 </span>
<span id="L65" class="LineNr">  65 </span><span class="Comment"># backspace - delete character before cursor</span>
<span id="L66" class="LineNr">  66 </span>
<span id="L67" class="LineNr">  67 </span><span class="muScenario">scenario</span> editor-handles-backspace-key [
<span id="L68" class="LineNr">  68 </span>  <span class="Constant">local-scope</span>
<span id="L69" class="LineNr">  69 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L70" class="LineNr">  70 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L71" class="LineNr">  71 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L72" class="LineNr">  72 </span>  $clear-trace
<span id="L73" class="LineNr">  73 </span>  assume-console [
<span id="L74" class="LineNr">  74 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L75" class="LineNr">  75 </span>  <span class="Conceal">¦</span> press backspace
<span id="L76" class="LineNr">  76 </span>  ]
<span id="L77" class="LineNr">  77 </span>  run [
<span id="L78" class="LineNr">  78 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L79" class="LineNr">  79 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L80" class="LineNr">  80 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L81" class="LineNr">  81 </span>  ]
<span id="L82" class="LineNr">  82 </span>  screen-should-contain [
<span id="L83" class="LineNr">  83 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L84" class="LineNr">  84 </span>  <span class="Conceal">¦</span><span class="Constant"> .bc        .</span>
<span id="L85" class="LineNr">  85 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L86" class="LineNr">  86 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L87" class="LineNr">  87 </span>  ]
<span id="L88" class="LineNr">  88 </span>  memory-should-contain [
<span id="L89" class="LineNr">  89 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L90" class="LineNr">  90 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L91" class="LineNr">  91 </span>  ]
<span id="L92" class="LineNr">  92 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of original line to overwrite</span>
<span id="L93" class="LineNr">  93 </span>]
<span id="L94" class="LineNr">  94 </span>
<span id="L95" class="LineNr">  95 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L96" class="LineNr">  96 </span>  <span class="Delimiter">{</span>
<span id="L97" class="LineNr">  97 </span>  <span class="Conceal">¦</span> delete-previous-character?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">8/backspace</span>
<span id="L98" class="LineNr">  98 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> delete-previous-character?
<span id="L99" class="LineNr">  99 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='003-shortcuts.mu.html#L99'>&lt;backspace-character-begin&gt;</a></span>
<span id="L100" class="LineNr"> 100 </span>  <span class="Conceal">¦</span> go-render?:bool, backspaced-cell:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L109'>delete-before-cursor</a> editor, <a href='../081print.mu.html#L16'>screen</a>
<span id="L101" class="LineNr"> 101 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='003-shortcuts.mu.html#L101'>&lt;backspace-character-end&gt;</a></span>
<span id="L102" class="LineNr"> 102 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L103" class="LineNr"> 103 </span>  <span class="Delimiter">}</span>
<span id="L104" class="LineNr"> 104 </span>]
<span id="L105" class="LineNr"> 105 </span>
<span id="L106" class="LineNr"> 106 </span><span class="Comment"># return values:</span>
<span id="L107" class="LineNr"> 107 </span><span class="Comment">#   go-render? - whether caller needs to update the screen</span>
<span id="L108" class="LineNr"> 108 </span><span class="Comment">#   backspaced-cell - value deleted (or 0 if nothing was deleted) so we can save it for undo, etc.</span>
<span id="L109" class="LineNr"> 109 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L109'>delete-before-cursor</a> editor:&amp;:editor, <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span>go-render?:bool, backspaced-cell:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char, editor:&amp;:editor, <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a> [
<span id="L110" class="LineNr"> 110 </span>  <span class="Constant">local-scope</span>
<span id="L111" class="LineNr"> 111 </span>  <span class="Constant">load-ingredients</span>
<span id="L112" class="LineNr"> 112 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L113" class="LineNr"> 113 </span>  data:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
<span id="L114" class="LineNr"> 114 </span>  <span class="Comment"># if at start of text (before-cursor at § sentinel), return</span>
<span id="L115" class="LineNr"> 115 </span>  <a href='../065duplex_list.mu.html#L36'>prev</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> before-cursor
<span id="L116" class="LineNr"> 116 </span>  <span class="muControl">return-unless</span> <a href='../065duplex_list.mu.html#L36'>prev</a>, <span class="Constant">0/no-more-render</span>, <span class="Constant">0/nothing-deleted</span>
<span id="L117" class="LineNr"> 117 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[delete-before-cursor]</span>
<span id="L118" class="LineNr"> 118 </span>  original-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L119" class="LineNr"> 119 </span>  scroll?:bool <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L156'>move-cursor-coordinates-left</a> editor
<span id="L120" class="LineNr"> 120 </span>  backspaced-cell:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy before-cursor
<span id="L121" class="LineNr"> 121 </span>  data <span class="Special">&lt;-</span> remove before-cursor, data  <span class="Comment"># will also neatly trim next/prev pointers in backspaced-cell/before-cursor</span>
<span id="L122" class="LineNr"> 122 </span>  before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L36'>prev</a>
<span id="L123" class="LineNr"> 123 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L124" class="LineNr"> 124 </span>  <span class="muControl">return-if</span> scroll?, <span class="Constant">1/go-render</span>
<span id="L125" class="LineNr"> 125 </span>  <a href='../081print.mu.html#L768'>screen-width</a>:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L768'>screen-width</a> <a href='../081print.mu.html#L16'>screen</a>
<span id="L126" class="LineNr"> 126 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L127" class="LineNr"> 127 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L128" class="LineNr"> 128 </span>  <span class="Comment"># did we just backspace over a newline?</span>
<span id="L129" class="LineNr"> 129 </span>  same-row?:bool <span class="Special">&lt;-</span> equal cursor-row, original-row
<span id="L130" class="LineNr"> 130 </span>  <span class="muControl">return-unless</span> same-row?, <span class="Constant">1/go-render</span>
<span id="L131" class="LineNr"> 131 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L132" class="LineNr"> 132 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L133" class="LineNr"> 133 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L134" class="LineNr"> 134 </span>  <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, cursor-row, cursor-column
<span id="L135" class="LineNr"> 135 </span>  curr-column:num <span class="Special">&lt;-</span> copy cursor-column
<span id="L136" class="LineNr"> 136 </span>  <span class="Delimiter">{</span>
<span id="L137" class="LineNr"> 137 </span>  <span class="Conceal">¦</span> <span class="Comment"># hit right margin? give up and let caller render</span>
<span id="L138" class="LineNr"> 138 </span>  <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> greater-or-equal curr-column, right
<span id="L139" class="LineNr"> 139 </span>  <span class="Conceal">¦</span> <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
<span id="L140" class="LineNr"> 140 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
<span id="L141" class="LineNr"> 141 </span>  <span class="Conceal">¦</span> <span class="Comment"># newline? done.</span>
<span id="L142" class="LineNr"> 142 </span>  <span class="Conceal">¦</span> currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L143" class="LineNr"> 143 </span>  <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
<span id="L144" class="LineNr"> 144 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline?
<span id="L145" class="LineNr"> 145 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='../081print.mu.html#L16'>screen</a>, currc
<span id="L146" class="LineNr"> 146 </span>  <span class="Conceal">¦</span> curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
<span id="L147" class="LineNr"> 147 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
<span id="L148" class="LineNr"> 148 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L149" class="LineNr"> 149 </span>  <span class="Delimiter">}</span>
<span id="L150" class="LineNr"> 150 </span>  <span class="Comment"># we're guaranteed not to be at the right margin</span>
<span id="L151" class="LineNr"> 151 </span>  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
<span id="L152" class="LineNr"> 152 </span>  <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='../081print.mu.html#L16'>screen</a>, space
<span id="L153" class="LineNr"> 153 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
<span id="L154" class="LineNr"> 154 </span>]
<span id="L155" class="LineNr"> 155 </span>
<span id="L156" class="LineNr"> 156 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L156'>move-cursor-coordinates-left</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
<span id="L157" class="LineNr"> 157 </span>  <span class="Constant">local-scope</span>
<span id="L158" class="LineNr"> 158 </span>  <span class="Constant">load-ingredients</span>
<span id="L159" class="LineNr"> 159 </span>  go-render?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
<span id="L160" class="LineNr"> 160 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L161" class="LineNr"> 161 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L162" class="LineNr"> 162 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L163" class="LineNr"> 163 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L164" class="LineNr"> 164 </span>  <span class="Comment"># if not at left margin, move one character left</span>
<span id="L165" class="LineNr"> 165 </span>  <span class="Delimiter">{</span>
<span id="L166" class="LineNr"> 166 </span>  <span class="Conceal">¦</span> at-left-margin?:bool <span class="Special">&lt;-</span> equal cursor-column, left
<span id="L167" class="LineNr"> 167 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-left-margin?
<span id="L168" class="LineNr"> 168 </span>  <span class="Conceal">¦</span> trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[decrementing cursor column]</span>
<span id="L169" class="LineNr"> 169 </span>  <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> subtract cursor-column,<span class="Constant"> 1</span>
<span id="L170" class="LineNr"> 170 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L171" class="LineNr"> 171 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L172" class="LineNr"> 172 </span>  <span class="Delimiter">}</span>
<span id="L173" class="LineNr"> 173 </span>  <span class="Comment"># if at left margin, we must move to previous row:</span>
<span id="L174" class="LineNr"> 174 </span>  top-of-screen?:bool <span class="Special">&lt;-</span> equal cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># exclude menu bar</span>
<span id="L175" class="LineNr"> 175 </span>  <span class="Delimiter">{</span>
<span id="L176" class="LineNr"> 176 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> top-of-screen?
<span id="L177" class="LineNr"> 177 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>
<span id="L178" class="LineNr"> 178 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L179" class="LineNr"> 179 </span>  <span class="Delimiter">}</span>
<span id="L180" class="LineNr"> 180 </span>  <span class="Delimiter">{</span>
<span id="L181" class="LineNr"> 181 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> top-of-screen?
<span id="L182" class="LineNr"> 182 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;scroll-up&gt;</span>
<span id="L183" class="LineNr"> 183 </span>  <span class="Conceal">¦</span> go-render? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
<span id="L184" class="LineNr"> 184 </span>  <span class="Delimiter">}</span>
<span id="L185" class="LineNr"> 185 </span>  <span class="Delimiter">{</span>
<span id="L186" class="LineNr"> 186 </span>  <span class="Conceal">¦</span> <span class="Comment"># case 1: if previous character was newline, figure out how long the previous line is</span>
<span id="L187" class="LineNr"> 187 </span>  <span class="Conceal">¦</span> previous-character:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
<span id="L188" class="LineNr"> 188 </span>  <span class="Conceal">¦</span> previous-character-is-newline?:bool <span class="Special">&lt;-</span> equal previous-character, <span class="Constant">10/newline</span>
<span id="L189" class="LineNr"> 189 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> previous-character-is-newline?
<span id="L190" class="LineNr"> 190 </span>  <span class="Conceal">¦</span> <span class="Comment"># compute length of previous line</span>
<span id="L191" class="LineNr"> 191 </span>  <span class="Conceal">¦</span> trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[switching to previous line]</span>
<span id="L192" class="LineNr"> 192 </span>  <span class="Conceal">¦</span> d:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
<span id="L193" class="LineNr"> 193 </span>  <span class="Conceal">¦</span> end-of-line:num <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L219'>previous-line-length</a> before-cursor, d
<span id="L194" class="LineNr"> 194 </span>  <span class="Conceal">¦</span> right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L195" class="LineNr"> 195 </span>  <span class="Conceal">¦</span> width:num <span class="Special">&lt;-</span> subtract right, left
<span id="L196" class="LineNr"> 196 </span>  <span class="Conceal">¦</span> wrap?:bool <span class="Special">&lt;-</span> greater-than end-of-line, width
<span id="L197" class="LineNr"> 197 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L198" class="LineNr"> 198 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> wrap?
<span id="L199" class="LineNr"> 199 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> _, column-offset:num <span class="Special">&lt;-</span> divide-with-remainder end-of-line, width
<span id="L200" class="LineNr"> 200 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> add left, column-offset
<span id="L201" class="LineNr"> 201 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L202" class="LineNr"> 202 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L203" class="LineNr"> 203 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L204" class="LineNr"> 204 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> wrap?
<span id="L205" class="LineNr"> 205 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> add left, end-of-line
<span id="L206" class="LineNr"> 206 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L207" class="LineNr"> 207 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L208" class="LineNr"> 208 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L209" class="LineNr"> 209 </span>  <span class="Delimiter">}</span>
<span id="L210" class="LineNr"> 210 </span>  <span class="Comment"># case 2: if previous-character was not newline, we're just at a wrapped line</span>
<span id="L211" class="LineNr"> 211 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[wrapping to previous line]</span>
<span id="L212" class="LineNr"> 212 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L213" class="LineNr"> 213 </span>  cursor-column <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>  <span class="Comment"># leave room for wrap icon</span>
<span id="L214" class="LineNr"> 214 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L215" class="LineNr"> 215 </span>]
<span id="L216" class="LineNr"> 216 </span>
<span id="L217" class="LineNr"> 217 </span><span class="Comment"># takes a pointer 'curr' into the doubly-linked list and its sentinel, counts</span>
<span id="L218" class="LineNr"> 218 </span><span class="Comment"># the length of the previous line before the 'curr' pointer.</span>
<span id="L219" class="LineNr"> 219 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L219'>previous-line-length</a> curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char, start:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char<span class="muRecipe"> -&gt; </span>result:num [
<span id="L220" class="LineNr"> 220 </span>  <span class="Constant">local-scope</span>
<span id="L221" class="LineNr"> 221 </span>  <span class="Constant">load-ingredients</span>
<span id="L222" class="LineNr"> 222 </span>  result:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L223" class="LineNr"> 223 </span>  <span class="muControl">return-unless</span> curr
<span id="L224" class="LineNr"> 224 </span>  at-start?:bool <span class="Special">&lt;-</span> equal curr, start
<span id="L225" class="LineNr"> 225 </span>  <span class="muControl">return-if</span> at-start?
<span id="L226" class="LineNr"> 226 </span>  <span class="Delimiter">{</span>
<span id="L227" class="LineNr"> 227 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> curr
<span id="L228" class="LineNr"> 228 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
<span id="L229" class="LineNr"> 229 </span>  <span class="Conceal">¦</span> at-start?:bool <span class="Special">&lt;-</span> equal curr, start
<span id="L230" class="LineNr"> 230 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-start?
<span id="L231" class="LineNr"> 231 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L232" class="LineNr"> 232 </span>  <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L233" class="LineNr"> 233 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline?
<span id="L234" class="LineNr"> 234 </span>  <span class="Conceal">¦</span> result <span class="Special">&lt;-</span> add result,<span class="Constant"> 1</span>
<span id="L235" class="LineNr"> 235 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L236" class="LineNr"> 236 </span>  <span class="Delimiter">}</span>
<span id="L237" class="LineNr"> 237 </span>]
<span id="L238" class="LineNr"> 238 </span>
<span id="L239" class="LineNr"> 239 </span><span class="muScenario">scenario</span> editor-clears-last-line-on-backspace [
<span id="L240" class="LineNr"> 240 </span>  <span class="Constant">local-scope</span>
<span id="L241" class="LineNr"> 241 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L242" class="LineNr"> 242 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
<span id="L243" class="LineNr"> 243 </span><span class="Constant">cd]</span>
<span id="L244" class="LineNr"> 244 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L245" class="LineNr"> 245 </span>  assume-console [
<span id="L246" class="LineNr"> 246 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L247" class="LineNr"> 247 </span>  <span class="Conceal">¦</span> press backspace
<span id="L248" class="LineNr"> 248 </span>  ]
<span id="L249" class="LineNr"> 249 </span>  run [
<span id="L250" class="LineNr"> 250 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L251" class="LineNr"> 251 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L252" class="LineNr"> 252 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L253" class="LineNr"> 253 </span>  ]
<span id="L254" class="LineNr"> 254 </span>  screen-should-contain [
<span id="L255" class="LineNr"> 255 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L256" class="LineNr"> 256 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd      .</span>
<span id="L257" class="LineNr"> 257 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L258" class="LineNr"> 258 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L259" class="LineNr"> 259 </span>  ]
<span id="L260" class="LineNr"> 260 </span>  memory-should-contain [
<span id="L261" class="LineNr"> 261 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L262" class="LineNr"> 262 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L263" class="LineNr"> 263 </span>  ]
<span id="L264" class="LineNr"> 264 </span>]
<span id="L265" class="LineNr"> 265 </span>
<span id="L266" class="LineNr"> 266 </span><span class="muScenario">scenario</span> editor-joins-and-wraps-lines-on-backspace [
<span id="L267" class="LineNr"> 267 </span>  <span class="Constant">local-scope</span>
<span id="L268" class="LineNr"> 268 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L269" class="LineNr"> 269 </span>  <span class="Comment"># initialize editor with two long-ish but non-wrapping lines</span>
<span id="L270" class="LineNr"> 270 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc def</span>
<span id="L271" class="LineNr"> 271 </span><span class="Constant">ghi jkl]</span>
<span id="L272" class="LineNr"> 272 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L273" class="LineNr"> 273 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L274" class="LineNr"> 274 </span>  $clear-trace
<span id="L275" class="LineNr"> 275 </span>  <span class="Comment"># position the cursor at the start of the second and hit backspace</span>
<span id="L276" class="LineNr"> 276 </span>  assume-console [
<span id="L277" class="LineNr"> 277 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L278" class="LineNr"> 278 </span>  <span class="Conceal">¦</span> press backspace
<span id="L279" class="LineNr"> 279 </span>  ]
<span id="L280" class="LineNr"> 280 </span>  run [
<span id="L281" class="LineNr"> 281 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L282" class="LineNr"> 282 </span>  ]
<span id="L283" class="LineNr"> 283 </span>  <span class="Comment"># resulting single line should wrap correctly</span>
<span id="L284" class="LineNr"> 284 </span>  screen-should-contain [
<span id="L285" class="LineNr"> 285 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L286" class="LineNr"> 286 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc defgh↩.</span>
<span id="L287" class="LineNr"> 287 </span>  <span class="Conceal">¦</span><span class="Constant"> .i jkl     .</span>
<span id="L288" class="LineNr"> 288 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L289" class="LineNr"> 289 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L290" class="LineNr"> 290 </span>  ]
<span id="L291" class="LineNr"> 291 </span>]
<span id="L292" class="LineNr"> 292 </span>
<span id="L293" class="LineNr"> 293 </span><span class="muScenario">scenario</span> editor-wraps-long-lines-on-backspace [
<span id="L294" class="LineNr"> 294 </span>  <span class="Constant">local-scope</span>
<span id="L295" class="LineNr"> 295 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L296" class="LineNr"> 296 </span>  <span class="Comment"># initialize editor in part of the screen with a long line</span>
<span id="L297" class="LineNr"> 297 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abc def ghij]</span>, <span class="Constant">0/left</span>, <span class="Constant">8/right</span>
<span id="L298" class="LineNr"> 298 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L299" class="LineNr"> 299 </span>  <span class="Comment"># confirm that it wraps</span>
<span id="L300" class="LineNr"> 300 </span>  screen-should-contain [
<span id="L301" class="LineNr"> 301 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L302" class="LineNr"> 302 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc def↩  .</span>
<span id="L303" class="LineNr"> 303 </span>  <span class="Conceal">¦</span><span class="Constant"> . ghij     .</span>
<span id="L304" class="LineNr"> 304 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌  .</span>
<span id="L305" class="LineNr"> 305 </span>  ]
<span id="L306" class="LineNr"> 306 </span>  $clear-trace
<span id="L307" class="LineNr"> 307 </span>  <span class="Comment"># position the cursor somewhere in the middle of the top screen line and hit backspace</span>
<span id="L308" class="LineNr"> 308 </span>  assume-console [
<span id="L309" class="LineNr"> 309 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>
<span id="L310" class="LineNr"> 310 </span>  <span class="Conceal">¦</span> press backspace
<span id="L311" class="LineNr"> 311 </span>  ]
<span id="L312" class="LineNr"> 312 </span>  run [
<span id="L313" class="LineNr"> 313 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L314" class="LineNr"> 314 </span>  ]
<span id="L315" class="LineNr"> 315 </span>  <span class="Comment"># resulting single line should wrap correctly and not overflow its bounds</span>
<span id="L316" class="LineNr"> 316 </span>  screen-should-contain [
<span id="L317" class="LineNr"> 317 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L318" class="LineNr"> 318 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcdef ↩  .</span>
<span id="L319" class="LineNr"> 319 </span>  <span class="Conceal">¦</span><span class="Constant"> .ghij      .</span>
<span id="L320" class="LineNr"> 320 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌  .</span>
<span id="L321" class="LineNr"> 321 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L322" class="LineNr"> 322 </span>  ]
<span id="L323" class="LineNr"> 323 </span>]
<span id="L324" class="LineNr"> 324 </span>
<span id="L325" class="LineNr"> 325 </span><span class="Comment"># delete - delete character at cursor</span>
<span id="L326" class="LineNr"> 326 </span>
<span id="L327" class="LineNr"> 327 </span><span class="muScenario">scenario</span> editor-handles-delete-key [
<span id="L328" class="LineNr"> 328 </span>  <span class="Constant">local-scope</span>
<span id="L329" class="LineNr"> 329 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L330" class="LineNr"> 330 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L331" class="LineNr"> 331 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L332" class="LineNr"> 332 </span>  $clear-trace
<span id="L333" class="LineNr"> 333 </span>  assume-console [
<span id="L334" class="LineNr"> 334 </span>  <span class="Conceal">¦</span> press delete
<span id="L335" class="LineNr"> 335 </span>  ]
<span id="L336" class="LineNr"> 336 </span>  run [
<span id="L337" class="LineNr"> 337 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L338" class="LineNr"> 338 </span>  ]
<span id="L339" class="LineNr"> 339 </span>  screen-should-contain [
<span id="L340" class="LineNr"> 340 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L341" class="LineNr"> 341 </span>  <span class="Conceal">¦</span><span class="Constant"> .bc        .</span>
<span id="L342" class="LineNr"> 342 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L343" class="LineNr"> 343 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L344" class="LineNr"> 344 </span>  ]
<span id="L345" class="LineNr"> 345 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of original line to overwrite</span>
<span id="L346" class="LineNr"> 346 </span>  $clear-trace
<span id="L347" class="LineNr"> 347 </span>  assume-console [
<span id="L348" class="LineNr"> 348 </span>  <span class="Conceal">¦</span> press delete
<span id="L349" class="LineNr"> 349 </span>  ]
<span id="L350" class="LineNr"> 350 </span>  run [
<span id="L351" class="LineNr"> 351 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L352" class="LineNr"> 352 </span>  ]
<span id="L353" class="LineNr"> 353 </span>  screen-should-contain [
<span id="L354" class="LineNr"> 354 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L355" class="LineNr"> 355 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L356" class="LineNr"> 356 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L357" class="LineNr"> 357 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L358" class="LineNr"> 358 </span>  ]
<span id="L359" class="LineNr"> 359 </span>  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># new length to overwrite</span>
<span id="L360" class="LineNr"> 360 </span>]
<span id="L361" class="LineNr"> 361 </span>
<span id="L362" class="LineNr"> 362 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L363" class="LineNr"> 363 </span>  <span class="Delimiter">{</span>
<span id="L364" class="LineNr"> 364 </span>  <span class="Conceal">¦</span> delete-next-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65522/delete</span>
<span id="L365" class="LineNr"> 365 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> delete-next-character?
<span id="L366" class="LineNr"> 366 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='003-shortcuts.mu.html#L366'>&lt;delete-character-begin&gt;</a></span>
<span id="L367" class="LineNr"> 367 </span>  <span class="Conceal">¦</span> go-render?:bool, deleted-cell:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L373'>delete-at-cursor</a> editor, <a href='../081print.mu.html#L16'>screen</a>
<span id="L368" class="LineNr"> 368 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='003-shortcuts.mu.html#L368'>&lt;delete-character-end&gt;</a></span>
<span id="L369" class="LineNr"> 369 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L370" class="LineNr"> 370 </span>  <span class="Delimiter">}</span>
<span id="L371" class="LineNr"> 371 </span>]
<span id="L372" class="LineNr"> 372 </span>
<span id="L373" class="LineNr"> 373 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L373'>delete-at-cursor</a> editor:&amp;:editor, <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a><span class="muRecipe"> -&gt; </span>go-render?:bool, deleted-cell:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char, editor:&amp;:editor, <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a> [
<span id="L374" class="LineNr"> 374 </span>  <span class="Constant">local-scope</span>
<span id="L375" class="LineNr"> 375 </span>  <span class="Constant">load-ingredients</span>
<span id="L376" class="LineNr"> 376 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L377" class="LineNr"> 377 </span>  data:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
<span id="L378" class="LineNr"> 378 </span>  deleted-cell:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L379" class="LineNr"> 379 </span>  <span class="muControl">return-unless</span> deleted-cell, <span class="Constant">0/don't-render</span>
<span id="L380" class="LineNr"> 380 </span>  currc:char <span class="Special">&lt;-</span> get *deleted-cell, <span class="Constant">value:offset</span>
<span id="L381" class="LineNr"> 381 </span>  data <span class="Special">&lt;-</span> remove deleted-cell, data
<span id="L382" class="LineNr"> 382 </span>  deleted-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
<span id="L383" class="LineNr"> 383 </span>  <span class="muControl">return-if</span> deleted-newline?, <span class="Constant">1/go-render</span>
<span id="L384" class="LineNr"> 384 </span>  <span class="Comment"># wasn't a newline? render rest of line</span>
<span id="L385" class="LineNr"> 385 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor  <span class="Comment"># refresh after remove above</span>
<span id="L386" class="LineNr"> 386 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L387" class="LineNr"> 387 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L388" class="LineNr"> 388 </span>  <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, cursor-row, cursor-column
<span id="L389" class="LineNr"> 389 </span>  curr-column:num <span class="Special">&lt;-</span> copy cursor-column
<span id="L390" class="LineNr"> 390 </span>  <a href='../081print.mu.html#L768'>screen-width</a>:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L768'>screen-width</a> <a href='../081print.mu.html#L16'>screen</a>
<span id="L391" class="LineNr"> 391 </span>  <span class="Delimiter">{</span>
<span id="L392" class="LineNr"> 392 </span>  <span class="Conceal">¦</span> <span class="Comment"># hit right margin? give up and let caller render</span>
<span id="L393" class="LineNr"> 393 </span>  <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> greater-or-equal curr-column, <a href='../081print.mu.html#L768'>screen-width</a>
<span id="L394" class="LineNr"> 394 </span>  <span class="Conceal">¦</span> <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
<span id="L395" class="LineNr"> 395 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
<span id="L396" class="LineNr"> 396 </span>  <span class="Conceal">¦</span> currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L397" class="LineNr"> 397 </span>  <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
<span id="L398" class="LineNr"> 398 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline?
<span id="L399" class="LineNr"> 399 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='../081print.mu.html#L16'>screen</a>, currc
<span id="L400" class="LineNr"> 400 </span>  <span class="Conceal">¦</span> curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
<span id="L401" class="LineNr"> 401 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
<span id="L402" class="LineNr"> 402 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L403" class="LineNr"> 403 </span>  <span class="Delimiter">}</span>
<span id="L404" class="LineNr"> 404 </span>  <span class="Comment"># we're guaranteed not to be at the right margin</span>
<span id="L405" class="LineNr"> 405 </span>  space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
<span id="L406" class="LineNr"> 406 </span>  <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> print <a href='../081print.mu.html#L16'>screen</a>, space
<span id="L407" class="LineNr"> 407 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
<span id="L408" class="LineNr"> 408 </span>]
<span id="L409" class="LineNr"> 409 </span>
<span id="L410" class="LineNr"> 410 </span><span class="Comment"># right arrow</span>
<span id="L411" class="LineNr"> 411 </span>
<span id="L412" class="LineNr"> 412 </span><span class="muScenario">scenario</span> editor-moves-cursor-right-with-key [
<span id="L413" class="LineNr"> 413 </span>  <span class="Constant">local-scope</span>
<span id="L414" class="LineNr"> 414 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L415" class="LineNr"> 415 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L416" class="LineNr"> 416 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L417" class="LineNr"> 417 </span>  $clear-trace
<span id="L418" class="LineNr"> 418 </span>  assume-console [
<span id="L419" class="LineNr"> 419 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L420" class="LineNr"> 420 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L421" class="LineNr"> 421 </span>  ]
<span id="L422" class="LineNr"> 422 </span>  run [
<span id="L423" class="LineNr"> 423 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L424" class="LineNr"> 424 </span>  ]
<span id="L425" class="LineNr"> 425 </span>  screen-should-contain [
<span id="L426" class="LineNr"> 426 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L427" class="LineNr"> 427 </span>  <span class="Conceal">¦</span><span class="Constant"> .a0bc      .</span>
<span id="L428" class="LineNr"> 428 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L429" class="LineNr"> 429 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L430" class="LineNr"> 430 </span>  ]
<span id="L431" class="LineNr"> 431 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># 0 and following characters</span>
<span id="L432" class="LineNr"> 432 </span>]
<span id="L433" class="LineNr"> 433 </span>
<span id="L434" class="LineNr"> 434 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L435" class="LineNr"> 435 </span>  <span class="Delimiter">{</span>
<span id="L436" class="LineNr"> 436 </span>  <span class="Conceal">¦</span> move-to-next-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65514/right-arrow</span>
<span id="L437" class="LineNr"> 437 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-to-next-character?
<span id="L438" class="LineNr"> 438 </span>  <span class="Conceal">¦</span> <span class="Comment"># if not at end of text</span>
<span id="L439" class="LineNr"> 439 </span>  <span class="Conceal">¦</span> next-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L440" class="LineNr"> 440 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> next-cursor
<span id="L441" class="LineNr"> 441 </span>  <span class="Conceal">¦</span> <span class="Comment"># scan to next character</span>
<span id="L442" class="LineNr"> 442 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L443" class="LineNr"> 443 </span>  <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy next-cursor
<span id="L444" class="LineNr"> 444 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L445" class="LineNr"> 445 </span>  <span class="Conceal">¦</span> go-render?:bool <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L453'>move-cursor-coordinates-right</a> editor, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L446" class="LineNr"> 446 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, cursor-row, cursor-column
<span id="L447" class="LineNr"> 447 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">2/right-arrow</span>
<span id="L448" class="LineNr"> 448 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L449" class="LineNr"> 449 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L450" class="LineNr"> 450 </span>  <span class="Delimiter">}</span>
<span id="L451" class="LineNr"> 451 </span>]
<span id="L452" class="LineNr"> 452 </span>
<span id="L453" class="LineNr"> 453 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L453'>move-cursor-coordinates-right</a> editor:&amp;:editor, <a href='../081print.mu.html#L782'>screen-height</a>:num<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
<span id="L454" class="LineNr"> 454 </span>  <span class="Constant">local-scope</span>
<span id="L455" class="LineNr"> 455 </span>  <span class="Constant">load-ingredients</span>
<span id="L456" class="LineNr"> 456 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor <span class="Constant">before-cursor:offset</span>
<span id="L457" class="LineNr"> 457 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L458" class="LineNr"> 458 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L459" class="LineNr"> 459 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L460" class="LineNr"> 460 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L461" class="LineNr"> 461 </span>  <span class="Comment"># if crossed a newline, move cursor to start of next row</span>
<span id="L462" class="LineNr"> 462 </span>  <span class="Delimiter">{</span>
<span id="L463" class="LineNr"> 463 </span>  <span class="Conceal">¦</span> old-cursor-character:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
<span id="L464" class="LineNr"> 464 </span>  <span class="Conceal">¦</span> was-at-newline?:bool <span class="Special">&lt;-</span> equal old-cursor-character, <span class="Constant">10/newline</span>
<span id="L465" class="LineNr"> 465 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> was-at-newline?
<span id="L466" class="LineNr"> 466 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
<span id="L467" class="LineNr"> 467 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L468" class="LineNr"> 468 </span>  <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> copy left
<span id="L469" class="LineNr"> 469 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L470" class="LineNr"> 470 </span>  <span class="Conceal">¦</span> below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, <a href='../081print.mu.html#L782'>screen-height</a>  <span class="Comment"># must be equal</span>
<span id="L471" class="LineNr"> 471 </span>  <span class="Conceal">¦</span> <span class="muControl">return-unless</span> below-screen?, <span class="Constant">0/don't-render</span>
<span id="L472" class="LineNr"> 472 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;scroll-down&gt;</span>
<span id="L473" class="LineNr"> 473 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># bring back into screen range</span>
<span id="L474" class="LineNr"> 474 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L475" class="LineNr"> 475 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">1/go-render</span>
<span id="L476" class="LineNr"> 476 </span>  <span class="Delimiter">}</span>
<span id="L477" class="LineNr"> 477 </span>  <span class="Comment"># if the line wraps, move cursor to start of next row</span>
<span id="L478" class="LineNr"> 478 </span>  <span class="Delimiter">{</span>
<span id="L479" class="LineNr"> 479 </span>  <span class="Conceal">¦</span> <span class="Comment"># if we're at the column just before the wrap indicator</span>
<span id="L480" class="LineNr"> 480 </span>  <span class="Conceal">¦</span> wrap-column:num <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>
<span id="L481" class="LineNr"> 481 </span>  <span class="Conceal">¦</span> at-wrap?:bool <span class="Special">&lt;-</span> equal cursor-column, wrap-column
<span id="L482" class="LineNr"> 482 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-wrap?
<span id="L483" class="LineNr"> 483 </span>  <span class="Conceal">¦</span> <span class="Comment"># and if next character isn't newline</span>
<span id="L484" class="LineNr"> 484 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L485" class="LineNr"> 485 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L486" class="LineNr"> 486 </span>  <span class="Conceal">¦</span> next-character:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
<span id="L487" class="LineNr"> 487 </span>  <span class="Conceal">¦</span> newline?:bool <span class="Special">&lt;-</span> equal next-character, <span class="Constant">10/newline</span>
<span id="L488" class="LineNr"> 488 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> newline?
<span id="L489" class="LineNr"> 489 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
<span id="L490" class="LineNr"> 490 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L491" class="LineNr"> 491 </span>  <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> copy left
<span id="L492" class="LineNr"> 492 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L493" class="LineNr"> 493 </span>  <span class="Conceal">¦</span> below-screen?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, <a href='../081print.mu.html#L782'>screen-height</a>  <span class="Comment"># must be equal</span>
<span id="L494" class="LineNr"> 494 </span>  <span class="Conceal">¦</span> <span class="muControl">return-unless</span> below-screen?, <span class="Constant">0/no-more-render</span>
<span id="L495" class="LineNr"> 495 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;scroll-down&gt;</span>
<span id="L496" class="LineNr"> 496 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># bring back into screen range</span>
<span id="L497" class="LineNr"> 497 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L498" class="LineNr"> 498 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">1/go-render</span>
<span id="L499" class="LineNr"> 499 </span>  <span class="Delimiter">}</span>
<span id="L500" class="LineNr"> 500 </span>  <span class="Comment"># otherwise move cursor one character right</span>
<span id="L501" class="LineNr"> 501 </span>  cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L502" class="LineNr"> 502 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L503" class="LineNr"> 503 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
<span id="L504" class="LineNr"> 504 </span>]
<span id="L505" class="LineNr"> 505 </span>
<span id="L506" class="LineNr"> 506 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow [
<span id="L507" class="LineNr"> 507 </span>  <span class="Constant">local-scope</span>
<span id="L508" class="LineNr"> 508 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L509" class="LineNr"> 509 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L510" class="LineNr"> 510 </span><span class="Constant">d]</span>
<span id="L511" class="LineNr"> 511 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L512" class="LineNr"> 512 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L513" class="LineNr"> 513 </span>  $clear-trace
<span id="L514" class="LineNr"> 514 </span>  <span class="Comment"># type right-arrow a few times to get to start of second line</span>
<span id="L515" class="LineNr"> 515 </span>  assume-console [
<span id="L516" class="LineNr"> 516 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L517" class="LineNr"> 517 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L518" class="LineNr"> 518 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L519" class="LineNr"> 519 </span>  <span class="Conceal">¦</span> press right-arrow  <span class="Comment"># next line</span>
<span id="L520" class="LineNr"> 520 </span>  ]
<span id="L521" class="LineNr"> 521 </span>  run [
<span id="L522" class="LineNr"> 522 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L523" class="LineNr"> 523 </span>  ]
<span id="L524" class="LineNr"> 524 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L525" class="LineNr"> 525 </span>  <span class="Comment"># type something and ensure it goes where it should</span>
<span id="L526" class="LineNr"> 526 </span>  assume-console [
<span id="L527" class="LineNr"> 527 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L528" class="LineNr"> 528 </span>  ]
<span id="L529" class="LineNr"> 529 </span>  run [
<span id="L530" class="LineNr"> 530 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L531" class="LineNr"> 531 </span>  ]
<span id="L532" class="LineNr"> 532 </span>  screen-should-contain [
<span id="L533" class="LineNr"> 533 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L534" class="LineNr"> 534 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc       .</span>
<span id="L535" class="LineNr"> 535 </span>  <span class="Conceal">¦</span><span class="Constant"> .0d        .</span>
<span id="L536" class="LineNr"> 536 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L537" class="LineNr"> 537 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L538" class="LineNr"> 538 </span>  ]
<span id="L539" class="LineNr"> 539 </span>  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># new length of second line</span>
<span id="L540" class="LineNr"> 540 </span>]
<span id="L541" class="LineNr"> 541 </span>
<span id="L542" class="LineNr"> 542 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow-2 [
<span id="L543" class="LineNr"> 543 </span>  <span class="Constant">local-scope</span>
<span id="L544" class="LineNr"> 544 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L545" class="LineNr"> 545 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L546" class="LineNr"> 546 </span><span class="Constant">d]</span>
<span id="L547" class="LineNr"> 547 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">1/left</span>, <span class="Constant">10/right</span>
<span id="L548" class="LineNr"> 548 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L549" class="LineNr"> 549 </span>  assume-console [
<span id="L550" class="LineNr"> 550 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L551" class="LineNr"> 551 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L552" class="LineNr"> 552 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L553" class="LineNr"> 553 </span>  <span class="Conceal">¦</span> press right-arrow  <span class="Comment"># next line</span>
<span id="L554" class="LineNr"> 554 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L555" class="LineNr"> 555 </span>  ]
<span id="L556" class="LineNr"> 556 </span>  run [
<span id="L557" class="LineNr"> 557 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L558" class="LineNr"> 558 </span>  ]
<span id="L559" class="LineNr"> 559 </span>  screen-should-contain [
<span id="L560" class="LineNr"> 560 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L561" class="LineNr"> 561 </span>  <span class="Conceal">¦</span><span class="Constant"> . abc      .</span>
<span id="L562" class="LineNr"> 562 </span>  <span class="Conceal">¦</span><span class="Constant"> . 0d       .</span>
<span id="L563" class="LineNr"> 563 </span>  <span class="Conceal">¦</span><span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span>
<span id="L564" class="LineNr"> 564 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L565" class="LineNr"> 565 </span>  ]
<span id="L566" class="LineNr"> 566 </span>]
<span id="L567" class="LineNr"> 567 </span>
<span id="L568" class="LineNr"> 568 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow [
<span id="L569" class="LineNr"> 569 </span>  <span class="Constant">local-scope</span>
<span id="L570" class="LineNr"> 570 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L571" class="LineNr"> 571 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abcdef]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L572" class="LineNr"> 572 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L573" class="LineNr"> 573 </span>  $clear-trace
<span id="L574" class="LineNr"> 574 </span>  assume-console [
<span id="L575" class="LineNr"> 575 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L576" class="LineNr"> 576 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L577" class="LineNr"> 577 </span>  ]
<span id="L578" class="LineNr"> 578 </span>  run [
<span id="L579" class="LineNr"> 579 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L580" class="LineNr"> 580 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L581" class="LineNr"> 581 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L582" class="LineNr"> 582 </span>  ]
<span id="L583" class="LineNr"> 583 </span>  screen-should-contain [
<span id="L584" class="LineNr"> 584 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L585" class="LineNr"> 585 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd↩     .</span>
<span id="L586" class="LineNr"> 586 </span>  <span class="Conceal">¦</span><span class="Constant"> .ef        .</span>
<span id="L587" class="LineNr"> 587 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L588" class="LineNr"> 588 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L589" class="LineNr"> 589 </span>  ]
<span id="L590" class="LineNr"> 590 </span>  memory-should-contain [
<span id="L591" class="LineNr"> 591 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L592" class="LineNr"> 592 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L593" class="LineNr"> 593 </span>  ]
<span id="L594" class="LineNr"> 594 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L595" class="LineNr"> 595 </span>]
<span id="L596" class="LineNr"> 596 </span>
<span id="L597" class="LineNr"> 597 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-2 [
<span id="L598" class="LineNr"> 598 </span>  <span class="Constant">local-scope</span>
<span id="L599" class="LineNr"> 599 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L600" class="LineNr"> 600 </span>  <span class="Comment"># line just barely wrapping</span>
<span id="L601" class="LineNr"> 601 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L602" class="LineNr"> 602 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L603" class="LineNr"> 603 </span>  $clear-trace
<span id="L604" class="LineNr"> 604 </span>  <span class="Comment"># position cursor at last character before wrap and hit right-arrow</span>
<span id="L605" class="LineNr"> 605 </span>  assume-console [
<span id="L606" class="LineNr"> 606 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L607" class="LineNr"> 607 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L608" class="LineNr"> 608 </span>  ]
<span id="L609" class="LineNr"> 609 </span>  run [
<span id="L610" class="LineNr"> 610 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L611" class="LineNr"> 611 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L612" class="LineNr"> 612 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L613" class="LineNr"> 613 </span>  ]
<span id="L614" class="LineNr"> 614 </span>  memory-should-contain [
<span id="L615" class="LineNr"> 615 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L616" class="LineNr"> 616 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L617" class="LineNr"> 617 </span>  ]
<span id="L618" class="LineNr"> 618 </span>  <span class="Comment"># now hit right arrow again</span>
<span id="L619" class="LineNr"> 619 </span>  assume-console [
<span id="L620" class="LineNr"> 620 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L621" class="LineNr"> 621 </span>  ]
<span id="L622" class="LineNr"> 622 </span>  run [
<span id="L623" class="LineNr"> 623 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L624" class="LineNr"> 624 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L625" class="LineNr"> 625 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L626" class="LineNr"> 626 </span>  ]
<span id="L627" class="LineNr"> 627 </span>  memory-should-contain [
<span id="L628" class="LineNr"> 628 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L629" class="LineNr"> 629 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L630" class="LineNr"> 630 </span>  ]
<span id="L631" class="LineNr"> 631 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L632" class="LineNr"> 632 </span>]
<span id="L633" class="LineNr"> 633 </span>
<span id="L634" class="LineNr"> 634 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-wrapped-line-with-right-arrow-3 [
<span id="L635" class="LineNr"> 635 </span>  <span class="Constant">local-scope</span>
<span id="L636" class="LineNr"> 636 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L637" class="LineNr"> 637 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abcdef]</span>, <span class="Constant">1/left</span>, <span class="Constant">6/right</span>
<span id="L638" class="LineNr"> 638 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L639" class="LineNr"> 639 </span>  $clear-trace
<span id="L640" class="LineNr"> 640 </span>  assume-console [
<span id="L641" class="LineNr"> 641 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>
<span id="L642" class="LineNr"> 642 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L643" class="LineNr"> 643 </span>  ]
<span id="L644" class="LineNr"> 644 </span>  run [
<span id="L645" class="LineNr"> 645 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L646" class="LineNr"> 646 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L647" class="LineNr"> 647 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L648" class="LineNr"> 648 </span>  ]
<span id="L649" class="LineNr"> 649 </span>  screen-should-contain [
<span id="L650" class="LineNr"> 650 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L651" class="LineNr"> 651 </span>  <span class="Conceal">¦</span><span class="Constant"> . abcd↩    .</span>
<span id="L652" class="LineNr"> 652 </span>  <span class="Conceal">¦</span><span class="Constant"> . ef       .</span>
<span id="L653" class="LineNr"> 653 </span>  <span class="Conceal">¦</span><span class="Constant"> . ╌╌╌╌╌    .</span>
<span id="L654" class="LineNr"> 654 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L655" class="LineNr"> 655 </span>  ]
<span id="L656" class="LineNr"> 656 </span>  memory-should-contain [
<span id="L657" class="LineNr"> 657 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L658" class="LineNr"> 658 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L659" class="LineNr"> 659 </span>  ]
<span id="L660" class="LineNr"> 660 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L661" class="LineNr"> 661 </span>]
<span id="L662" class="LineNr"> 662 </span>
<span id="L663" class="LineNr"> 663 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-next-line-with-right-arrow-at-end-of-line [
<span id="L664" class="LineNr"> 664 </span>  <span class="Constant">local-scope</span>
<span id="L665" class="LineNr"> 665 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L666" class="LineNr"> 666 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L667" class="LineNr"> 667 </span><span class="Constant">d]</span>
<span id="L668" class="LineNr"> 668 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L669" class="LineNr"> 669 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L670" class="LineNr"> 670 </span>  $clear-trace
<span id="L671" class="LineNr"> 671 </span>  <span class="Comment"># move to end of line, press right-arrow, type a character</span>
<span id="L672" class="LineNr"> 672 </span>  assume-console [
<span id="L673" class="LineNr"> 673 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L674" class="LineNr"> 674 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L675" class="LineNr"> 675 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L676" class="LineNr"> 676 </span>  ]
<span id="L677" class="LineNr"> 677 </span>  run [
<span id="L678" class="LineNr"> 678 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L679" class="LineNr"> 679 </span>  ]
<span id="L680" class="LineNr"> 680 </span>  <span class="Comment"># new character should be in next line</span>
<span id="L681" class="LineNr"> 681 </span>  screen-should-contain [
<span id="L682" class="LineNr"> 682 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L683" class="LineNr"> 683 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc       .</span>
<span id="L684" class="LineNr"> 684 </span>  <span class="Conceal">¦</span><span class="Constant"> .0d        .</span>
<span id="L685" class="LineNr"> 685 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L686" class="LineNr"> 686 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L687" class="LineNr"> 687 </span>  ]
<span id="L688" class="LineNr"> 688 </span>  check-trace-count-for-label<span class="Constant"> 2</span>, <span class="Constant">[print-character]</span>
<span id="L689" class="LineNr"> 689 </span>]
<span id="L690" class="LineNr"> 690 </span>
<span id="L691" class="LineNr"> 691 </span><span class="Comment"># todo: ctrl-right: next word-end</span>
<span id="L692" class="LineNr"> 692 </span>
<span id="L693" class="LineNr"> 693 </span><span class="Comment"># left arrow</span>
<span id="L694" class="LineNr"> 694 </span>
<span id="L695" class="LineNr"> 695 </span><span class="muScenario">scenario</span> editor-moves-cursor-left-with-key [
<span id="L696" class="LineNr"> 696 </span>  <span class="Constant">local-scope</span>
<span id="L697" class="LineNr"> 697 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L698" class="LineNr"> 698 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L699" class="LineNr"> 699 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L700" class="LineNr"> 700 </span>  $clear-trace
<span id="L701" class="LineNr"> 701 </span>  assume-console [
<span id="L702" class="LineNr"> 702 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
<span id="L703" class="LineNr"> 703 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L704" class="LineNr"> 704 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L705" class="LineNr"> 705 </span>  ]
<span id="L706" class="LineNr"> 706 </span>  run [
<span id="L707" class="LineNr"> 707 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L708" class="LineNr"> 708 </span>  ]
<span id="L709" class="LineNr"> 709 </span>  screen-should-contain [
<span id="L710" class="LineNr"> 710 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L711" class="LineNr"> 711 </span>  <span class="Conceal">¦</span><span class="Constant"> .a0bc      .</span>
<span id="L712" class="LineNr"> 712 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L713" class="LineNr"> 713 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L714" class="LineNr"> 714 </span>  ]
<span id="L715" class="LineNr"> 715 </span>  check-trace-count-for-label<span class="Constant"> 3</span>, <span class="Constant">[print-character]</span>
<span id="L716" class="LineNr"> 716 </span>]
<span id="L717" class="LineNr"> 717 </span>
<span id="L718" class="LineNr"> 718 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L719" class="LineNr"> 719 </span>  <span class="Delimiter">{</span>
<span id="L720" class="LineNr"> 720 </span>  <span class="Conceal">¦</span> move-to-previous-character?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65515/left-arrow</span>
<span id="L721" class="LineNr"> 721 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-to-previous-character?
<span id="L722" class="LineNr"> 722 </span>  <span class="Conceal">¦</span> trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[left arrow]</span>
<span id="L723" class="LineNr"> 723 </span>  <span class="Conceal">¦</span> <span class="Comment"># if not at start of text (before-cursor at § sentinel)</span>
<span id="L724" class="LineNr"> 724 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> before-cursor
<span id="L725" class="LineNr"> 725 </span>  <span class="Conceal">¦</span> <span class="muControl">return-unless</span> <a href='../065duplex_list.mu.html#L36'>prev</a>, <span class="Constant">0/don't-render</span>
<span id="L726" class="LineNr"> 726 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L727" class="LineNr"> 727 </span>  <span class="Conceal">¦</span> go-render? <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L156'>move-cursor-coordinates-left</a> editor
<span id="L728" class="LineNr"> 728 </span>  <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L36'>prev</a>
<span id="L729" class="LineNr"> 729 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L730" class="LineNr"> 730 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">1/left-arrow</span>
<span id="L731" class="LineNr"> 731 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L732" class="LineNr"> 732 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L733" class="LineNr"> 733 </span>  <span class="Delimiter">}</span>
<span id="L734" class="LineNr"> 734 </span>]
<span id="L735" class="LineNr"> 735 </span>
<span id="L736" class="LineNr"> 736 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line [
<span id="L737" class="LineNr"> 737 </span>  <span class="Constant">local-scope</span>
<span id="L738" class="LineNr"> 738 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L739" class="LineNr"> 739 </span>  <span class="Comment"># initialize editor with two lines</span>
<span id="L740" class="LineNr"> 740 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L741" class="LineNr"> 741 </span><span class="Constant">d]</span>
<span id="L742" class="LineNr"> 742 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L743" class="LineNr"> 743 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L744" class="LineNr"> 744 </span>  $clear-trace
<span id="L745" class="LineNr"> 745 </span>  <span class="Comment"># position cursor at start of second line (so there's no previous newline)</span>
<span id="L746" class="LineNr"> 746 </span>  assume-console [
<span id="L747" class="LineNr"> 747 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L748" class="LineNr"> 748 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L749" class="LineNr"> 749 </span>  ]
<span id="L750" class="LineNr"> 750 </span>  run [
<span id="L751" class="LineNr"> 751 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L752" class="LineNr"> 752 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L753" class="LineNr"> 753 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L754" class="LineNr"> 754 </span>  ]
<span id="L755" class="LineNr"> 755 </span>  memory-should-contain [
<span id="L756" class="LineNr"> 756 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L757" class="LineNr"> 757 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L758" class="LineNr"> 758 </span>  ]
<span id="L759" class="LineNr"> 759 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L760" class="LineNr"> 760 </span>]
<span id="L761" class="LineNr"> 761 </span>
<span id="L762" class="LineNr"> 762 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-2 [
<span id="L763" class="LineNr"> 763 </span>  <span class="Constant">local-scope</span>
<span id="L764" class="LineNr"> 764 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L765" class="LineNr"> 765 </span>  <span class="Comment"># initialize editor with three lines</span>
<span id="L766" class="LineNr"> 766 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L767" class="LineNr"> 767 </span><span class="Constant">def</span>
<span id="L768" class="LineNr"> 768 </span><span class="Constant">g]</span>
<span id="L769" class="LineNr"> 769 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s:text, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L770" class="LineNr"> 770 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L771" class="LineNr"> 771 </span>  $clear-trace
<span id="L772" class="LineNr"> 772 </span>  <span class="Comment"># position cursor further down (so there's a newline before the character at</span>
<span id="L773" class="LineNr"> 773 </span>  <span class="Comment"># the cursor)</span>
<span id="L774" class="LineNr"> 774 </span>  assume-console [
<span id="L775" class="LineNr"> 775 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L776" class="LineNr"> 776 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L777" class="LineNr"> 777 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L778" class="LineNr"> 778 </span>  ]
<span id="L779" class="LineNr"> 779 </span>  run [
<span id="L780" class="LineNr"> 780 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L781" class="LineNr"> 781 </span>  ]
<span id="L782" class="LineNr"> 782 </span>  screen-should-contain [
<span id="L783" class="LineNr"> 783 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L784" class="LineNr"> 784 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc       .</span>
<span id="L785" class="LineNr"> 785 </span>  <span class="Conceal">¦</span><span class="Constant"> .def0      .</span>
<span id="L786" class="LineNr"> 786 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L787" class="LineNr"> 787 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L788" class="LineNr"> 788 </span>  ]
<span id="L789" class="LineNr"> 789 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># just the '0'</span>
<span id="L790" class="LineNr"> 790 </span>]
<span id="L791" class="LineNr"> 791 </span>
<span id="L792" class="LineNr"> 792 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-3 [
<span id="L793" class="LineNr"> 793 </span>  <span class="Constant">local-scope</span>
<span id="L794" class="LineNr"> 794 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L795" class="LineNr"> 795 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L796" class="LineNr"> 796 </span><span class="Constant">def</span>
<span id="L797" class="LineNr"> 797 </span><span class="Constant">g]</span>
<span id="L798" class="LineNr"> 798 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L799" class="LineNr"> 799 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L800" class="LineNr"> 800 </span>  $clear-trace
<span id="L801" class="LineNr"> 801 </span>  <span class="Comment"># position cursor at start of text, press left-arrow, then type a character</span>
<span id="L802" class="LineNr"> 802 </span>  assume-console [
<span id="L803" class="LineNr"> 803 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
<span id="L804" class="LineNr"> 804 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L805" class="LineNr"> 805 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L806" class="LineNr"> 806 </span>  ]
<span id="L807" class="LineNr"> 807 </span>  run [
<span id="L808" class="LineNr"> 808 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L809" class="LineNr"> 809 </span>  ]
<span id="L810" class="LineNr"> 810 </span>  <span class="Comment"># left-arrow should have had no effect</span>
<span id="L811" class="LineNr"> 811 </span>  screen-should-contain [
<span id="L812" class="LineNr"> 812 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L813" class="LineNr"> 813 </span>  <span class="Conceal">¦</span><span class="Constant"> .0abc      .</span>
<span id="L814" class="LineNr"> 814 </span>  <span class="Conceal">¦</span><span class="Constant"> .def       .</span>
<span id="L815" class="LineNr"> 815 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L816" class="LineNr"> 816 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L817" class="LineNr"> 817 </span>  ]
<span id="L818" class="LineNr"> 818 </span>  check-trace-count-for-label<span class="Constant"> 4</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># length of first line</span>
<span id="L819" class="LineNr"> 819 </span>]
<span id="L820" class="LineNr"> 820 </span>
<span id="L821" class="LineNr"> 821 </span><span class="muScenario">scenario</span> editor-moves-cursor-to-previous-line-with-left-arrow-at-start-of-line-4 [
<span id="L822" class="LineNr"> 822 </span>  <span class="Constant">local-scope</span>
<span id="L823" class="LineNr"> 823 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L824" class="LineNr"> 824 </span>  <span class="Comment"># initialize editor with text containing an empty line</span>
<span id="L825" class="LineNr"> 825 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L826" class="LineNr"> 826 </span>
<span id="L827" class="LineNr"> 827 </span>d]
<span id="L828" class="LineNr"> 828 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L829" class="LineNr"> 829 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e:&amp;:editor
<span id="L830" class="LineNr"> 830 </span>  $clear-trace
<span id="L831" class="LineNr"> 831 </span>  <span class="Comment"># position cursor right after empty line</span>
<span id="L832" class="LineNr"> 832 </span>  assume-console [
<span id="L833" class="LineNr"> 833 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L834" class="LineNr"> 834 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L835" class="LineNr"> 835 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L836" class="LineNr"> 836 </span>  ]
<span id="L837" class="LineNr"> 837 </span>  run [
<span id="L838" class="LineNr"> 838 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L839" class="LineNr"> 839 </span>  ]
<span id="L840" class="LineNr"> 840 </span>  screen-should-contain [
<span id="L841" class="LineNr"> 841 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L842" class="LineNr"> 842 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc       .</span>
<span id="L843" class="LineNr"> 843 </span>  <span class="Conceal">¦</span><span class="Constant"> .0         .</span>
<span id="L844" class="LineNr"> 844 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L845" class="LineNr"> 845 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L846" class="LineNr"> 846 </span>  ]
<span id="L847" class="LineNr"> 847 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>  <span class="Comment"># just the '0'</span>
<span id="L848" class="LineNr"> 848 </span>]
<span id="L849" class="LineNr"> 849 </span>
<span id="L850" class="LineNr"> 850 </span><span class="muScenario">scenario</span> editor-moves-across-screen-lines-across-wrap-with-left-arrow [
<span id="L851" class="LineNr"> 851 </span>  <span class="Constant">local-scope</span>
<span id="L852" class="LineNr"> 852 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L853" class="LineNr"> 853 </span>  <span class="Comment"># initialize editor with a wrapping line</span>
<span id="L854" class="LineNr"> 854 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abcdef]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L855" class="LineNr"> 855 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L856" class="LineNr"> 856 </span>  $clear-trace
<span id="L857" class="LineNr"> 857 </span>  screen-should-contain [
<span id="L858" class="LineNr"> 858 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L859" class="LineNr"> 859 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd↩     .</span>
<span id="L860" class="LineNr"> 860 </span>  <span class="Conceal">¦</span><span class="Constant"> .ef        .</span>
<span id="L861" class="LineNr"> 861 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L862" class="LineNr"> 862 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L863" class="LineNr"> 863 </span>  ]
<span id="L864" class="LineNr"> 864 </span>  <span class="Comment"># position cursor right after empty line</span>
<span id="L865" class="LineNr"> 865 </span>  assume-console [
<span id="L866" class="LineNr"> 866 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L867" class="LineNr"> 867 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L868" class="LineNr"> 868 </span>  ]
<span id="L869" class="LineNr"> 869 </span>  run [
<span id="L870" class="LineNr"> 870 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L871" class="LineNr"> 871 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L872" class="LineNr"> 872 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L873" class="LineNr"> 873 </span>  ]
<span id="L874" class="LineNr"> 874 </span>  memory-should-contain [
<span id="L875" class="LineNr"> 875 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># previous row</span>
<span id="L876" class="LineNr"> 876 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># right margin except wrap icon</span>
<span id="L877" class="LineNr"> 877 </span>  ]
<span id="L878" class="LineNr"> 878 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L879" class="LineNr"> 879 </span>]
<span id="L880" class="LineNr"> 880 </span>
<span id="L881" class="LineNr"> 881 </span><span class="muScenario">scenario</span> editor-moves-across-screen-lines-to-wrapping-line-with-left-arrow [
<span id="L882" class="LineNr"> 882 </span>  <span class="Constant">local-scope</span>
<span id="L883" class="LineNr"> 883 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L884" class="LineNr"> 884 </span>  <span class="Comment"># initialize editor with a wrapping line followed by a second line</span>
<span id="L885" class="LineNr"> 885 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
<span id="L886" class="LineNr"> 886 </span><span class="Constant">g]</span>
<span id="L887" class="LineNr"> 887 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L888" class="LineNr"> 888 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L889" class="LineNr"> 889 </span>  $clear-trace
<span id="L890" class="LineNr"> 890 </span>  screen-should-contain [
<span id="L891" class="LineNr"> 891 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L892" class="LineNr"> 892 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd↩     .</span>
<span id="L893" class="LineNr"> 893 </span>  <span class="Conceal">¦</span><span class="Constant"> .ef        .</span>
<span id="L894" class="LineNr"> 894 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L895" class="LineNr"> 895 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L896" class="LineNr"> 896 </span>  ]
<span id="L897" class="LineNr"> 897 </span>  <span class="Comment"># position cursor right after empty line</span>
<span id="L898" class="LineNr"> 898 </span>  assume-console [
<span id="L899" class="LineNr"> 899 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L900" class="LineNr"> 900 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L901" class="LineNr"> 901 </span>  ]
<span id="L902" class="LineNr"> 902 </span>  run [
<span id="L903" class="LineNr"> 903 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L904" class="LineNr"> 904 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L905" class="LineNr"> 905 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L906" class="LineNr"> 906 </span>  ]
<span id="L907" class="LineNr"> 907 </span>  memory-should-contain [
<span id="L908" class="LineNr"> 908 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># previous row</span>
<span id="L909" class="LineNr"> 909 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>  <span class="Comment"># end of wrapped line</span>
<span id="L910" class="LineNr"> 910 </span>  ]
<span id="L911" class="LineNr"> 911 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L912" class="LineNr"> 912 </span>]
<span id="L913" class="LineNr"> 913 </span>
<span id="L914" class="LineNr"> 914 </span><span class="muScenario">scenario</span> editor-moves-across-screen-lines-to-non-wrapping-line-with-left-arrow [
<span id="L915" class="LineNr"> 915 </span>  <span class="Constant">local-scope</span>
<span id="L916" class="LineNr"> 916 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L917" class="LineNr"> 917 </span>  <span class="Comment"># initialize editor with a line on the verge of wrapping, followed by a second line</span>
<span id="L918" class="LineNr"> 918 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcd</span>
<span id="L919" class="LineNr"> 919 </span><span class="Constant">e]</span>
<span id="L920" class="LineNr"> 920 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L921" class="LineNr"> 921 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L922" class="LineNr"> 922 </span>  $clear-trace
<span id="L923" class="LineNr"> 923 </span>  screen-should-contain [
<span id="L924" class="LineNr"> 924 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L925" class="LineNr"> 925 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd      .</span>
<span id="L926" class="LineNr"> 926 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L927" class="LineNr"> 927 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L928" class="LineNr"> 928 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L929" class="LineNr"> 929 </span>  ]
<span id="L930" class="LineNr"> 930 </span>  <span class="Comment"># position cursor right after empty line</span>
<span id="L931" class="LineNr"> 931 </span>  assume-console [
<span id="L932" class="LineNr"> 932 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L933" class="LineNr"> 933 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L934" class="LineNr"> 934 </span>  ]
<span id="L935" class="LineNr"> 935 </span>  run [
<span id="L936" class="LineNr"> 936 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L937" class="LineNr"> 937 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L938" class="LineNr"> 938 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L939" class="LineNr"> 939 </span>  ]
<span id="L940" class="LineNr"> 940 </span>  memory-should-contain [
<span id="L941" class="LineNr"> 941 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># previous row</span>
<span id="L942" class="LineNr"> 942 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>  <span class="Comment"># end of wrapped line</span>
<span id="L943" class="LineNr"> 943 </span>  ]
<span id="L944" class="LineNr"> 944 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L945" class="LineNr"> 945 </span>]
<span id="L946" class="LineNr"> 946 </span>
<span id="L947" class="LineNr"> 947 </span><span class="Comment"># todo: ctrl-left: previous word-start</span>
<span id="L948" class="LineNr"> 948 </span>
<span id="L949" class="LineNr"> 949 </span><span class="Comment"># up arrow</span>
<span id="L950" class="LineNr"> 950 </span>
<span id="L951" class="LineNr"> 951 </span><span class="muScenario">scenario</span> editor-moves-to-previous-line-with-up-arrow [
<span id="L952" class="LineNr"> 952 </span>  <span class="Constant">local-scope</span>
<span id="L953" class="LineNr"> 953 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L954" class="LineNr"> 954 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L955" class="LineNr"> 955 </span><span class="Constant">def]</span>
<span id="L956" class="LineNr"> 956 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L957" class="LineNr"> 957 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L958" class="LineNr"> 958 </span>  $clear-trace
<span id="L959" class="LineNr"> 959 </span>  assume-console [
<span id="L960" class="LineNr"> 960 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L961" class="LineNr"> 961 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L962" class="LineNr"> 962 </span>  ]
<span id="L963" class="LineNr"> 963 </span>  run [
<span id="L964" class="LineNr"> 964 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L965" class="LineNr"> 965 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L966" class="LineNr"> 966 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L967" class="LineNr"> 967 </span>  ]
<span id="L968" class="LineNr"> 968 </span>  memory-should-contain [
<span id="L969" class="LineNr"> 969 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L970" class="LineNr"> 970 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L971" class="LineNr"> 971 </span>  ]
<span id="L972" class="LineNr"> 972 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L973" class="LineNr"> 973 </span>  assume-console [
<span id="L974" class="LineNr"> 974 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L975" class="LineNr"> 975 </span>  ]
<span id="L976" class="LineNr"> 976 </span>  run [
<span id="L977" class="LineNr"> 977 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L978" class="LineNr"> 978 </span>  ]
<span id="L979" class="LineNr"> 979 </span>  screen-should-contain [
<span id="L980" class="LineNr"> 980 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L981" class="LineNr"> 981 </span>  <span class="Conceal">¦</span><span class="Constant"> .a0bc      .</span>
<span id="L982" class="LineNr"> 982 </span>  <span class="Conceal">¦</span><span class="Constant"> .def       .</span>
<span id="L983" class="LineNr"> 983 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L984" class="LineNr"> 984 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L985" class="LineNr"> 985 </span>  ]
<span id="L986" class="LineNr"> 986 </span>]
<span id="L987" class="LineNr"> 987 </span>
<span id="L988" class="LineNr"> 988 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L989" class="LineNr"> 989 </span>  <span class="Delimiter">{</span>
<span id="L990" class="LineNr"> 990 </span>  <span class="Conceal">¦</span> move-to-previous-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65517/up-arrow</span>
<span id="L991" class="LineNr"> 991 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-to-previous-line?
<span id="L992" class="LineNr"> 992 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L993" class="LineNr"> 993 </span>  <span class="Conceal">¦</span> go-render? <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L1000'>move-to-previous-line</a> editor
<span id="L994" class="LineNr"> 994 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">3/up-arrow</span>
<span id="L995" class="LineNr"> 995 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L996" class="LineNr"> 996 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L997" class="LineNr"> 997 </span>  <span class="Delimiter">}</span>
<span id="L998" class="LineNr"> 998 </span>]
<span id="L999" class="LineNr"> 999 </span>
<span id="L1000" class="LineNr">1000 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1000'>move-to-previous-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
<span id="L1001" class="LineNr">1001 </span>  <span class="Constant">local-scope</span>
<span id="L1002" class="LineNr">1002 </span>  <span class="Constant">load-ingredients</span>
<span id="L1003" class="LineNr">1003 </span>  go-render?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
<span id="L1004" class="LineNr">1004 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L1005" class="LineNr">1005 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L1006" class="LineNr">1006 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L1007" class="LineNr">1007 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L1008" class="LineNr">1008 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L1009" class="LineNr">1009 </span>  already-at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal cursor-row, <span class="Constant">1/top</span>
<span id="L1010" class="LineNr">1010 </span>  <span class="Delimiter">{</span>
<span id="L1011" class="LineNr">1011 </span>  <span class="Conceal">¦</span> <span class="Comment"># if cursor not at top, move it</span>
<span id="L1012" class="LineNr">1012 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> already-at-top?
<span id="L1013" class="LineNr">1013 </span>  <span class="Conceal">¦</span> <span class="Comment"># if not at start of screen line, move to start of screen line (previous newline)</span>
<span id="L1014" class="LineNr">1014 </span>  <span class="Conceal">¦</span> <span class="Comment"># then scan back another line</span>
<span id="L1015" class="LineNr">1015 </span>  <span class="Conceal">¦</span> <span class="Comment"># if either step fails, give up without modifying cursor or coordinates</span>
<span id="L1016" class="LineNr">1016 </span>  <span class="Conceal">¦</span> curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy before-cursor
<span id="L1017" class="LineNr">1017 </span>  <span class="Conceal">¦</span> old:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy curr
<span id="L1018" class="LineNr">1018 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1019" class="LineNr">1019 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-left?:bool <span class="Special">&lt;-</span> equal cursor-column, left
<span id="L1020" class="LineNr">1020 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-left?
<span id="L1021" class="LineNr">1021 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3175'>before-previous-screen-line</a> curr, editor
<span id="L1022" class="LineNr">1022 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> no-motion?:bool <span class="Special">&lt;-</span> equal curr, old
<span id="L1023" class="LineNr">1023 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">return-if</span> no-motion?
<span id="L1024" class="LineNr">1024 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1025" class="LineNr">1025 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1026" class="LineNr">1026 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3175'>before-previous-screen-line</a> curr, editor
<span id="L1027" class="LineNr">1027 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> no-motion?:bool <span class="Special">&lt;-</span> equal curr, old
<span id="L1028" class="LineNr">1028 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">return-if</span> no-motion?
<span id="L1029" class="LineNr">1029 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1030" class="LineNr">1030 </span>  <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy curr
<span id="L1031" class="LineNr">1031 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L1032" class="LineNr">1032 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>
<span id="L1033" class="LineNr">1033 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L1034" class="LineNr">1034 </span>  <span class="Conceal">¦</span> <span class="Comment"># scan ahead to right column or until end of line</span>
<span id="L1035" class="LineNr">1035 </span>  <span class="Conceal">¦</span> target-column:num <span class="Special">&lt;-</span> copy cursor-column
<span id="L1036" class="LineNr">1036 </span>  <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> copy left
<span id="L1037" class="LineNr">1037 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L1038" class="LineNr">1038 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1039" class="LineNr">1039 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, target-column
<span id="L1040" class="LineNr">1040 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L1041" class="LineNr">1041 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L1042" class="LineNr">1042 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
<span id="L1043" class="LineNr">1043 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L1044" class="LineNr">1044 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal currc, <span class="Constant">10/newline</span>
<span id="L1045" class="LineNr">1045 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline?
<span id="L1046" class="LineNr">1046 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment">#</span>
<span id="L1047" class="LineNr">1047 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy curr
<span id="L1048" class="LineNr">1048 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L1049" class="LineNr">1049 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L1050" class="LineNr">1050 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L1051" class="LineNr">1051 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L1052" class="LineNr">1052 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1053" class="LineNr">1053 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L1054" class="LineNr">1054 </span>  <span class="Delimiter">}</span>
<span id="L1055" class="LineNr">1055 </span>  <span class="Delimiter">{</span>
<span id="L1056" class="LineNr">1056 </span>  <span class="Conceal">¦</span> <span class="Comment"># if cursor already at top, scroll up</span>
<span id="L1057" class="LineNr">1057 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> already-at-top?
<span id="L1058" class="LineNr">1058 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;scroll-up&gt;</span>
<span id="L1059" class="LineNr">1059 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">1/go-render</span>
<span id="L1060" class="LineNr">1060 </span>  <span class="Delimiter">}</span>
<span id="L1061" class="LineNr">1061 </span>]
<span id="L1062" class="LineNr">1062 </span>
<span id="L1063" class="LineNr">1063 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-previous-line [
<span id="L1064" class="LineNr">1064 </span>  <span class="Constant">local-scope</span>
<span id="L1065" class="LineNr">1065 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1066" class="LineNr">1066 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
<span id="L1067" class="LineNr">1067 </span><span class="Constant">def]</span>
<span id="L1068" class="LineNr">1068 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1069" class="LineNr">1069 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1070" class="LineNr">1070 </span>  $clear-trace
<span id="L1071" class="LineNr">1071 </span>  assume-console [
<span id="L1072" class="LineNr">1072 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L1073" class="LineNr">1073 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L1074" class="LineNr">1074 </span>  ]
<span id="L1075" class="LineNr">1075 </span>  run [
<span id="L1076" class="LineNr">1076 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1077" class="LineNr">1077 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1078" class="LineNr">1078 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1079" class="LineNr">1079 </span>  ]
<span id="L1080" class="LineNr">1080 </span>  memory-should-contain [
<span id="L1081" class="LineNr">1081 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1082" class="LineNr">1082 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1083" class="LineNr">1083 </span>  ]
<span id="L1084" class="LineNr">1084 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1085" class="LineNr">1085 </span>  assume-console [
<span id="L1086" class="LineNr">1086 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L1087" class="LineNr">1087 </span>  ]
<span id="L1088" class="LineNr">1088 </span>  run [
<span id="L1089" class="LineNr">1089 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1090" class="LineNr">1090 </span>  ]
<span id="L1091" class="LineNr">1091 </span>  screen-should-contain [
<span id="L1092" class="LineNr">1092 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1093" class="LineNr">1093 </span>  <span class="Conceal">¦</span><span class="Constant"> .ab0       .</span>
<span id="L1094" class="LineNr">1094 </span>  <span class="Conceal">¦</span><span class="Constant"> .def       .</span>
<span id="L1095" class="LineNr">1095 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1096" class="LineNr">1096 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1097" class="LineNr">1097 </span>  ]
<span id="L1098" class="LineNr">1098 </span>]
<span id="L1099" class="LineNr">1099 </span>
<span id="L1100" class="LineNr">1100 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-empty-line [
<span id="L1101" class="LineNr">1101 </span>  <span class="Constant">local-scope</span>
<span id="L1102" class="LineNr">1102 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1103" class="LineNr">1103 </span>  s:text <span class="Special">&lt;-</span> new [
<span id="L1104" class="LineNr">1104 </span><span class="muRecipe">def</span>]
<span id="L1105" class="LineNr">1105 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1106" class="LineNr">1106 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1107" class="LineNr">1107 </span>  $clear-trace
<span id="L1108" class="LineNr">1108 </span>  assume-console [
<span id="L1109" class="LineNr">1109 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L1110" class="LineNr">1110 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L1111" class="LineNr">1111 </span>  ]
<span id="L1112" class="LineNr">1112 </span>  run [
<span id="L1113" class="LineNr">1113 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1114" class="LineNr">1114 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1115" class="LineNr">1115 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1116" class="LineNr">1116 </span>  ]
<span id="L1117" class="LineNr">1117 </span>  memory-should-contain [
<span id="L1118" class="LineNr">1118 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1119" class="LineNr">1119 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1120" class="LineNr">1120 </span>  ]
<span id="L1121" class="LineNr">1121 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1122" class="LineNr">1122 </span>  assume-console [
<span id="L1123" class="LineNr">1123 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L1124" class="LineNr">1124 </span>  ]
<span id="L1125" class="LineNr">1125 </span>  run [
<span id="L1126" class="LineNr">1126 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1127" class="LineNr">1127 </span>  ]
<span id="L1128" class="LineNr">1128 </span>  screen-should-contain [
<span id="L1129" class="LineNr">1129 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1130" class="LineNr">1130 </span>  <span class="Conceal">¦</span><span class="Constant"> .0         .</span>
<span id="L1131" class="LineNr">1131 </span>  <span class="Conceal">¦</span><span class="Constant"> .def       .</span>
<span id="L1132" class="LineNr">1132 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1133" class="LineNr">1133 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1134" class="LineNr">1134 </span>  ]
<span id="L1135" class="LineNr">1135 </span>]
<span id="L1136" class="LineNr">1136 </span>
<span id="L1137" class="LineNr">1137 </span><span class="muScenario">scenario</span> editor-moves-to-previous-line-from-zero-margin [
<span id="L1138" class="LineNr">1138 </span>  <span class="Constant">local-scope</span>
<span id="L1139" class="LineNr">1139 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1140" class="LineNr">1140 </span>  <span class="Comment"># start out with three lines</span>
<span id="L1141" class="LineNr">1141 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L1142" class="LineNr">1142 </span><span class="Constant">def</span>
<span id="L1143" class="LineNr">1143 </span><span class="Constant">ghi]</span>
<span id="L1144" class="LineNr">1144 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1145" class="LineNr">1145 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1146" class="LineNr">1146 </span>  $clear-trace
<span id="L1147" class="LineNr">1147 </span>  <span class="Comment"># click on the third line and hit up-arrow, so you end up just after a newline</span>
<span id="L1148" class="LineNr">1148 </span>  assume-console [
<span id="L1149" class="LineNr">1149 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L1150" class="LineNr">1150 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L1151" class="LineNr">1151 </span>  ]
<span id="L1152" class="LineNr">1152 </span>  run [
<span id="L1153" class="LineNr">1153 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1154" class="LineNr">1154 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1155" class="LineNr">1155 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1156" class="LineNr">1156 </span>  ]
<span id="L1157" class="LineNr">1157 </span>  memory-should-contain [
<span id="L1158" class="LineNr">1158 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1159" class="LineNr">1159 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1160" class="LineNr">1160 </span>  ]
<span id="L1161" class="LineNr">1161 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1162" class="LineNr">1162 </span>  assume-console [
<span id="L1163" class="LineNr">1163 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L1164" class="LineNr">1164 </span>  ]
<span id="L1165" class="LineNr">1165 </span>  run [
<span id="L1166" class="LineNr">1166 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1167" class="LineNr">1167 </span>  ]
<span id="L1168" class="LineNr">1168 </span>  screen-should-contain [
<span id="L1169" class="LineNr">1169 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1170" class="LineNr">1170 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc       .</span>
<span id="L1171" class="LineNr">1171 </span>  <span class="Conceal">¦</span><span class="Constant"> .0def      .</span>
<span id="L1172" class="LineNr">1172 </span>  <span class="Conceal">¦</span><span class="Constant"> .ghi       .</span>
<span id="L1173" class="LineNr">1173 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1174" class="LineNr">1174 </span>  ]
<span id="L1175" class="LineNr">1175 </span>]
<span id="L1176" class="LineNr">1176 </span>
<span id="L1177" class="LineNr">1177 </span><span class="muScenario">scenario</span> editor-moves-to-previous-line-from-left-margin [
<span id="L1178" class="LineNr">1178 </span>  <span class="Constant">local-scope</span>
<span id="L1179" class="LineNr">1179 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1180" class="LineNr">1180 </span>  <span class="Comment"># start out with three lines</span>
<span id="L1181" class="LineNr">1181 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L1182" class="LineNr">1182 </span><span class="Constant">def</span>
<span id="L1183" class="LineNr">1183 </span><span class="Constant">ghi]</span>
<span id="L1184" class="LineNr">1184 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">1/left</span>, <span class="Constant">10/right</span>
<span id="L1185" class="LineNr">1185 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1186" class="LineNr">1186 </span>  $clear-trace
<span id="L1187" class="LineNr">1187 </span>  <span class="Comment"># click on the third line and hit up-arrow, so you end up just after a newline</span>
<span id="L1188" class="LineNr">1188 </span>  assume-console [
<span id="L1189" class="LineNr">1189 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
<span id="L1190" class="LineNr">1190 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L1191" class="LineNr">1191 </span>  ]
<span id="L1192" class="LineNr">1192 </span>  run [
<span id="L1193" class="LineNr">1193 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1194" class="LineNr">1194 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1195" class="LineNr">1195 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1196" class="LineNr">1196 </span>  ]
<span id="L1197" class="LineNr">1197 </span>  memory-should-contain [
<span id="L1198" class="LineNr">1198 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1199" class="LineNr">1199 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1200" class="LineNr">1200 </span>  ]
<span id="L1201" class="LineNr">1201 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1202" class="LineNr">1202 </span>  assume-console [
<span id="L1203" class="LineNr">1203 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L1204" class="LineNr">1204 </span>  ]
<span id="L1205" class="LineNr">1205 </span>  run [
<span id="L1206" class="LineNr">1206 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1207" class="LineNr">1207 </span>  ]
<span id="L1208" class="LineNr">1208 </span>  screen-should-contain [
<span id="L1209" class="LineNr">1209 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1210" class="LineNr">1210 </span>  <span class="Conceal">¦</span><span class="Constant"> . abc      .</span>
<span id="L1211" class="LineNr">1211 </span>  <span class="Conceal">¦</span><span class="Constant"> . 0def     .</span>
<span id="L1212" class="LineNr">1212 </span>  <span class="Conceal">¦</span><span class="Constant"> . ghi      .</span>
<span id="L1213" class="LineNr">1213 </span>  <span class="Conceal">¦</span><span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span>
<span id="L1214" class="LineNr">1214 </span>  ]
<span id="L1215" class="LineNr">1215 </span>]
<span id="L1216" class="LineNr">1216 </span>
<span id="L1217" class="LineNr">1217 </span><span class="muScenario">scenario</span> editor-moves-to-top-line-in-presence-of-wrapped-line [
<span id="L1218" class="LineNr">1218 </span>  <span class="Constant">local-scope</span>
<span id="L1219" class="LineNr">1219 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1220" class="LineNr">1220 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L1221" class="LineNr">1221 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1222" class="LineNr">1222 </span>  screen-should-contain [
<span id="L1223" class="LineNr">1223 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1224" class="LineNr">1224 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd↩     .</span>
<span id="L1225" class="LineNr">1225 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L1226" class="LineNr">1226 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1227" class="LineNr">1227 </span>  ]
<span id="L1228" class="LineNr">1228 </span>  $clear-trace
<span id="L1229" class="LineNr">1229 </span>  assume-console [
<span id="L1230" class="LineNr">1230 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L1231" class="LineNr">1231 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L1232" class="LineNr">1232 </span>  ]
<span id="L1233" class="LineNr">1233 </span>  run [
<span id="L1234" class="LineNr">1234 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1235" class="LineNr">1235 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1236" class="LineNr">1236 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1237" class="LineNr">1237 </span>  ]
<span id="L1238" class="LineNr">1238 </span>  memory-should-contain [
<span id="L1239" class="LineNr">1239 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1240" class="LineNr">1240 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1241" class="LineNr">1241 </span>  ]
<span id="L1242" class="LineNr">1242 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1243" class="LineNr">1243 </span>  assume-console [
<span id="L1244" class="LineNr">1244 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L1245" class="LineNr">1245 </span>  ]
<span id="L1246" class="LineNr">1246 </span>  run [
<span id="L1247" class="LineNr">1247 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1248" class="LineNr">1248 </span>  ]
<span id="L1249" class="LineNr">1249 </span>  screen-should-contain [
<span id="L1250" class="LineNr">1250 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1251" class="LineNr">1251 </span>  <span class="Conceal">¦</span><span class="Constant"> .0abc↩     .</span>
<span id="L1252" class="LineNr">1252 </span>  <span class="Conceal">¦</span><span class="Constant"> .de        .</span>
<span id="L1253" class="LineNr">1253 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1254" class="LineNr">1254 </span>  ]
<span id="L1255" class="LineNr">1255 </span>]
<span id="L1256" class="LineNr">1256 </span>
<span id="L1257" class="LineNr">1257 </span><span class="muScenario">scenario</span> editor-moves-to-top-line-in-presence-of-wrapped-line-2 [
<span id="L1258" class="LineNr">1258 </span>  <span class="Constant">local-scope</span>
<span id="L1259" class="LineNr">1259 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1260" class="LineNr">1260 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L1261" class="LineNr">1261 </span><span class="Constant">defgh]</span>
<span id="L1262" class="LineNr">1262 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L1263" class="LineNr">1263 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1264" class="LineNr">1264 </span>  screen-should-contain [
<span id="L1265" class="LineNr">1265 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1266" class="LineNr">1266 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc       .</span>
<span id="L1267" class="LineNr">1267 </span>  <span class="Conceal">¦</span><span class="Constant"> .defg↩     .</span>
<span id="L1268" class="LineNr">1268 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L1269" class="LineNr">1269 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1270" class="LineNr">1270 </span>  ]
<span id="L1271" class="LineNr">1271 </span>  $clear-trace
<span id="L1272" class="LineNr">1272 </span>  assume-console [
<span id="L1273" class="LineNr">1273 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L1274" class="LineNr">1274 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L1275" class="LineNr">1275 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L1276" class="LineNr">1276 </span>  ]
<span id="L1277" class="LineNr">1277 </span>  run [
<span id="L1278" class="LineNr">1278 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1279" class="LineNr">1279 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1280" class="LineNr">1280 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1281" class="LineNr">1281 </span>  ]
<span id="L1282" class="LineNr">1282 </span>  memory-should-contain [
<span id="L1283" class="LineNr">1283 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1284" class="LineNr">1284 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1285" class="LineNr">1285 </span>  ]
<span id="L1286" class="LineNr">1286 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1287" class="LineNr">1287 </span>  assume-console [
<span id="L1288" class="LineNr">1288 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L1289" class="LineNr">1289 </span>  ]
<span id="L1290" class="LineNr">1290 </span>  run [
<span id="L1291" class="LineNr">1291 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1292" class="LineNr">1292 </span>  ]
<span id="L1293" class="LineNr">1293 </span>  screen-should-contain [
<span id="L1294" class="LineNr">1294 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1295" class="LineNr">1295 </span>  <span class="Conceal">¦</span><span class="Constant"> .0abc      .</span>
<span id="L1296" class="LineNr">1296 </span>  <span class="Conceal">¦</span><span class="Constant"> .defg↩     .</span>
<span id="L1297" class="LineNr">1297 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L1298" class="LineNr">1298 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1299" class="LineNr">1299 </span>  ]
<span id="L1300" class="LineNr">1300 </span>]
<span id="L1301" class="LineNr">1301 </span>
<span id="L1302" class="LineNr">1302 </span><span class="Comment"># down arrow</span>
<span id="L1303" class="LineNr">1303 </span>
<span id="L1304" class="LineNr">1304 </span><span class="muScenario">scenario</span> editor-moves-to-next-line-with-down-arrow [
<span id="L1305" class="LineNr">1305 </span>  <span class="Constant">local-scope</span>
<span id="L1306" class="LineNr">1306 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1307" class="LineNr">1307 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L1308" class="LineNr">1308 </span><span class="Constant">def]</span>
<span id="L1309" class="LineNr">1309 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1310" class="LineNr">1310 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1311" class="LineNr">1311 </span>  $clear-trace
<span id="L1312" class="LineNr">1312 </span>  <span class="Comment"># cursor starts out at (1, 0)</span>
<span id="L1313" class="LineNr">1313 </span>  assume-console [
<span id="L1314" class="LineNr">1314 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L1315" class="LineNr">1315 </span>  ]
<span id="L1316" class="LineNr">1316 </span>  run [
<span id="L1317" class="LineNr">1317 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1318" class="LineNr">1318 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1319" class="LineNr">1319 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1320" class="LineNr">1320 </span>  ]
<span id="L1321" class="LineNr">1321 </span>  <span class="Comment"># ..and ends at (2, 0)</span>
<span id="L1322" class="LineNr">1322 </span>  memory-should-contain [
<span id="L1323" class="LineNr">1323 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1324" class="LineNr">1324 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1325" class="LineNr">1325 </span>  ]
<span id="L1326" class="LineNr">1326 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1327" class="LineNr">1327 </span>  assume-console [
<span id="L1328" class="LineNr">1328 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L1329" class="LineNr">1329 </span>  ]
<span id="L1330" class="LineNr">1330 </span>  run [
<span id="L1331" class="LineNr">1331 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1332" class="LineNr">1332 </span>  ]
<span id="L1333" class="LineNr">1333 </span>  screen-should-contain [
<span id="L1334" class="LineNr">1334 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1335" class="LineNr">1335 </span>  <span class="Conceal">¦</span><span class="Constant"> .abc       .</span>
<span id="L1336" class="LineNr">1336 </span>  <span class="Conceal">¦</span><span class="Constant"> .0def      .</span>
<span id="L1337" class="LineNr">1337 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1338" class="LineNr">1338 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1339" class="LineNr">1339 </span>  ]
<span id="L1340" class="LineNr">1340 </span>]
<span id="L1341" class="LineNr">1341 </span>
<span id="L1342" class="LineNr">1342 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L1343" class="LineNr">1343 </span>  <span class="Delimiter">{</span>
<span id="L1344" class="LineNr">1344 </span>  <span class="Conceal">¦</span> move-to-next-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65516/down-arrow</span>
<span id="L1345" class="LineNr">1345 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-to-next-line?
<span id="L1346" class="LineNr">1346 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L1347" class="LineNr">1347 </span>  <span class="Conceal">¦</span> go-render? <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L1354'>move-to-next-line</a> editor, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L1348" class="LineNr">1348 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">4/down-arrow</span>
<span id="L1349" class="LineNr">1349 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L1350" class="LineNr">1350 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L1351" class="LineNr">1351 </span>  <span class="Delimiter">}</span>
<span id="L1352" class="LineNr">1352 </span>]
<span id="L1353" class="LineNr">1353 </span>
<span id="L1354" class="LineNr">1354 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1354'>move-to-next-line</a> editor:&amp;:editor, <a href='../081print.mu.html#L782'>screen-height</a>:num<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
<span id="L1355" class="LineNr">1355 </span>  <span class="Constant">local-scope</span>
<span id="L1356" class="LineNr">1356 </span>  <span class="Constant">load-ingredients</span>
<span id="L1357" class="LineNr">1357 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L1358" class="LineNr">1358 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L1359" class="LineNr">1359 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L1360" class="LineNr">1360 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L1361" class="LineNr">1361 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L1362" class="LineNr">1362 </span>  last-line:num <span class="Special">&lt;-</span> subtract <a href='../081print.mu.html#L782'>screen-height</a>,<span class="Constant"> 1</span>
<span id="L1363" class="LineNr">1363 </span>  bottom:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">bottom:offset</span>
<span id="L1364" class="LineNr">1364 </span>  at-bottom-of-screen?:bool <span class="Special">&lt;-</span> greater-or-equal bottom, last-line
<span id="L1365" class="LineNr">1365 </span>  <span class="Delimiter">{</span>
<span id="L1366" class="LineNr">1366 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> before-cursor
<span id="L1367" class="LineNr">1367 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1368" class="LineNr">1368 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-bottom-of-screen?
<span id="L1369" class="LineNr">1369 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
<span id="L1370" class="LineNr">1370 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1371" class="LineNr">1371 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1372" class="LineNr">1372 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-bottom-of-screen?
<span id="L1373" class="LineNr">1373 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">jump</span> <span class="Constant">+try-to-scroll</span>
<span id="L1374" class="LineNr">1374 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1375" class="LineNr">1375 </span>  <span class="Delimiter">}</span>
<span id="L1376" class="LineNr">1376 </span>  <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L1377" class="LineNr">1377 </span>  <span class="Delimiter">{</span>
<span id="L1378" class="LineNr">1378 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L1379" class="LineNr">1379 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1380" class="LineNr">1380 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-bottom-of-screen?
<span id="L1381" class="LineNr">1381 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
<span id="L1382" class="LineNr">1382 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1383" class="LineNr">1383 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1384" class="LineNr">1384 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-bottom-of-screen?
<span id="L1385" class="LineNr">1385 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">jump</span> <span class="Constant">+try-to-scroll</span>
<span id="L1386" class="LineNr">1386 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1387" class="LineNr">1387 </span>  <span class="Delimiter">}</span>
<span id="L1388" class="LineNr">1388 </span>  already-at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, last-line
<span id="L1389" class="LineNr">1389 </span>  <span class="Delimiter">{</span>
<span id="L1390" class="LineNr">1390 </span>  <span class="Conceal">¦</span> <span class="Comment"># if cursor not at bottom, move it</span>
<span id="L1391" class="LineNr">1391 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> already-at-bottom?
<span id="L1392" class="LineNr">1392 </span>  <span class="Conceal">¦</span> target-column:num <span class="Special">&lt;-</span> copy cursor-column
<span id="L1393" class="LineNr">1393 </span>  <span class="Conceal">¦</span> <span class="Comment"># scan to start of next line</span>
<span id="L1394" class="LineNr">1394 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1395" class="LineNr">1395 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L1396" class="LineNr">1396 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L1397" class="LineNr">1397 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, right
<span id="L1398" class="LineNr">1398 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L1399" class="LineNr">1399 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L1400" class="LineNr">1400 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L1401" class="LineNr">1401 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
<span id="L1402" class="LineNr">1402 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L1403" class="LineNr">1403 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline?
<span id="L1404" class="LineNr">1404 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L1405" class="LineNr">1405 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1406" class="LineNr">1406 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1407" class="LineNr">1407 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L1408" class="LineNr">1408 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1409" class="LineNr">1409 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-bottom-of-screen?
<span id="L1410" class="LineNr">1410 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
<span id="L1411" class="LineNr">1411 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1412" class="LineNr">1412 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1413" class="LineNr">1413 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-bottom-of-screen?
<span id="L1414" class="LineNr">1414 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">jump</span> <span class="Constant">+try-to-scroll</span>
<span id="L1415" class="LineNr">1415 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1416" class="LineNr">1416 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1417" class="LineNr">1417 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
<span id="L1418" class="LineNr">1418 </span>  <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> copy left
<span id="L1419" class="LineNr">1419 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L1420" class="LineNr">1420 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L1421" class="LineNr">1421 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L1422" class="LineNr">1422 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
<span id="L1423" class="LineNr">1423 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L1424" class="LineNr">1424 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline?
<span id="L1425" class="LineNr">1425 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, target-column
<span id="L1426" class="LineNr">1426 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L1427" class="LineNr">1427 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L1428" class="LineNr">1428 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L1429" class="LineNr">1429 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L1430" class="LineNr">1430 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L1431" class="LineNr">1431 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L1432" class="LineNr">1432 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L1433" class="LineNr">1433 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L1434" class="LineNr">1434 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
<span id="L1435" class="LineNr">1435 </span>  <span class="Delimiter">}</span>
<span id="L1436" class="LineNr">1436 </span><span class="Constant">  +try-to-scroll</span>
<span id="L1437" class="LineNr">1437 </span><span class="Constant">  &lt;scroll-down&gt;</span>
<span id="L1438" class="LineNr">1438 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
<span id="L1439" class="LineNr">1439 </span>]
<span id="L1440" class="LineNr">1440 </span>
<span id="L1441" class="LineNr">1441 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-next-line [
<span id="L1442" class="LineNr">1442 </span>  <span class="Constant">local-scope</span>
<span id="L1443" class="LineNr">1443 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1444" class="LineNr">1444 </span>  <span class="Comment"># second line is shorter than first</span>
<span id="L1445" class="LineNr">1445 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcde</span>
<span id="L1446" class="LineNr">1446 </span><span class="Constant">fg</span>
<span id="L1447" class="LineNr">1447 </span><span class="Constant">hi]</span>
<span id="L1448" class="LineNr">1448 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1449" class="LineNr">1449 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1450" class="LineNr">1450 </span>  $clear-trace
<span id="L1451" class="LineNr">1451 </span>  <span class="Comment"># move to end of first line, then press down</span>
<span id="L1452" class="LineNr">1452 </span>  assume-console [
<span id="L1453" class="LineNr">1453 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 8</span>
<span id="L1454" class="LineNr">1454 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L1455" class="LineNr">1455 </span>  ]
<span id="L1456" class="LineNr">1456 </span>  run [
<span id="L1457" class="LineNr">1457 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1458" class="LineNr">1458 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1459" class="LineNr">1459 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1460" class="LineNr">1460 </span>  ]
<span id="L1461" class="LineNr">1461 </span>  <span class="Comment"># cursor doesn't go vertically down, it goes to end of shorter line</span>
<span id="L1462" class="LineNr">1462 </span>  memory-should-contain [
<span id="L1463" class="LineNr">1463 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1464" class="LineNr">1464 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1465" class="LineNr">1465 </span>  ]
<span id="L1466" class="LineNr">1466 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1467" class="LineNr">1467 </span>  assume-console [
<span id="L1468" class="LineNr">1468 </span>  <span class="Conceal">¦</span> type <span class="Constant">[0]</span>
<span id="L1469" class="LineNr">1469 </span>  ]
<span id="L1470" class="LineNr">1470 </span>  run [
<span id="L1471" class="LineNr">1471 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1472" class="LineNr">1472 </span>  ]
<span id="L1473" class="LineNr">1473 </span>  screen-should-contain [
<span id="L1474" class="LineNr">1474 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1475" class="LineNr">1475 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcde     .</span>
<span id="L1476" class="LineNr">1476 </span>  <span class="Conceal">¦</span><span class="Constant"> .fg0       .</span>
<span id="L1477" class="LineNr">1477 </span>  <span class="Conceal">¦</span><span class="Constant"> .hi        .</span>
<span id="L1478" class="LineNr">1478 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1479" class="LineNr">1479 </span>  ]
<span id="L1480" class="LineNr">1480 </span>]
<span id="L1481" class="LineNr">1481 </span>
<span id="L1482" class="LineNr">1482 </span><span class="muScenario">scenario</span> editor-moves-down-within-wrapped-line [
<span id="L1483" class="LineNr">1483 </span>  <span class="Constant">local-scope</span>
<span id="L1484" class="LineNr">1484 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1485" class="LineNr">1485 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abcdefghijklmno]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1486" class="LineNr">1486 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1487" class="LineNr">1487 </span>  screen-should-contain [
<span id="L1488" class="LineNr">1488 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1489" class="LineNr">1489 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .abcdefghi↩.</span>
<span id="L1490" class="LineNr">1490 </span>  <span class="Conceal">¦</span><span class="Constant"> .jklmno    .</span>
<span id="L1491" class="LineNr">1491 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1492" class="LineNr">1492 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1493" class="LineNr">1493 </span>  ]
<span id="L1494" class="LineNr">1494 </span>  <span class="Comment"># position cursor on first screen line, but past end of second screen line</span>
<span id="L1495" class="LineNr">1495 </span>  assume-console [
<span id="L1496" class="LineNr">1496 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 8</span>
<span id="L1497" class="LineNr">1497 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L1498" class="LineNr">1498 </span>  ]
<span id="L1499" class="LineNr">1499 </span>  run [
<span id="L1500" class="LineNr">1500 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1501" class="LineNr">1501 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1502" class="LineNr">1502 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1503" class="LineNr">1503 </span>  ]
<span id="L1504" class="LineNr">1504 </span>  <span class="Comment"># cursor should be at end of second screen line</span>
<span id="L1505" class="LineNr">1505 </span>  memory-should-contain [
<span id="L1506" class="LineNr">1506 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1507" class="LineNr">1507 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>
<span id="L1508" class="LineNr">1508 </span>  ]
<span id="L1509" class="LineNr">1509 </span>]
<span id="L1510" class="LineNr">1510 </span>
<span id="L1511" class="LineNr">1511 </span><span class="Comment"># ctrl-a/home - move cursor to start of line</span>
<span id="L1512" class="LineNr">1512 </span>
<span id="L1513" class="LineNr">1513 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-ctrl-a [
<span id="L1514" class="LineNr">1514 </span>  <span class="Constant">local-scope</span>
<span id="L1515" class="LineNr">1515 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1516" class="LineNr">1516 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1517" class="LineNr">1517 </span><span class="Constant">456]</span>
<span id="L1518" class="LineNr">1518 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1519" class="LineNr">1519 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1520" class="LineNr">1520 </span>  $clear-trace
<span id="L1521" class="LineNr">1521 </span>  <span class="Comment"># start on second line, press ctrl-a</span>
<span id="L1522" class="LineNr">1522 </span>  assume-console [
<span id="L1523" class="LineNr">1523 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L1524" class="LineNr">1524 </span>  <span class="Conceal">¦</span> press ctrl-a
<span id="L1525" class="LineNr">1525 </span>  ]
<span id="L1526" class="LineNr">1526 </span>  run [
<span id="L1527" class="LineNr">1527 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1528" class="LineNr">1528 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1529" class="LineNr">1529 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1530" class="LineNr">1530 </span>  ]
<span id="L1531" class="LineNr">1531 </span>  <span class="Comment"># cursor moves to start of line</span>
<span id="L1532" class="LineNr">1532 </span>  memory-should-contain [
<span id="L1533" class="LineNr">1533 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1534" class="LineNr">1534 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1535" class="LineNr">1535 </span>  ]
<span id="L1536" class="LineNr">1536 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1537" class="LineNr">1537 </span>]
<span id="L1538" class="LineNr">1538 </span>
<span id="L1539" class="LineNr">1539 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L1540" class="LineNr">1540 </span>  <span class="Delimiter">{</span>
<span id="L1541" class="LineNr">1541 </span>  <span class="Conceal">¦</span> move-to-start-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">1/ctrl-a</span>
<span id="L1542" class="LineNr">1542 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-to-start-of-line?
<span id="L1543" class="LineNr">1543 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L1544" class="LineNr">1544 </span>  <span class="Conceal">¦</span> <a href='003-shortcuts.mu.html#L1565'>move-to-start-of-screen-line</a> editor
<span id="L1545" class="LineNr">1545 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L1546" class="LineNr">1546 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L1547" class="LineNr">1547 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
<span id="L1548" class="LineNr">1548 </span>  <span class="Delimiter">}</span>
<span id="L1549" class="LineNr">1549 </span>]
<span id="L1550" class="LineNr">1550 </span>
<span id="L1551" class="LineNr">1551 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L1552" class="LineNr">1552 </span>  <span class="Delimiter">{</span>
<span id="L1553" class="LineNr">1553 </span>  <span class="Conceal">¦</span> move-to-start-of-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65521/home</span>
<span id="L1554" class="LineNr">1554 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-to-start-of-line?
<span id="L1555" class="LineNr">1555 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L1556" class="LineNr">1556 </span>  <span class="Conceal">¦</span> <a href='003-shortcuts.mu.html#L1565'>move-to-start-of-screen-line</a> editor
<span id="L1557" class="LineNr">1557 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L1558" class="LineNr">1558 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L1559" class="LineNr">1559 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
<span id="L1560" class="LineNr">1560 </span>  <span class="Delimiter">}</span>
<span id="L1561" class="LineNr">1561 </span>]
<span id="L1562" class="LineNr">1562 </span>
<span id="L1563" class="LineNr">1563 </span><span class="Comment"># handles wrapped lines</span>
<span id="L1564" class="LineNr">1564 </span><span class="Comment"># precondition: cursor-column should be in a consistent state</span>
<span id="L1565" class="LineNr">1565 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1565'>move-to-start-of-screen-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
<span id="L1566" class="LineNr">1566 </span>  <span class="Constant">local-scope</span>
<span id="L1567" class="LineNr">1567 </span>  <span class="Constant">load-ingredients</span>
<span id="L1568" class="LineNr">1568 </span>  <span class="Comment"># update cursor column</span>
<span id="L1569" class="LineNr">1569 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L1570" class="LineNr">1570 </span>  col:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L1571" class="LineNr">1571 </span>  <span class="Comment"># update before-cursor</span>
<span id="L1572" class="LineNr">1572 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L1573" class="LineNr">1573 </span>  <span class="Comment"># while not at start of line, move</span>
<span id="L1574" class="LineNr">1574 </span>  <span class="Delimiter">{</span>
<span id="L1575" class="LineNr">1575 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> equal col, left
<span id="L1576" class="LineNr">1576 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L1577" class="LineNr">1577 </span>  <span class="Conceal">¦</span> assert curr, <span class="Constant">[move-to-start-of-line tried to move before start of text]</span>
<span id="L1578" class="LineNr">1578 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> curr
<span id="L1579" class="LineNr">1579 </span>  <span class="Conceal">¦</span> col <span class="Special">&lt;-</span> subtract col,<span class="Constant"> 1</span>
<span id="L1580" class="LineNr">1580 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L1581" class="LineNr">1581 </span>  <span class="Delimiter">}</span>
<span id="L1582" class="LineNr">1582 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, col
<span id="L1583" class="LineNr">1583 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, curr
<span id="L1584" class="LineNr">1584 </span>]
<span id="L1585" class="LineNr">1585 </span>
<span id="L1586" class="LineNr">1586 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-ctrl-a-2 [
<span id="L1587" class="LineNr">1587 </span>  <span class="Constant">local-scope</span>
<span id="L1588" class="LineNr">1588 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1589" class="LineNr">1589 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1590" class="LineNr">1590 </span><span class="Constant">456]</span>
<span id="L1591" class="LineNr">1591 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1592" class="LineNr">1592 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1593" class="LineNr">1593 </span>  $clear-trace
<span id="L1594" class="LineNr">1594 </span>  <span class="Comment"># start on first line (no newline before), press ctrl-a</span>
<span id="L1595" class="LineNr">1595 </span>  assume-console [
<span id="L1596" class="LineNr">1596 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L1597" class="LineNr">1597 </span>  <span class="Conceal">¦</span> press ctrl-a
<span id="L1598" class="LineNr">1598 </span>  ]
<span id="L1599" class="LineNr">1599 </span>  run [
<span id="L1600" class="LineNr">1600 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1601" class="LineNr">1601 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1602" class="LineNr">1602 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1603" class="LineNr">1603 </span>  ]
<span id="L1604" class="LineNr">1604 </span>  <span class="Comment"># cursor moves to start of line</span>
<span id="L1605" class="LineNr">1605 </span>  memory-should-contain [
<span id="L1606" class="LineNr">1606 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1607" class="LineNr">1607 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1608" class="LineNr">1608 </span>  ]
<span id="L1609" class="LineNr">1609 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1610" class="LineNr">1610 </span>]
<span id="L1611" class="LineNr">1611 </span>
<span id="L1612" class="LineNr">1612 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-home [
<span id="L1613" class="LineNr">1613 </span>  <span class="Constant">local-scope</span>
<span id="L1614" class="LineNr">1614 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1615" class="LineNr">1615 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1616" class="LineNr">1616 </span><span class="Constant">456]</span>
<span id="L1617" class="LineNr">1617 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1618" class="LineNr">1618 </span>  $clear-trace
<span id="L1619" class="LineNr">1619 </span>  <span class="Comment"># start on second line, press 'home'</span>
<span id="L1620" class="LineNr">1620 </span>  assume-console [
<span id="L1621" class="LineNr">1621 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L1622" class="LineNr">1622 </span>  <span class="Conceal">¦</span> press home
<span id="L1623" class="LineNr">1623 </span>  ]
<span id="L1624" class="LineNr">1624 </span>  run [
<span id="L1625" class="LineNr">1625 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1626" class="LineNr">1626 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1627" class="LineNr">1627 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1628" class="LineNr">1628 </span>  ]
<span id="L1629" class="LineNr">1629 </span>  <span class="Comment"># cursor moves to start of line</span>
<span id="L1630" class="LineNr">1630 </span>  memory-should-contain [
<span id="L1631" class="LineNr">1631 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1632" class="LineNr">1632 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1633" class="LineNr">1633 </span>  ]
<span id="L1634" class="LineNr">1634 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1635" class="LineNr">1635 </span>]
<span id="L1636" class="LineNr">1636 </span>
<span id="L1637" class="LineNr">1637 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-home-2 [
<span id="L1638" class="LineNr">1638 </span>  <span class="Constant">local-scope</span>
<span id="L1639" class="LineNr">1639 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1640" class="LineNr">1640 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1641" class="LineNr">1641 </span><span class="Constant">456]</span>
<span id="L1642" class="LineNr">1642 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1643" class="LineNr">1643 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1644" class="LineNr">1644 </span>  $clear-trace
<span id="L1645" class="LineNr">1645 </span>  <span class="Comment"># start on first line (no newline before), press 'home'</span>
<span id="L1646" class="LineNr">1646 </span>  assume-console [
<span id="L1647" class="LineNr">1647 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L1648" class="LineNr">1648 </span>  <span class="Conceal">¦</span> press home
<span id="L1649" class="LineNr">1649 </span>  ]
<span id="L1650" class="LineNr">1650 </span>  run [
<span id="L1651" class="LineNr">1651 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1652" class="LineNr">1652 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1653" class="LineNr">1653 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1654" class="LineNr">1654 </span>  ]
<span id="L1655" class="LineNr">1655 </span>  <span class="Comment"># cursor moves to start of line</span>
<span id="L1656" class="LineNr">1656 </span>  memory-should-contain [
<span id="L1657" class="LineNr">1657 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1658" class="LineNr">1658 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1659" class="LineNr">1659 </span>  ]
<span id="L1660" class="LineNr">1660 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1661" class="LineNr">1661 </span>]
<span id="L1662" class="LineNr">1662 </span>
<span id="L1663" class="LineNr">1663 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-screen-line-with-ctrl-a [
<span id="L1664" class="LineNr">1664 </span>  <span class="Constant">local-scope</span>
<span id="L1665" class="LineNr">1665 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1666" class="LineNr">1666 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[123456]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L1667" class="LineNr">1667 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1668" class="LineNr">1668 </span>  screen-should-contain [
<span id="L1669" class="LineNr">1669 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1670" class="LineNr">1670 </span>  <span class="Conceal">¦</span><span class="Constant"> .1234↩     .</span>
<span id="L1671" class="LineNr">1671 </span>  <span class="Conceal">¦</span><span class="Constant"> .56        .</span>
<span id="L1672" class="LineNr">1672 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1673" class="LineNr">1673 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1674" class="LineNr">1674 </span>  ]
<span id="L1675" class="LineNr">1675 </span>  $clear-trace
<span id="L1676" class="LineNr">1676 </span>  <span class="Comment"># start on second line, press ctrl-a then up</span>
<span id="L1677" class="LineNr">1677 </span>  assume-console [
<span id="L1678" class="LineNr">1678 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L1679" class="LineNr">1679 </span>  <span class="Conceal">¦</span> press ctrl-a
<span id="L1680" class="LineNr">1680 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L1681" class="LineNr">1681 </span>  ]
<span id="L1682" class="LineNr">1682 </span>  run [
<span id="L1683" class="LineNr">1683 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1684" class="LineNr">1684 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1685" class="LineNr">1685 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1686" class="LineNr">1686 </span>  ]
<span id="L1687" class="LineNr">1687 </span>  <span class="Comment"># cursor moves to start of first line</span>
<span id="L1688" class="LineNr">1688 </span>  memory-should-contain [
<span id="L1689" class="LineNr">1689 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L1690" class="LineNr">1690 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L1691" class="LineNr">1691 </span>  ]
<span id="L1692" class="LineNr">1692 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1693" class="LineNr">1693 </span>  <span class="Comment"># make sure before-cursor is in sync</span>
<span id="L1694" class="LineNr">1694 </span>  assume-console [
<span id="L1695" class="LineNr">1695 </span>  <span class="Conceal">¦</span> type <span class="Constant">[a]</span>
<span id="L1696" class="LineNr">1696 </span>  ]
<span id="L1697" class="LineNr">1697 </span>  run [
<span id="L1698" class="LineNr">1698 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1699" class="LineNr">1699 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1700" class="LineNr">1700 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1701" class="LineNr">1701 </span>  ]
<span id="L1702" class="LineNr">1702 </span>  screen-should-contain [
<span id="L1703" class="LineNr">1703 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1704" class="LineNr">1704 </span>  <span class="Conceal">¦</span><span class="Constant"> .a123↩     .</span>
<span id="L1705" class="LineNr">1705 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L1706" class="LineNr">1706 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1707" class="LineNr">1707 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1708" class="LineNr">1708 </span>  ]
<span id="L1709" class="LineNr">1709 </span>  memory-should-contain [
<span id="L1710" class="LineNr">1710 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L1711" class="LineNr">1711 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-column</span>
<span id="L1712" class="LineNr">1712 </span>  ]
<span id="L1713" class="LineNr">1713 </span>]
<span id="L1714" class="LineNr">1714 </span>
<span id="L1715" class="LineNr">1715 </span><span class="Comment"># ctrl-e/end - move cursor to end of line</span>
<span id="L1716" class="LineNr">1716 </span>
<span id="L1717" class="LineNr">1717 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-ctrl-e [
<span id="L1718" class="LineNr">1718 </span>  <span class="Constant">local-scope</span>
<span id="L1719" class="LineNr">1719 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1720" class="LineNr">1720 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1721" class="LineNr">1721 </span><span class="Constant">456]</span>
<span id="L1722" class="LineNr">1722 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1723" class="LineNr">1723 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1724" class="LineNr">1724 </span>  $clear-trace
<span id="L1725" class="LineNr">1725 </span>  <span class="Comment"># start on first line, press ctrl-e</span>
<span id="L1726" class="LineNr">1726 </span>  assume-console [
<span id="L1727" class="LineNr">1727 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L1728" class="LineNr">1728 </span>  <span class="Conceal">¦</span> press ctrl-e
<span id="L1729" class="LineNr">1729 </span>  ]
<span id="L1730" class="LineNr">1730 </span>  run [
<span id="L1731" class="LineNr">1731 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1732" class="LineNr">1732 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1733" class="LineNr">1733 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1734" class="LineNr">1734 </span>  ]
<span id="L1735" class="LineNr">1735 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1736" class="LineNr">1736 </span>  memory-should-contain [
<span id="L1737" class="LineNr">1737 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1738" class="LineNr">1738 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1739" class="LineNr">1739 </span>  ]
<span id="L1740" class="LineNr">1740 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1741" class="LineNr">1741 </span>  <span class="Comment"># editor inserts future characters at cursor</span>
<span id="L1742" class="LineNr">1742 </span>  assume-console [
<span id="L1743" class="LineNr">1743 </span>  <span class="Conceal">¦</span> type <span class="Constant">[z]</span>
<span id="L1744" class="LineNr">1744 </span>  ]
<span id="L1745" class="LineNr">1745 </span>  run [
<span id="L1746" class="LineNr">1746 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1747" class="LineNr">1747 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1748" class="LineNr">1748 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1749" class="LineNr">1749 </span>  ]
<span id="L1750" class="LineNr">1750 </span>  memory-should-contain [
<span id="L1751" class="LineNr">1751 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1752" class="LineNr">1752 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
<span id="L1753" class="LineNr">1753 </span>  ]
<span id="L1754" class="LineNr">1754 </span>  screen-should-contain [
<span id="L1755" class="LineNr">1755 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1756" class="LineNr">1756 </span>  <span class="Conceal">¦</span><span class="Constant"> .123z      .</span>
<span id="L1757" class="LineNr">1757 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L1758" class="LineNr">1758 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1759" class="LineNr">1759 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1760" class="LineNr">1760 </span>  ]
<span id="L1761" class="LineNr">1761 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
<span id="L1762" class="LineNr">1762 </span>]
<span id="L1763" class="LineNr">1763 </span>
<span id="L1764" class="LineNr">1764 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L1765" class="LineNr">1765 </span>  <span class="Delimiter">{</span>
<span id="L1766" class="LineNr">1766 </span>  <span class="Conceal">¦</span> move-to-end-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">5/ctrl-e</span>
<span id="L1767" class="LineNr">1767 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-to-end-of-line?
<span id="L1768" class="LineNr">1768 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L1769" class="LineNr">1769 </span>  <span class="Conceal">¦</span> <a href='003-shortcuts.mu.html#L1788'>move-to-end-of-line</a> editor
<span id="L1770" class="LineNr">1770 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L1771" class="LineNr">1771 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L1772" class="LineNr">1772 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
<span id="L1773" class="LineNr">1773 </span>  <span class="Delimiter">}</span>
<span id="L1774" class="LineNr">1774 </span>]
<span id="L1775" class="LineNr">1775 </span>
<span id="L1776" class="LineNr">1776 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L1777" class="LineNr">1777 </span>  <span class="Delimiter">{</span>
<span id="L1778" class="LineNr">1778 </span>  <span class="Conceal">¦</span> move-to-end-of-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65520/end</span>
<span id="L1779" class="LineNr">1779 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> move-to-end-of-line?
<span id="L1780" class="LineNr">1780 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L1781" class="LineNr">1781 </span>  <span class="Conceal">¦</span> <a href='003-shortcuts.mu.html#L1788'>move-to-end-of-line</a> editor
<span id="L1782" class="LineNr">1782 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L1783" class="LineNr">1783 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L1784" class="LineNr">1784 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span>
<span id="L1785" class="LineNr">1785 </span>  <span class="Delimiter">}</span>
<span id="L1786" class="LineNr">1786 </span>]
<span id="L1787" class="LineNr">1787 </span>
<span id="L1788" class="LineNr">1788 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1788'>move-to-end-of-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
<span id="L1789" class="LineNr">1789 </span>  <span class="Constant">local-scope</span>
<span id="L1790" class="LineNr">1790 </span>  <span class="Constant">load-ingredients</span>
<span id="L1791" class="LineNr">1791 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L1792" class="LineNr">1792 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L1793" class="LineNr">1793 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L1794" class="LineNr">1794 </span>  <span class="Comment"># while not at end of line, move</span>
<span id="L1795" class="LineNr">1795 </span>  <span class="Delimiter">{</span>
<span id="L1796" class="LineNr">1796 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L1797" class="LineNr">1797 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L29'>next</a>  <span class="Comment"># end of text</span>
<span id="L1798" class="LineNr">1798 </span>  <span class="Conceal">¦</span> nextc:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
<span id="L1799" class="LineNr">1799 </span>  <span class="Conceal">¦</span> at-end-of-line?:bool <span class="Special">&lt;-</span> equal nextc, <span class="Constant">10/newline</span>
<span id="L1800" class="LineNr">1800 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-end-of-line?
<span id="L1801" class="LineNr">1801 </span>  <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L1802" class="LineNr">1802 </span>  <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> equal cursor-column, right
<span id="L1803" class="LineNr">1803 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-right?
<span id="L1804" class="LineNr">1804 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L1805" class="LineNr">1805 </span>  <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L1806" class="LineNr">1806 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L1807" class="LineNr">1807 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L1808" class="LineNr">1808 </span>  <span class="Delimiter">}</span>
<span id="L1809" class="LineNr">1809 </span>]
<span id="L1810" class="LineNr">1810 </span>
<span id="L1811" class="LineNr">1811 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-ctrl-e-2 [
<span id="L1812" class="LineNr">1812 </span>  <span class="Constant">local-scope</span>
<span id="L1813" class="LineNr">1813 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1814" class="LineNr">1814 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1815" class="LineNr">1815 </span><span class="Constant">456]</span>
<span id="L1816" class="LineNr">1816 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1817" class="LineNr">1817 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1818" class="LineNr">1818 </span>  $clear-trace
<span id="L1819" class="LineNr">1819 </span>  <span class="Comment"># start on second line (no newline after), press ctrl-e</span>
<span id="L1820" class="LineNr">1820 </span>  assume-console [
<span id="L1821" class="LineNr">1821 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L1822" class="LineNr">1822 </span>  <span class="Conceal">¦</span> press ctrl-e
<span id="L1823" class="LineNr">1823 </span>  ]
<span id="L1824" class="LineNr">1824 </span>  run [
<span id="L1825" class="LineNr">1825 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1826" class="LineNr">1826 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1827" class="LineNr">1827 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1828" class="LineNr">1828 </span>  ]
<span id="L1829" class="LineNr">1829 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1830" class="LineNr">1830 </span>  memory-should-contain [
<span id="L1831" class="LineNr">1831 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1832" class="LineNr">1832 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1833" class="LineNr">1833 </span>  ]
<span id="L1834" class="LineNr">1834 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1835" class="LineNr">1835 </span>]
<span id="L1836" class="LineNr">1836 </span>
<span id="L1837" class="LineNr">1837 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-end [
<span id="L1838" class="LineNr">1838 </span>  <span class="Constant">local-scope</span>
<span id="L1839" class="LineNr">1839 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1840" class="LineNr">1840 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1841" class="LineNr">1841 </span><span class="Constant">456]</span>
<span id="L1842" class="LineNr">1842 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1843" class="LineNr">1843 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1844" class="LineNr">1844 </span>  $clear-trace
<span id="L1845" class="LineNr">1845 </span>  <span class="Comment"># start on first line, press 'end'</span>
<span id="L1846" class="LineNr">1846 </span>  assume-console [
<span id="L1847" class="LineNr">1847 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L1848" class="LineNr">1848 </span>  <span class="Conceal">¦</span> press end
<span id="L1849" class="LineNr">1849 </span>  ]
<span id="L1850" class="LineNr">1850 </span>  run [
<span id="L1851" class="LineNr">1851 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1852" class="LineNr">1852 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1853" class="LineNr">1853 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1854" class="LineNr">1854 </span>  ]
<span id="L1855" class="LineNr">1855 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1856" class="LineNr">1856 </span>  memory-should-contain [
<span id="L1857" class="LineNr">1857 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1858" class="LineNr">1858 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1859" class="LineNr">1859 </span>  ]
<span id="L1860" class="LineNr">1860 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1861" class="LineNr">1861 </span>]
<span id="L1862" class="LineNr">1862 </span>
<span id="L1863" class="LineNr">1863 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-end-2 [
<span id="L1864" class="LineNr">1864 </span>  <span class="Constant">local-scope</span>
<span id="L1865" class="LineNr">1865 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1866" class="LineNr">1866 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1867" class="LineNr">1867 </span><span class="Constant">456]</span>
<span id="L1868" class="LineNr">1868 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1869" class="LineNr">1869 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1870" class="LineNr">1870 </span>  $clear-trace
<span id="L1871" class="LineNr">1871 </span>  <span class="Comment"># start on second line (no newline after), press 'end'</span>
<span id="L1872" class="LineNr">1872 </span>  assume-console [
<span id="L1873" class="LineNr">1873 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L1874" class="LineNr">1874 </span>  <span class="Conceal">¦</span> press end
<span id="L1875" class="LineNr">1875 </span>  ]
<span id="L1876" class="LineNr">1876 </span>  run [
<span id="L1877" class="LineNr">1877 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1878" class="LineNr">1878 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1879" class="LineNr">1879 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1880" class="LineNr">1880 </span>  ]
<span id="L1881" class="LineNr">1881 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1882" class="LineNr">1882 </span>  memory-should-contain [
<span id="L1883" class="LineNr">1883 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1884" class="LineNr">1884 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1885" class="LineNr">1885 </span>  ]
<span id="L1886" class="LineNr">1886 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1887" class="LineNr">1887 </span>]
<span id="L1888" class="LineNr">1888 </span>
<span id="L1889" class="LineNr">1889 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-wrapped-line [
<span id="L1890" class="LineNr">1890 </span>  <span class="Constant">local-scope</span>
<span id="L1891" class="LineNr">1891 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1892" class="LineNr">1892 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123456</span>
<span id="L1893" class="LineNr">1893 </span><span class="Constant">789]</span>
<span id="L1894" class="LineNr">1894 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L1895" class="LineNr">1895 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1896" class="LineNr">1896 </span>  $clear-trace
<span id="L1897" class="LineNr">1897 </span>  <span class="Comment"># start on first line, press 'end'</span>
<span id="L1898" class="LineNr">1898 </span>  assume-console [
<span id="L1899" class="LineNr">1899 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L1900" class="LineNr">1900 </span>  <span class="Conceal">¦</span> press end
<span id="L1901" class="LineNr">1901 </span>  ]
<span id="L1902" class="LineNr">1902 </span>  run [
<span id="L1903" class="LineNr">1903 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1904" class="LineNr">1904 </span>  <span class="Conceal">¦</span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1905" class="LineNr">1905 </span>  <span class="Conceal">¦</span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1906" class="LineNr">1906 </span>  ]
<span id="L1907" class="LineNr">1907 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1908" class="LineNr">1908 </span>  memory-should-contain [
<span id="L1909" class="LineNr">1909 </span>  <span class="Conceal">¦</span><span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1910" class="LineNr">1910 </span>  <span class="Conceal">¦</span><span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1911" class="LineNr">1911 </span>  ]
<span id="L1912" class="LineNr">1912 </span>  <span class="Comment"># no prints</span>
<span id="L1913" class="LineNr">1913 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1914" class="LineNr">1914 </span>  <span class="Comment"># before-cursor is also consistent</span>
<span id="L1915" class="LineNr">1915 </span>  assume-console [
<span id="L1916" class="LineNr">1916 </span>  <span class="Conceal">¦</span> type <span class="Constant">[a]</span>
<span id="L1917" class="LineNr">1917 </span>  ]
<span id="L1918" class="LineNr">1918 </span>  run [
<span id="L1919" class="LineNr">1919 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1920" class="LineNr">1920 </span>  ]
<span id="L1921" class="LineNr">1921 </span>  screen-should-contain [
<span id="L1922" class="LineNr">1922 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1923" class="LineNr">1923 </span>  <span class="Conceal">¦</span><span class="Constant"> .123a↩     .</span>
<span id="L1924" class="LineNr">1924 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L1925" class="LineNr">1925 </span>  <span class="Conceal">¦</span><span class="Constant"> .789       .</span>
<span id="L1926" class="LineNr">1926 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1927" class="LineNr">1927 </span>  ]
<span id="L1928" class="LineNr">1928 </span>]
<span id="L1929" class="LineNr">1929 </span>
<span id="L1930" class="LineNr">1930 </span><span class="Comment"># ctrl-u - delete text from start of line until (but not at) cursor</span>
<span id="L1931" class="LineNr">1931 </span>
<span id="L1932" class="LineNr">1932 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u [
<span id="L1933" class="LineNr">1933 </span>  <span class="Constant">local-scope</span>
<span id="L1934" class="LineNr">1934 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1935" class="LineNr">1935 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1936" class="LineNr">1936 </span><span class="Constant">456]</span>
<span id="L1937" class="LineNr">1937 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L1938" class="LineNr">1938 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1939" class="LineNr">1939 </span>  $clear-trace
<span id="L1940" class="LineNr">1940 </span>  <span class="Comment"># start on second line, press ctrl-u</span>
<span id="L1941" class="LineNr">1941 </span>  assume-console [
<span id="L1942" class="LineNr">1942 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
<span id="L1943" class="LineNr">1943 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L1944" class="LineNr">1944 </span>  ]
<span id="L1945" class="LineNr">1945 </span>  run [
<span id="L1946" class="LineNr">1946 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L1947" class="LineNr">1947 </span>  ]
<span id="L1948" class="LineNr">1948 </span>  <span class="Comment"># cursor deletes to start of line</span>
<span id="L1949" class="LineNr">1949 </span>  screen-should-contain [
<span id="L1950" class="LineNr">1950 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1951" class="LineNr">1951 </span>  <span class="Conceal">¦</span><span class="Constant"> .123       .</span>
<span id="L1952" class="LineNr">1952 </span>  <span class="Conceal">¦</span><span class="Constant"> .6         .</span>
<span id="L1953" class="LineNr">1953 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1954" class="LineNr">1954 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L1955" class="LineNr">1955 </span>  ]
<span id="L1956" class="LineNr">1956 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L1957" class="LineNr">1957 </span>]
<span id="L1958" class="LineNr">1958 </span>
<span id="L1959" class="LineNr">1959 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L1960" class="LineNr">1960 </span>  <span class="Delimiter">{</span>
<span id="L1961" class="LineNr">1961 </span>  <span class="Conceal">¦</span> delete-to-start-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">21/ctrl-u</span>
<span id="L1962" class="LineNr">1962 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> delete-to-start-of-line?
<span id="L1963" class="LineNr">1963 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='003-shortcuts.mu.html#L1963'>&lt;delete-to-start-of-line-begin&gt;</a></span>
<span id="L1964" class="LineNr">1964 </span>  <span class="Conceal">¦</span> deleted-cells:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2006'>delete-to-start-of-line</a> editor
<span id="L1965" class="LineNr">1965 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='003-shortcuts.mu.html#L1965'>&lt;delete-to-start-of-line-end&gt;</a></span>
<span id="L1966" class="LineNr">1966 </span>  <span class="Conceal">¦</span> go-render?:bool <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L1971'>minimal-render-for-ctrl-u</a> <a href='../081print.mu.html#L16'>screen</a>, editor, deleted-cells
<span id="L1967" class="LineNr">1967 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L1968" class="LineNr">1968 </span>  <span class="Delimiter">}</span>
<span id="L1969" class="LineNr">1969 </span>]
<span id="L1970" class="LineNr">1970 </span>
<span id="L1971" class="LineNr">1971 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1971'>minimal-render-for-ctrl-u</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, editor:&amp;:editor, deleted-cells:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char<span class="muRecipe"> -&gt; </span>go-render?:bool, <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a> [
<span id="L1972" class="LineNr">1972 </span>  <span class="Constant">local-scope</span>
<span id="L1973" class="LineNr">1973 </span>  <span class="Constant">load-ingredients</span>
<span id="L1974" class="LineNr">1974 </span>  curr-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L1975" class="LineNr">1975 </span>  <span class="Comment"># accumulate the current line as text and render it</span>
<span id="L1976" class="LineNr">1976 </span>  buf:&amp;:<a href='../061text.mu.html#L126'>buffer</a>:char <span class="Special">&lt;-</span> <a href='../061text.mu.html#L131'>new-buffer</a><span class="Constant"> 30</span>  <span class="Comment"># accumulator for the text we need to render</span>
<span id="L1977" class="LineNr">1977 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L1978" class="LineNr">1978 </span>  i:num <span class="Special">&lt;-</span> copy curr-column
<span id="L1979" class="LineNr">1979 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L1980" class="LineNr">1980 </span>  <span class="Delimiter">{</span>
<span id="L1981" class="LineNr">1981 </span>  <span class="Conceal">¦</span> <span class="Comment"># if we have a wrapped line, give up and render the whole screen</span>
<span id="L1982" class="LineNr">1982 </span>  <span class="Conceal">¦</span> wrap?:bool <span class="Special">&lt;-</span> greater-or-equal i, right
<span id="L1983" class="LineNr">1983 </span>  <span class="Conceal">¦</span> <span class="muControl">return-if</span> wrap?, <span class="Constant">1/go-render</span>
<span id="L1984" class="LineNr">1984 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
<span id="L1985" class="LineNr">1985 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
<span id="L1986" class="LineNr">1986 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L1987" class="LineNr">1987 </span>  <span class="Conceal">¦</span> b:bool <span class="Special">&lt;-</span> equal c,<span class="Constant"> 10</span>
<span id="L1988" class="LineNr">1988 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> b
<span id="L1989" class="LineNr">1989 </span>  <span class="Conceal">¦</span> buf <span class="Special">&lt;-</span> append buf, c
<span id="L1990" class="LineNr">1990 </span>  <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L1991" class="LineNr">1991 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L1992" class="LineNr">1992 </span>  <span class="Delimiter">}</span>
<span id="L1993" class="LineNr">1993 </span>  <span class="Comment"># if the line used to be wrapped, give up and render the whole screen</span>
<span id="L1994" class="LineNr">1994 </span>  num-deleted-cells:num <span class="Special">&lt;-</span> length deleted-cells
<span id="L1995" class="LineNr">1995 </span>  old-row-len:num <span class="Special">&lt;-</span> add i, num-deleted-cells
<span id="L1996" class="LineNr">1996 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L1997" class="LineNr">1997 </span>  end:num <span class="Special">&lt;-</span> subtract right, left
<span id="L1998" class="LineNr">1998 </span>  wrap?:bool <span class="Special">&lt;-</span> greater-or-equal old-row-len, end
<span id="L1999" class="LineNr">1999 </span>  <span class="muControl">return-if</span> wrap?, <span class="Constant">1/go-render</span>
<span id="L2000" class="LineNr">2000 </span>  curr-line:text <span class="Special">&lt;-</span> <a href='../061text.mu.html#L344'>buffer-to-array</a> buf
<span id="L2001" class="LineNr">2001 </span>  curr-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L2002" class="LineNr">2002 </span>  <a href='003-shortcuts.mu.html#L2062'>render-code</a> <a href='../081print.mu.html#L16'>screen</a>, curr-line, curr-column, right, curr-row
<span id="L2003" class="LineNr">2003 </span>  <span class="muControl">return</span> <span class="Constant">0/dont-render</span>
<span id="L2004" class="LineNr">2004 </span>]
<span id="L2005" class="LineNr">2005 </span>
<span id="L2006" class="LineNr">2006 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2006'>delete-to-start-of-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char, editor:&amp;:editor [
<span id="L2007" class="LineNr">2007 </span>  <span class="Constant">local-scope</span>
<span id="L2008" class="LineNr">2008 </span>  <span class="Constant">load-ingredients</span>
<span id="L2009" class="LineNr">2009 </span>  <span class="Comment"># compute range to delete</span>
<span id="L2010" class="LineNr">2010 </span>  init:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
<span id="L2011" class="LineNr">2011 </span>  top-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L2012" class="LineNr">2012 </span>  update-top-of-screen?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
<span id="L2013" class="LineNr">2013 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L2014" class="LineNr">2014 </span>  start:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy before-cursor
<span id="L2015" class="LineNr">2015 </span>  end:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-cursor
<span id="L2016" class="LineNr">2016 </span>  <span class="Delimiter">{</span>
<span id="L2017" class="LineNr">2017 </span>  <span class="Conceal">¦</span> at-start-of-text?:bool <span class="Special">&lt;-</span> equal start, init
<span id="L2018" class="LineNr">2018 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-start-of-text?
<span id="L2019" class="LineNr">2019 </span>  <span class="Conceal">¦</span> curr:char <span class="Special">&lt;-</span> get *start, <span class="Constant">value:offset</span>
<span id="L2020" class="LineNr">2020 </span>  <span class="Conceal">¦</span> at-start-of-line?:bool <span class="Special">&lt;-</span> equal curr, <span class="Constant">10/newline</span>
<span id="L2021" class="LineNr">2021 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-start-of-line?
<span id="L2022" class="LineNr">2022 </span>  <span class="Conceal">¦</span> <span class="Comment"># if we went past top-of-screen, make a note to update it as well</span>
<span id="L2023" class="LineNr">2023 </span>  <span class="Conceal">¦</span> at-top-of-screen?:bool <span class="Special">&lt;-</span> equal start, top-of-screen
<span id="L2024" class="LineNr">2024 </span>  <span class="Conceal">¦</span> update-top-of-screen?:bool <span class="Special">&lt;-</span> or update-top-of-screen?, at-top-of-screen?
<span id="L2025" class="LineNr">2025 </span>  <span class="Conceal">¦</span> start <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> start
<span id="L2026" class="LineNr">2026 </span>  <span class="Conceal">¦</span> assert start, <span class="Constant">[delete-to-start-of-line tried to move before start of text]</span>
<span id="L2027" class="LineNr">2027 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L2028" class="LineNr">2028 </span>  <span class="Delimiter">}</span>
<span id="L2029" class="LineNr">2029 </span>  <span class="Comment"># snip it out</span>
<span id="L2030" class="LineNr">2030 </span>  result:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> start
<span id="L2031" class="LineNr">2031 </span>  <a href='../065duplex_list.mu.html#L389'>remove-between</a> start, end
<span id="L2032" class="LineNr">2032 </span>  <span class="Comment"># update top-of-screen if it's just been invalidated</span>
<span id="L2033" class="LineNr">2033 </span>  <span class="Delimiter">{</span>
<span id="L2034" class="LineNr">2034 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> update-top-of-screen?
<span id="L2035" class="LineNr">2035 </span>  <span class="Conceal">¦</span> put *editor, <span class="Constant">top-of-screen:offset</span>, start
<span id="L2036" class="LineNr">2036 </span>  <span class="Delimiter">}</span>
<span id="L2037" class="LineNr">2037 </span>  <span class="Comment"># adjust cursor</span>
<span id="L2038" class="LineNr">2038 </span>  before-cursor <span class="Special">&lt;-</span> copy start
<span id="L2039" class="LineNr">2039 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L2040" class="LineNr">2040 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L2041" class="LineNr">2041 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, left
<span id="L2042" class="LineNr">2042 </span>  <span class="Comment"># if the line wrapped before, we may need to adjust cursor-row as well</span>
<span id="L2043" class="LineNr">2043 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L2044" class="LineNr">2044 </span>  width:num <span class="Special">&lt;-</span> subtract right, left
<span id="L2045" class="LineNr">2045 </span>  num-deleted:num <span class="Special">&lt;-</span> length result
<span id="L2046" class="LineNr">2046 </span>  cursor-row-adjustment:num <span class="Special">&lt;-</span> divide-with-remainder num-deleted, width
<span id="L2047" class="LineNr">2047 </span>  <span class="muControl">return-unless</span> cursor-row-adjustment
<span id="L2048" class="LineNr">2048 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L2049" class="LineNr">2049 </span>  cursor-row-in-editor:num <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>  <span class="Comment"># ignore menubar</span>
<span id="L2050" class="LineNr">2050 </span>  at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal cursor-row-in-editor, cursor-row-adjustment
<span id="L2051" class="LineNr">2051 </span>  <span class="Delimiter">{</span>
<span id="L2052" class="LineNr">2052 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-top?
<span id="L2053" class="LineNr">2053 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>  <span class="Comment"># top of editor, below menubar</span>
<span id="L2054" class="LineNr">2054 </span>  <span class="Delimiter">}</span>
<span id="L2055" class="LineNr">2055 </span>  <span class="Delimiter">{</span>
<span id="L2056" class="LineNr">2056 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-top?
<span id="L2057" class="LineNr">2057 </span>  <span class="Conceal">¦</span> cursor-row <span class="Special">&lt;-</span> subtract cursor-row, cursor-row-adjustment
<span id="L2058" class="LineNr">2058 </span>  <span class="Delimiter">}</span>
<span id="L2059" class="LineNr">2059 </span>  put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L2060" class="LineNr">2060 </span>]
<span id="L2061" class="LineNr">2061 </span>
<span id="L2062" class="LineNr">2062 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2062'>render-code</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, s:text, left:num, right:num, row:num<span class="muRecipe"> -&gt; </span>row:num, <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a> [
<span id="L2063" class="LineNr">2063 </span>  <span class="Constant">local-scope</span>
<span id="L2064" class="LineNr">2064 </span>  <span class="Constant">load-ingredients</span>
<span id="L2065" class="LineNr">2065 </span>  <span class="muControl">return-unless</span> s
<span id="L2066" class="LineNr">2066 </span>  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
<span id="L2067" class="LineNr">2067 </span>  column:num <span class="Special">&lt;-</span> copy left
<span id="L2068" class="LineNr">2068 </span>  <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
<span id="L2069" class="LineNr">2069 </span>  <a href='../081print.mu.html#L782'>screen-height</a>:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L782'>screen-height</a> <a href='../081print.mu.html#L16'>screen</a>
<span id="L2070" class="LineNr">2070 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L2071" class="LineNr">2071 </span>  len:num <span class="Special">&lt;-</span> length *s
<span id="L2072" class="LineNr">2072 </span>  <span class="Delimiter">{</span>
<span id="L2073" class="LineNr">2073 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> +next-character</span>
<span id="L2074" class="LineNr">2074 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L2075" class="LineNr">2075 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L2076" class="LineNr">2076 </span>  <span class="Conceal">¦</span> done? <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L2077" class="LineNr">2077 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L2078" class="LineNr">2078 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> index *s, i
<span id="L2079" class="LineNr">2079 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;character-c-received&gt;</span>
<span id="L2080" class="LineNr">2080 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L2081" class="LineNr">2081 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># newline? move to left rather than 0</span>
<span id="L2082" class="LineNr">2082 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L2083" class="LineNr">2083 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> newline?
<span id="L2084" class="LineNr">2084 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># clear rest of line in this window</span>
<span id="L2085" class="LineNr">2085 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L2086" class="LineNr">2086 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-than column, right
<span id="L2087" class="LineNr">2087 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L2088" class="LineNr">2088 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
<span id="L2089" class="LineNr">2089 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space
<span id="L2090" class="LineNr">2090 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
<span id="L2091" class="LineNr">2091 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L2092" class="LineNr">2092 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L2093" class="LineNr">2093 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L2094" class="LineNr">2094 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left
<span id="L2095" class="LineNr">2095 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
<span id="L2096" class="LineNr">2096 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L2097" class="LineNr">2097 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-character</span>
<span id="L2098" class="LineNr">2098 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L2099" class="LineNr">2099 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L2100" class="LineNr">2100 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># at right? wrap.</span>
<span id="L2101" class="LineNr">2101 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> equal column, right
<span id="L2102" class="LineNr">2102 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-right?
<span id="L2103" class="LineNr">2103 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># print wrap icon</span>
<span id="L2104" class="LineNr">2104 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
<span id="L2105" class="LineNr">2105 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, wrap-icon, <span class="Constant">245/grey</span>
<span id="L2106" class="LineNr">2106 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left
<span id="L2107" class="LineNr">2107 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L2108" class="LineNr">2108 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
<span id="L2109" class="LineNr">2109 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># don't increment i</span>
<span id="L2110" class="LineNr">2110 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-character</span>
<span id="L2111" class="LineNr">2111 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L2112" class="LineNr">2112 </span>  <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L2113" class="LineNr">2113 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, c, color
<span id="L2114" class="LineNr">2114 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
<span id="L2115" class="LineNr">2115 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L2116" class="LineNr">2116 </span>  <span class="Delimiter">}</span>
<span id="L2117" class="LineNr">2117 </span>  was-at-left?:bool <span class="Special">&lt;-</span> equal column, left
<span id="L2118" class="LineNr">2118 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right
<span id="L2119" class="LineNr">2119 </span>  <span class="Delimiter">{</span>
<span id="L2120" class="LineNr">2120 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> was-at-left?
<span id="L2121" class="LineNr">2121 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L2122" class="LineNr">2122 </span>  <span class="Delimiter">}</span>
<span id="L2123" class="LineNr">2123 </span>  move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, left
<span id="L2124" class="LineNr">2124 </span>]
<span id="L2125" class="LineNr">2125 </span>
<span id="L2126" class="LineNr">2126 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u-2 [
<span id="L2127" class="LineNr">2127 </span>  <span class="Constant">local-scope</span>
<span id="L2128" class="LineNr">2128 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2129" class="LineNr">2129 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2130" class="LineNr">2130 </span><span class="Constant">456]</span>
<span id="L2131" class="LineNr">2131 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2132" class="LineNr">2132 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2133" class="LineNr">2133 </span>  $clear-trace
<span id="L2134" class="LineNr">2134 </span>  <span class="Comment"># start on first line (no newline before), press ctrl-u</span>
<span id="L2135" class="LineNr">2135 </span>  assume-console [
<span id="L2136" class="LineNr">2136 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
<span id="L2137" class="LineNr">2137 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2138" class="LineNr">2138 </span>  ]
<span id="L2139" class="LineNr">2139 </span>  run [
<span id="L2140" class="LineNr">2140 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2141" class="LineNr">2141 </span>  ]
<span id="L2142" class="LineNr">2142 </span>  <span class="Comment"># cursor deletes to start of line</span>
<span id="L2143" class="LineNr">2143 </span>  screen-should-contain [
<span id="L2144" class="LineNr">2144 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2145" class="LineNr">2145 </span>  <span class="Conceal">¦</span><span class="Constant"> .3         .</span>
<span id="L2146" class="LineNr">2146 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L2147" class="LineNr">2147 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2148" class="LineNr">2148 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2149" class="LineNr">2149 </span>  ]
<span id="L2150" class="LineNr">2150 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L2151" class="LineNr">2151 </span>]
<span id="L2152" class="LineNr">2152 </span>
<span id="L2153" class="LineNr">2153 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u-3 [
<span id="L2154" class="LineNr">2154 </span>  <span class="Constant">local-scope</span>
<span id="L2155" class="LineNr">2155 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2156" class="LineNr">2156 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2157" class="LineNr">2157 </span><span class="Constant">456]</span>
<span id="L2158" class="LineNr">2158 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2159" class="LineNr">2159 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2160" class="LineNr">2160 </span>  $clear-trace
<span id="L2161" class="LineNr">2161 </span>  <span class="Comment"># start past end of line, press ctrl-u</span>
<span id="L2162" class="LineNr">2162 </span>  assume-console [
<span id="L2163" class="LineNr">2163 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L2164" class="LineNr">2164 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2165" class="LineNr">2165 </span>  ]
<span id="L2166" class="LineNr">2166 </span>  run [
<span id="L2167" class="LineNr">2167 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2168" class="LineNr">2168 </span>  ]
<span id="L2169" class="LineNr">2169 </span>  <span class="Comment"># cursor deletes to start of line</span>
<span id="L2170" class="LineNr">2170 </span>  screen-should-contain [
<span id="L2171" class="LineNr">2171 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2172" class="LineNr">2172 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2173" class="LineNr">2173 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L2174" class="LineNr">2174 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2175" class="LineNr">2175 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2176" class="LineNr">2176 </span>  ]
<span id="L2177" class="LineNr">2177 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L2178" class="LineNr">2178 </span>]
<span id="L2179" class="LineNr">2179 </span>
<span id="L2180" class="LineNr">2180 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-final-line-with-ctrl-u [
<span id="L2181" class="LineNr">2181 </span>  <span class="Constant">local-scope</span>
<span id="L2182" class="LineNr">2182 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2183" class="LineNr">2183 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2184" class="LineNr">2184 </span><span class="Constant">456]</span>
<span id="L2185" class="LineNr">2185 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2186" class="LineNr">2186 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2187" class="LineNr">2187 </span>  $clear-trace
<span id="L2188" class="LineNr">2188 </span>  <span class="Comment"># start past end of final line, press ctrl-u</span>
<span id="L2189" class="LineNr">2189 </span>  assume-console [
<span id="L2190" class="LineNr">2190 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L2191" class="LineNr">2191 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2192" class="LineNr">2192 </span>  ]
<span id="L2193" class="LineNr">2193 </span>  run [
<span id="L2194" class="LineNr">2194 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2195" class="LineNr">2195 </span>  ]
<span id="L2196" class="LineNr">2196 </span>  <span class="Comment"># cursor deletes to start of line</span>
<span id="L2197" class="LineNr">2197 </span>  screen-should-contain [
<span id="L2198" class="LineNr">2198 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2199" class="LineNr">2199 </span>  <span class="Conceal">¦</span><span class="Constant"> .123       .</span>
<span id="L2200" class="LineNr">2200 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2201" class="LineNr">2201 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2202" class="LineNr">2202 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2203" class="LineNr">2203 </span>  ]
<span id="L2204" class="LineNr">2204 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L2205" class="LineNr">2205 </span>]
<span id="L2206" class="LineNr">2206 </span>
<span id="L2207" class="LineNr">2207 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u [
<span id="L2208" class="LineNr">2208 </span>  <span class="Constant">local-scope</span>
<span id="L2209" class="LineNr">2209 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2210" class="LineNr">2210 </span>  <span class="Comment"># first line starts out wrapping</span>
<span id="L2211" class="LineNr">2211 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123456</span>
<span id="L2212" class="LineNr">2212 </span><span class="Constant">789]</span>
<span id="L2213" class="LineNr">2213 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2214" class="LineNr">2214 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2215" class="LineNr">2215 </span>  screen-should-contain [
<span id="L2216" class="LineNr">2216 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2217" class="LineNr">2217 </span>  <span class="Conceal">¦</span><span class="Constant"> .1234↩     .</span>
<span id="L2218" class="LineNr">2218 </span>  <span class="Conceal">¦</span><span class="Constant"> .56        .</span>
<span id="L2219" class="LineNr">2219 </span>  <span class="Conceal">¦</span><span class="Constant"> .789       .</span>
<span id="L2220" class="LineNr">2220 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2221" class="LineNr">2221 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2222" class="LineNr">2222 </span>  ]
<span id="L2223" class="LineNr">2223 </span>  $clear-trace
<span id="L2224" class="LineNr">2224 </span>  <span class="Comment"># ctrl-u enough of the first line that it's no longer wrapping</span>
<span id="L2225" class="LineNr">2225 </span>  assume-console [
<span id="L2226" class="LineNr">2226 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L2227" class="LineNr">2227 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2228" class="LineNr">2228 </span>  ]
<span id="L2229" class="LineNr">2229 </span>  run [
<span id="L2230" class="LineNr">2230 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2231" class="LineNr">2231 </span>  ]
<span id="L2232" class="LineNr">2232 </span>  <span class="Comment"># entire screen needs to be refreshed</span>
<span id="L2233" class="LineNr">2233 </span>  screen-should-contain [
<span id="L2234" class="LineNr">2234 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2235" class="LineNr">2235 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L2236" class="LineNr">2236 </span>  <span class="Conceal">¦</span><span class="Constant"> .789       .</span>
<span id="L2237" class="LineNr">2237 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2238" class="LineNr">2238 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2239" class="LineNr">2239 </span>  ]
<span id="L2240" class="LineNr">2240 </span>  check-trace-count-for-label<span class="Constant"> 45</span>, <span class="Constant">[print-character]</span>
<span id="L2241" class="LineNr">2241 </span>]
<span id="L2242" class="LineNr">2242 </span>
<span id="L2243" class="LineNr">2243 </span><span class="Comment"># sometimes hitting ctrl-u needs to adjust the cursor row</span>
<span id="L2244" class="LineNr">2244 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-2 [
<span id="L2245" class="LineNr">2245 </span>  <span class="Constant">local-scope</span>
<span id="L2246" class="LineNr">2246 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2247" class="LineNr">2247 </span>  <span class="Comment"># third line starts out wrapping</span>
<span id="L2248" class="LineNr">2248 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1</span>
<span id="L2249" class="LineNr">2249 </span><span class="Constant">2</span>
<span id="L2250" class="LineNr">2250 </span><span class="Constant">345678</span>
<span id="L2251" class="LineNr">2251 </span><span class="Constant">9]</span>
<span id="L2252" class="LineNr">2252 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2253" class="LineNr">2253 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2254" class="LineNr">2254 </span>  screen-should-contain [
<span id="L2255" class="LineNr">2255 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2256" class="LineNr">2256 </span>  <span class="Conceal">¦</span><span class="Constant"> .1         .</span>
<span id="L2257" class="LineNr">2257 </span>  <span class="Conceal">¦</span><span class="Constant"> .2         .</span>
<span id="L2258" class="LineNr">2258 </span>  <span class="Conceal">¦</span><span class="Constant"> .3456↩     .</span>
<span id="L2259" class="LineNr">2259 </span>  <span class="Conceal">¦</span><span class="Constant"> .78        .</span>
<span id="L2260" class="LineNr">2260 </span>  <span class="Conceal">¦</span><span class="Constant"> .9         .</span>
<span id="L2261" class="LineNr">2261 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2262" class="LineNr">2262 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2263" class="LineNr">2263 </span>  ]
<span id="L2264" class="LineNr">2264 </span>  <span class="Comment"># position cursor on screen line after the wrap and hit ctrl-u</span>
<span id="L2265" class="LineNr">2265 </span>  assume-console [
<span id="L2266" class="LineNr">2266 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 1</span>  <span class="Comment"># on '8'</span>
<span id="L2267" class="LineNr">2267 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2268" class="LineNr">2268 </span>  ]
<span id="L2269" class="LineNr">2269 </span>  run [
<span id="L2270" class="LineNr">2270 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2271" class="LineNr">2271 </span>  <span class="Conceal">¦</span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2272" class="LineNr">2272 </span>  <span class="Conceal">¦</span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2273" class="LineNr">2273 </span>  ]
<span id="L2274" class="LineNr">2274 </span>  screen-should-contain [
<span id="L2275" class="LineNr">2275 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2276" class="LineNr">2276 </span>  <span class="Conceal">¦</span><span class="Constant"> .1         .</span>
<span id="L2277" class="LineNr">2277 </span>  <span class="Conceal">¦</span><span class="Constant"> .2         .</span>
<span id="L2278" class="LineNr">2278 </span>  <span class="Conceal">¦</span><span class="Constant"> .8         .</span>
<span id="L2279" class="LineNr">2279 </span>  <span class="Conceal">¦</span><span class="Constant"> .9         .</span>
<span id="L2280" class="LineNr">2280 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2281" class="LineNr">2281 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2282" class="LineNr">2282 </span>  ]
<span id="L2283" class="LineNr">2283 </span>  <span class="Comment"># cursor moves up one screen line</span>
<span id="L2284" class="LineNr">2284 </span>  memory-should-contain [
<span id="L2285" class="LineNr">2285 </span>  <span class="Conceal">¦</span><span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor-row</span>
<span id="L2286" class="LineNr">2286 </span>  <span class="Conceal">¦</span><span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2287" class="LineNr">2287 </span>  ]
<span id="L2288" class="LineNr">2288 </span>]
<span id="L2289" class="LineNr">2289 </span>
<span id="L2290" class="LineNr">2290 </span><span class="Comment"># line wrapping twice (taking up 3 screen lines)</span>
<span id="L2291" class="LineNr">2291 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-3 [
<span id="L2292" class="LineNr">2292 </span>  <span class="Constant">local-scope</span>
<span id="L2293" class="LineNr">2293 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2294" class="LineNr">2294 </span>  <span class="Comment"># third line starts out wrapping</span>
<span id="L2295" class="LineNr">2295 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1</span>
<span id="L2296" class="LineNr">2296 </span><span class="Constant">2</span>
<span id="L2297" class="LineNr">2297 </span><span class="Constant">3456789abcd</span>
<span id="L2298" class="LineNr">2298 </span><span class="Constant">e]</span>
<span id="L2299" class="LineNr">2299 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2300" class="LineNr">2300 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2301" class="LineNr">2301 </span>  assume-console [
<span id="L2302" class="LineNr">2302 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 1</span>  <span class="Comment"># on '8'</span>
<span id="L2303" class="LineNr">2303 </span>  ]
<span id="L2304" class="LineNr">2304 </span>  <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2305" class="LineNr">2305 </span>  screen-should-contain [
<span id="L2306" class="LineNr">2306 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2307" class="LineNr">2307 </span>  <span class="Conceal">¦</span><span class="Constant"> .1         .</span>
<span id="L2308" class="LineNr">2308 </span>  <span class="Conceal">¦</span><span class="Constant"> .2         .</span>
<span id="L2309" class="LineNr">2309 </span>  <span class="Conceal">¦</span><span class="Constant"> .3456↩     .</span>
<span id="L2310" class="LineNr">2310 </span>  <span class="Conceal">¦</span><span class="Constant"> .789a↩     .</span>
<span id="L2311" class="LineNr">2311 </span>  <span class="Conceal">¦</span><span class="Constant"> .bcd       .</span>
<span id="L2312" class="LineNr">2312 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L2313" class="LineNr">2313 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2314" class="LineNr">2314 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2315" class="LineNr">2315 </span>  ]
<span id="L2316" class="LineNr">2316 </span>  assume-console [
<span id="L2317" class="LineNr">2317 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 5</span>,<span class="Constant"> 1</span>
<span id="L2318" class="LineNr">2318 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2319" class="LineNr">2319 </span>  ]
<span id="L2320" class="LineNr">2320 </span>  run [
<span id="L2321" class="LineNr">2321 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2322" class="LineNr">2322 </span>  <span class="Conceal">¦</span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2323" class="LineNr">2323 </span>  <span class="Conceal">¦</span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2324" class="LineNr">2324 </span>  ]
<span id="L2325" class="LineNr">2325 </span>  screen-should-contain [
<span id="L2326" class="LineNr">2326 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2327" class="LineNr">2327 </span>  <span class="Conceal">¦</span><span class="Constant"> .1         .</span>
<span id="L2328" class="LineNr">2328 </span>  <span class="Conceal">¦</span><span class="Constant"> .2         .</span>
<span id="L2329" class="LineNr">2329 </span>  <span class="Conceal">¦</span><span class="Constant"> .cd        .</span>
<span id="L2330" class="LineNr">2330 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L2331" class="LineNr">2331 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2332" class="LineNr">2332 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2333" class="LineNr">2333 </span>  ]
<span id="L2334" class="LineNr">2334 </span>  <span class="Comment"># make sure we adjusted cursor-row</span>
<span id="L2335" class="LineNr">2335 </span>  memory-should-contain [
<span id="L2336" class="LineNr">2336 </span>  <span class="Conceal">¦</span><span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor-row</span>
<span id="L2337" class="LineNr">2337 </span>  <span class="Conceal">¦</span><span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2338" class="LineNr">2338 </span>  ]
<span id="L2339" class="LineNr">2339 </span>]
<span id="L2340" class="LineNr">2340 </span>
<span id="L2341" class="LineNr">2341 </span><span class="Comment"># adjusting cursor row at the top of the screen</span>
<span id="L2342" class="LineNr">2342 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-4 [
<span id="L2343" class="LineNr">2343 </span>  <span class="Constant">local-scope</span>
<span id="L2344" class="LineNr">2344 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2345" class="LineNr">2345 </span>  <span class="Comment"># first line starts out wrapping</span>
<span id="L2346" class="LineNr">2346 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1234567</span>
<span id="L2347" class="LineNr">2347 </span><span class="Constant">89]</span>
<span id="L2348" class="LineNr">2348 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2349" class="LineNr">2349 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2350" class="LineNr">2350 </span>  screen-should-contain [
<span id="L2351" class="LineNr">2351 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2352" class="LineNr">2352 </span>  <span class="Conceal">¦</span><span class="Constant"> .1234↩     .</span>
<span id="L2353" class="LineNr">2353 </span>  <span class="Conceal">¦</span><span class="Constant"> .567       .</span>
<span id="L2354" class="LineNr">2354 </span>  <span class="Conceal">¦</span><span class="Constant"> .89        .</span>
<span id="L2355" class="LineNr">2355 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2356" class="LineNr">2356 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2357" class="LineNr">2357 </span>  ]
<span id="L2358" class="LineNr">2358 </span>  <span class="Comment"># position cursor on second screen line (after the wrap) and hit ctrl-u</span>
<span id="L2359" class="LineNr">2359 </span>  assume-console [
<span id="L2360" class="LineNr">2360 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L2361" class="LineNr">2361 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2362" class="LineNr">2362 </span>  ]
<span id="L2363" class="LineNr">2363 </span>  run [
<span id="L2364" class="LineNr">2364 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2365" class="LineNr">2365 </span>  <span class="Conceal">¦</span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2366" class="LineNr">2366 </span>  <span class="Conceal">¦</span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2367" class="LineNr">2367 </span>  ]
<span id="L2368" class="LineNr">2368 </span>  screen-should-contain [
<span id="L2369" class="LineNr">2369 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2370" class="LineNr">2370 </span>  <span class="Conceal">¦</span><span class="Constant"> .67        .</span>
<span id="L2371" class="LineNr">2371 </span>  <span class="Conceal">¦</span><span class="Constant"> .89        .</span>
<span id="L2372" class="LineNr">2372 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2373" class="LineNr">2373 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2374" class="LineNr">2374 </span>  ]
<span id="L2375" class="LineNr">2375 </span>  <span class="Comment"># cursor moves up to screen line 1</span>
<span id="L2376" class="LineNr">2376 </span>  memory-should-contain [
<span id="L2377" class="LineNr">2377 </span>  <span class="Conceal">¦</span><span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L2378" class="LineNr">2378 </span>  <span class="Conceal">¦</span><span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2379" class="LineNr">2379 </span>  ]
<span id="L2380" class="LineNr">2380 </span>]
<span id="L2381" class="LineNr">2381 </span>
<span id="L2382" class="LineNr">2382 </span><span class="Comment"># screen begins part-way through a wrapping line</span>
<span id="L2383" class="LineNr">2383 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-5 [
<span id="L2384" class="LineNr">2384 </span>  <span class="Constant">local-scope</span>
<span id="L2385" class="LineNr">2385 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2386" class="LineNr">2386 </span>  <span class="Comment"># third line starts out wrapping</span>
<span id="L2387" class="LineNr">2387 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1</span>
<span id="L2388" class="LineNr">2388 </span><span class="Constant">2</span>
<span id="L2389" class="LineNr">2389 </span><span class="Constant">345678</span>
<span id="L2390" class="LineNr">2390 </span><span class="Constant">9]</span>
<span id="L2391" class="LineNr">2391 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2392" class="LineNr">2392 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2393" class="LineNr">2393 </span>  <span class="Comment"># position the '78' line at the top of the screen</span>
<span id="L2394" class="LineNr">2394 </span>  assume-console [
<span id="L2395" class="LineNr">2395 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 1</span>  <span class="Comment"># on '8'</span>
<span id="L2396" class="LineNr">2396 </span>  <span class="Conceal">¦</span> press ctrl-t
<span id="L2397" class="LineNr">2397 </span>  ]
<span id="L2398" class="LineNr">2398 </span>  <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2399" class="LineNr">2399 </span>  screen-should-contain [
<span id="L2400" class="LineNr">2400 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2401" class="LineNr">2401 </span>  <span class="Conceal">¦</span><span class="Constant"> .78        .</span>
<span id="L2402" class="LineNr">2402 </span>  <span class="Conceal">¦</span><span class="Constant"> .9         .</span>
<span id="L2403" class="LineNr">2403 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2404" class="LineNr">2404 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2405" class="LineNr">2405 </span>  ]
<span id="L2406" class="LineNr">2406 </span>  assume-console [
<span id="L2407" class="LineNr">2407 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L2408" class="LineNr">2408 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2409" class="LineNr">2409 </span>  ]
<span id="L2410" class="LineNr">2410 </span>  run [
<span id="L2411" class="LineNr">2411 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2412" class="LineNr">2412 </span>  <span class="Conceal">¦</span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2413" class="LineNr">2413 </span>  <span class="Conceal">¦</span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2414" class="LineNr">2414 </span>  ]
<span id="L2415" class="LineNr">2415 </span>  <span class="Comment"># make sure we updated top-of-screen correctly</span>
<span id="L2416" class="LineNr">2416 </span>  screen-should-contain [
<span id="L2417" class="LineNr">2417 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2418" class="LineNr">2418 </span>  <span class="Conceal">¦</span><span class="Constant"> .8         .</span>
<span id="L2419" class="LineNr">2419 </span>  <span class="Conceal">¦</span><span class="Constant"> .9         .</span>
<span id="L2420" class="LineNr">2420 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2421" class="LineNr">2421 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2422" class="LineNr">2422 </span>  ]
<span id="L2423" class="LineNr">2423 </span>  memory-should-contain [
<span id="L2424" class="LineNr">2424 </span>  <span class="Conceal">¦</span><span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L2425" class="LineNr">2425 </span>  <span class="Conceal">¦</span><span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2426" class="LineNr">2426 </span>  ]
<span id="L2427" class="LineNr">2427 </span>  <span class="Comment"># the entire line is deleted, even the part not shown on screen</span>
<span id="L2428" class="LineNr">2428 </span>  assume-console [
<span id="L2429" class="LineNr">2429 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L2430" class="LineNr">2430 </span>  ]
<span id="L2431" class="LineNr">2431 </span>  run [
<span id="L2432" class="LineNr">2432 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2433" class="LineNr">2433 </span>  ]
<span id="L2434" class="LineNr">2434 </span>  screen-should-contain [
<span id="L2435" class="LineNr">2435 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2436" class="LineNr">2436 </span>  <span class="Conceal">¦</span><span class="Constant"> .2         .</span>
<span id="L2437" class="LineNr">2437 </span>  <span class="Conceal">¦</span><span class="Constant"> .8         .</span>
<span id="L2438" class="LineNr">2438 </span>  <span class="Conceal">¦</span><span class="Constant"> .9         .</span>
<span id="L2439" class="LineNr">2439 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2440" class="LineNr">2440 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2441" class="LineNr">2441 </span>  ]
<span id="L2442" class="LineNr">2442 </span>]
<span id="L2443" class="LineNr">2443 </span>
<span id="L2444" class="LineNr">2444 </span><span class="Comment"># screen begins part-way through a line wrapping twice (taking up 3 screen lines)</span>
<span id="L2445" class="LineNr">2445 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-6 [
<span id="L2446" class="LineNr">2446 </span>  <span class="Constant">local-scope</span>
<span id="L2447" class="LineNr">2447 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2448" class="LineNr">2448 </span>  <span class="Comment"># third line starts out wrapping</span>
<span id="L2449" class="LineNr">2449 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1</span>
<span id="L2450" class="LineNr">2450 </span><span class="Constant">2</span>
<span id="L2451" class="LineNr">2451 </span><span class="Constant">3456789abcd</span>
<span id="L2452" class="LineNr">2452 </span><span class="Constant">e]</span>
<span id="L2453" class="LineNr">2453 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2454" class="LineNr">2454 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2455" class="LineNr">2455 </span>  <span class="Comment"># position the 'bcd' line at the top of the screen</span>
<span id="L2456" class="LineNr">2456 </span>  assume-console [
<span id="L2457" class="LineNr">2457 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 1</span>  <span class="Comment"># on '8'</span>
<span id="L2458" class="LineNr">2458 </span>  <span class="Conceal">¦</span> press ctrl-t
<span id="L2459" class="LineNr">2459 </span>  <span class="Conceal">¦</span> press ctrl-s  <span class="Comment"># now on 'c'</span>
<span id="L2460" class="LineNr">2460 </span>  ]
<span id="L2461" class="LineNr">2461 </span>  <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2462" class="LineNr">2462 </span>  screen-should-contain [
<span id="L2463" class="LineNr">2463 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2464" class="LineNr">2464 </span>  <span class="Conceal">¦</span><span class="Constant"> .bcd       .</span>
<span id="L2465" class="LineNr">2465 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L2466" class="LineNr">2466 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2467" class="LineNr">2467 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2468" class="LineNr">2468 </span>  ]
<span id="L2469" class="LineNr">2469 </span>  assume-console [
<span id="L2470" class="LineNr">2470 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L2471" class="LineNr">2471 </span>  <span class="Conceal">¦</span> press ctrl-u
<span id="L2472" class="LineNr">2472 </span>  ]
<span id="L2473" class="LineNr">2473 </span>  run [
<span id="L2474" class="LineNr">2474 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2475" class="LineNr">2475 </span>  <span class="Conceal">¦</span> 10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2476" class="LineNr">2476 </span>  <span class="Conceal">¦</span> 11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2477" class="LineNr">2477 </span>  ]
<span id="L2478" class="LineNr">2478 </span>  <span class="Comment"># make sure we updated top-of-screen correctly</span>
<span id="L2479" class="LineNr">2479 </span>  screen-should-contain [
<span id="L2480" class="LineNr">2480 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2481" class="LineNr">2481 </span>  <span class="Conceal">¦</span><span class="Constant"> .cd        .</span>
<span id="L2482" class="LineNr">2482 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L2483" class="LineNr">2483 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2484" class="LineNr">2484 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2485" class="LineNr">2485 </span>  ]
<span id="L2486" class="LineNr">2486 </span>  memory-should-contain [
<span id="L2487" class="LineNr">2487 </span>  <span class="Conceal">¦</span><span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L2488" class="LineNr">2488 </span>  <span class="Conceal">¦</span><span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2489" class="LineNr">2489 </span>  ]
<span id="L2490" class="LineNr">2490 </span>  <span class="Comment"># the entire line is deleted, even the part not shown on screen</span>
<span id="L2491" class="LineNr">2491 </span>  assume-console [
<span id="L2492" class="LineNr">2492 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L2493" class="LineNr">2493 </span>  ]
<span id="L2494" class="LineNr">2494 </span>  run [
<span id="L2495" class="LineNr">2495 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2496" class="LineNr">2496 </span>  ]
<span id="L2497" class="LineNr">2497 </span>  screen-should-contain [
<span id="L2498" class="LineNr">2498 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2499" class="LineNr">2499 </span>  <span class="Conceal">¦</span><span class="Constant"> .2         .</span>
<span id="L2500" class="LineNr">2500 </span>  <span class="Conceal">¦</span><span class="Constant"> .cd        .</span>
<span id="L2501" class="LineNr">2501 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L2502" class="LineNr">2502 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2503" class="LineNr">2503 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2504" class="LineNr">2504 </span>  ]
<span id="L2505" class="LineNr">2505 </span>]
<span id="L2506" class="LineNr">2506 </span>
<span id="L2507" class="LineNr">2507 </span><span class="Comment"># ctrl-k - delete text from cursor to end of line (but not the newline)</span>
<span id="L2508" class="LineNr">2508 </span>
<span id="L2509" class="LineNr">2509 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k [
<span id="L2510" class="LineNr">2510 </span>  <span class="Constant">local-scope</span>
<span id="L2511" class="LineNr">2511 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2512" class="LineNr">2512 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2513" class="LineNr">2513 </span><span class="Constant">456]</span>
<span id="L2514" class="LineNr">2514 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2515" class="LineNr">2515 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2516" class="LineNr">2516 </span>  $clear-trace
<span id="L2517" class="LineNr">2517 </span>  <span class="Comment"># start on first line, press ctrl-k</span>
<span id="L2518" class="LineNr">2518 </span>  assume-console [
<span id="L2519" class="LineNr">2519 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L2520" class="LineNr">2520 </span>  <span class="Conceal">¦</span> press ctrl-k
<span id="L2521" class="LineNr">2521 </span>  ]
<span id="L2522" class="LineNr">2522 </span>  run [
<span id="L2523" class="LineNr">2523 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2524" class="LineNr">2524 </span>  ]
<span id="L2525" class="LineNr">2525 </span>  <span class="Comment"># cursor deletes to end of line</span>
<span id="L2526" class="LineNr">2526 </span>  screen-should-contain [
<span id="L2527" class="LineNr">2527 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2528" class="LineNr">2528 </span>  <span class="Conceal">¦</span><span class="Constant"> .1         .</span>
<span id="L2529" class="LineNr">2529 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L2530" class="LineNr">2530 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2531" class="LineNr">2531 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2532" class="LineNr">2532 </span>  ]
<span id="L2533" class="LineNr">2533 </span>  check-trace-count-for-label<span class="Constant"> 9</span>, <span class="Constant">[print-character]</span>
<span id="L2534" class="LineNr">2534 </span>]
<span id="L2535" class="LineNr">2535 </span>
<span id="L2536" class="LineNr">2536 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L2537" class="LineNr">2537 </span>  <span class="Delimiter">{</span>
<span id="L2538" class="LineNr">2538 </span>  <span class="Conceal">¦</span> delete-to-end-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">11/ctrl-k</span>
<span id="L2539" class="LineNr">2539 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> delete-to-end-of-line?
<span id="L2540" class="LineNr">2540 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='003-shortcuts.mu.html#L2540'>&lt;delete-to-end-of-line-begin&gt;</a></span>
<span id="L2541" class="LineNr">2541 </span>  <span class="Conceal">¦</span> deleted-cells:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2567'>delete-to-end-of-line</a> editor
<span id="L2542" class="LineNr">2542 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='003-shortcuts.mu.html#L2542'>&lt;delete-to-end-of-line-end&gt;</a></span>
<span id="L2543" class="LineNr">2543 </span>  <span class="Conceal">¦</span> <span class="Comment"># checks if we can do a minimal render and if we can it will do a minimal render</span>
<span id="L2544" class="LineNr">2544 </span>  <span class="Conceal">¦</span> go-render?:bool <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2549'>minimal-render-for-ctrl-k</a> <a href='../081print.mu.html#L16'>screen</a>, editor, deleted-cells
<span id="L2545" class="LineNr">2545 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L2546" class="LineNr">2546 </span>  <span class="Delimiter">}</span>
<span id="L2547" class="LineNr">2547 </span>]
<span id="L2548" class="LineNr">2548 </span>
<span id="L2549" class="LineNr">2549 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2549'>minimal-render-for-ctrl-k</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, editor:&amp;:editor, deleted-cells:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char<span class="muRecipe"> -&gt; </span>go-render?:bool, <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a> [
<span id="L2550" class="LineNr">2550 </span>  <span class="Constant">local-scope</span>
<span id="L2551" class="LineNr">2551 </span>  <span class="Constant">load-ingredients</span>
<span id="L2552" class="LineNr">2552 </span>  <span class="Comment"># if we deleted nothing, there's nothing to render</span>
<span id="L2553" class="LineNr">2553 </span>  <span class="muControl">return-unless</span> deleted-cells, <span class="Constant">0/dont-render</span>
<span id="L2554" class="LineNr">2554 </span>  <span class="Comment"># if the line used to wrap before, give up and render the whole screen</span>
<span id="L2555" class="LineNr">2555 </span>  curr-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L2556" class="LineNr">2556 </span>  num-deleted-cells:num <span class="Special">&lt;-</span> length deleted-cells
<span id="L2557" class="LineNr">2557 </span>  old-row-len:num <span class="Special">&lt;-</span> add curr-column, num-deleted-cells
<span id="L2558" class="LineNr">2558 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L2559" class="LineNr">2559 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L2560" class="LineNr">2560 </span>  end:num <span class="Special">&lt;-</span> subtract right, left
<span id="L2561" class="LineNr">2561 </span>  wrap?:bool <span class="Special">&lt;-</span> greater-or-equal old-row-len, end
<span id="L2562" class="LineNr">2562 </span>  <span class="muControl">return-if</span> wrap?, <span class="Constant">1/go-render</span>
<span id="L2563" class="LineNr">2563 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right
<span id="L2564" class="LineNr">2564 </span>  <span class="muControl">return</span> <span class="Constant">0/dont-render</span>
<span id="L2565" class="LineNr">2565 </span>]
<span id="L2566" class="LineNr">2566 </span>
<span id="L2567" class="LineNr">2567 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2567'>delete-to-end-of-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char, editor:&amp;:editor [
<span id="L2568" class="LineNr">2568 </span>  <span class="Constant">local-scope</span>
<span id="L2569" class="LineNr">2569 </span>  <span class="Constant">load-ingredients</span>
<span id="L2570" class="LineNr">2570 </span>  <span class="Comment"># compute range to delete</span>
<span id="L2571" class="LineNr">2571 </span>  start:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L2572" class="LineNr">2572 </span>  end:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> start
<span id="L2573" class="LineNr">2573 </span>  <span class="Delimiter">{</span>
<span id="L2574" class="LineNr">2574 </span>  <span class="Conceal">¦</span> at-end-of-text?:bool <span class="Special">&lt;-</span> equal end, <span class="Constant">0/null</span>
<span id="L2575" class="LineNr">2575 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-end-of-text?
<span id="L2576" class="LineNr">2576 </span>  <span class="Conceal">¦</span> curr:char <span class="Special">&lt;-</span> get *end, <span class="Constant">value:offset</span>
<span id="L2577" class="LineNr">2577 </span>  <span class="Conceal">¦</span> at-end-of-line?:bool <span class="Special">&lt;-</span> equal curr, <span class="Constant">10/newline</span>
<span id="L2578" class="LineNr">2578 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-end-of-line?
<span id="L2579" class="LineNr">2579 </span>  <span class="Conceal">¦</span> end <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> end
<span id="L2580" class="LineNr">2580 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L2581" class="LineNr">2581 </span>  <span class="Delimiter">}</span>
<span id="L2582" class="LineNr">2582 </span>  <span class="Comment"># snip it out</span>
<span id="L2583" class="LineNr">2583 </span>  result <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> start
<span id="L2584" class="LineNr">2584 </span>  <a href='../065duplex_list.mu.html#L389'>remove-between</a> start, end
<span id="L2585" class="LineNr">2585 </span>]
<span id="L2586" class="LineNr">2586 </span>
<span id="L2587" class="LineNr">2587 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-2 [
<span id="L2588" class="LineNr">2588 </span>  <span class="Constant">local-scope</span>
<span id="L2589" class="LineNr">2589 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2590" class="LineNr">2590 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2591" class="LineNr">2591 </span><span class="Constant">456]</span>
<span id="L2592" class="LineNr">2592 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2593" class="LineNr">2593 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2594" class="LineNr">2594 </span>  $clear-trace
<span id="L2595" class="LineNr">2595 </span>  <span class="Comment"># start on second line (no newline after), press ctrl-k</span>
<span id="L2596" class="LineNr">2596 </span>  assume-console [
<span id="L2597" class="LineNr">2597 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L2598" class="LineNr">2598 </span>  <span class="Conceal">¦</span> press ctrl-k
<span id="L2599" class="LineNr">2599 </span>  ]
<span id="L2600" class="LineNr">2600 </span>  run [
<span id="L2601" class="LineNr">2601 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2602" class="LineNr">2602 </span>  ]
<span id="L2603" class="LineNr">2603 </span>  <span class="Comment"># cursor deletes to end of line</span>
<span id="L2604" class="LineNr">2604 </span>  screen-should-contain [
<span id="L2605" class="LineNr">2605 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2606" class="LineNr">2606 </span>  <span class="Conceal">¦</span><span class="Constant"> .123       .</span>
<span id="L2607" class="LineNr">2607 </span>  <span class="Conceal">¦</span><span class="Constant"> .4         .</span>
<span id="L2608" class="LineNr">2608 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2609" class="LineNr">2609 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2610" class="LineNr">2610 </span>  ]
<span id="L2611" class="LineNr">2611 </span>  check-trace-count-for-label<span class="Constant"> 9</span>, <span class="Constant">[print-character]</span>
<span id="L2612" class="LineNr">2612 </span>]
<span id="L2613" class="LineNr">2613 </span>
<span id="L2614" class="LineNr">2614 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-3 [
<span id="L2615" class="LineNr">2615 </span>  <span class="Constant">local-scope</span>
<span id="L2616" class="LineNr">2616 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2617" class="LineNr">2617 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2618" class="LineNr">2618 </span><span class="Constant">456]</span>
<span id="L2619" class="LineNr">2619 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2620" class="LineNr">2620 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2621" class="LineNr">2621 </span>  $clear-trace
<span id="L2622" class="LineNr">2622 </span>  <span class="Comment"># start at end of line</span>
<span id="L2623" class="LineNr">2623 </span>  assume-console [
<span id="L2624" class="LineNr">2624 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
<span id="L2625" class="LineNr">2625 </span>  <span class="Conceal">¦</span> press ctrl-k
<span id="L2626" class="LineNr">2626 </span>  ]
<span id="L2627" class="LineNr">2627 </span>  run [
<span id="L2628" class="LineNr">2628 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2629" class="LineNr">2629 </span>  ]
<span id="L2630" class="LineNr">2630 </span>  <span class="Comment"># cursor deletes just last character</span>
<span id="L2631" class="LineNr">2631 </span>  screen-should-contain [
<span id="L2632" class="LineNr">2632 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2633" class="LineNr">2633 </span>  <span class="Conceal">¦</span><span class="Constant"> .12        .</span>
<span id="L2634" class="LineNr">2634 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L2635" class="LineNr">2635 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2636" class="LineNr">2636 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2637" class="LineNr">2637 </span>  ]
<span id="L2638" class="LineNr">2638 </span>  check-trace-count-for-label<span class="Constant"> 8</span>, <span class="Constant">[print-character]</span>
<span id="L2639" class="LineNr">2639 </span>]
<span id="L2640" class="LineNr">2640 </span>
<span id="L2641" class="LineNr">2641 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-4 [
<span id="L2642" class="LineNr">2642 </span>  <span class="Constant">local-scope</span>
<span id="L2643" class="LineNr">2643 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2644" class="LineNr">2644 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2645" class="LineNr">2645 </span><span class="Constant">456]</span>
<span id="L2646" class="LineNr">2646 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2647" class="LineNr">2647 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2648" class="LineNr">2648 </span>  $clear-trace
<span id="L2649" class="LineNr">2649 </span>  <span class="Comment"># start past end of line</span>
<span id="L2650" class="LineNr">2650 </span>  assume-console [
<span id="L2651" class="LineNr">2651 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L2652" class="LineNr">2652 </span>  <span class="Conceal">¦</span> press ctrl-k
<span id="L2653" class="LineNr">2653 </span>  ]
<span id="L2654" class="LineNr">2654 </span>  run [
<span id="L2655" class="LineNr">2655 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2656" class="LineNr">2656 </span>  ]
<span id="L2657" class="LineNr">2657 </span>  <span class="Comment"># cursor deletes nothing</span>
<span id="L2658" class="LineNr">2658 </span>  screen-should-contain [
<span id="L2659" class="LineNr">2659 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2660" class="LineNr">2660 </span>  <span class="Conceal">¦</span><span class="Constant"> .123       .</span>
<span id="L2661" class="LineNr">2661 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L2662" class="LineNr">2662 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2663" class="LineNr">2663 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2664" class="LineNr">2664 </span>  ]
<span id="L2665" class="LineNr">2665 </span>  check-trace-count-for-label<span class="Constant"> 7</span>, <span class="Constant">[print-character]</span>
<span id="L2666" class="LineNr">2666 </span>]
<span id="L2667" class="LineNr">2667 </span>
<span id="L2668" class="LineNr">2668 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-5 [
<span id="L2669" class="LineNr">2669 </span>  <span class="Constant">local-scope</span>
<span id="L2670" class="LineNr">2670 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2671" class="LineNr">2671 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2672" class="LineNr">2672 </span><span class="Constant">456]</span>
<span id="L2673" class="LineNr">2673 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2674" class="LineNr">2674 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2675" class="LineNr">2675 </span>  $clear-trace
<span id="L2676" class="LineNr">2676 </span>  <span class="Comment"># start at end of text</span>
<span id="L2677" class="LineNr">2677 </span>  assume-console [
<span id="L2678" class="LineNr">2678 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
<span id="L2679" class="LineNr">2679 </span>  <span class="Conceal">¦</span> press ctrl-k
<span id="L2680" class="LineNr">2680 </span>  ]
<span id="L2681" class="LineNr">2681 </span>  run [
<span id="L2682" class="LineNr">2682 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2683" class="LineNr">2683 </span>  ]
<span id="L2684" class="LineNr">2684 </span>  <span class="Comment"># cursor deletes just the final character</span>
<span id="L2685" class="LineNr">2685 </span>  screen-should-contain [
<span id="L2686" class="LineNr">2686 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2687" class="LineNr">2687 </span>  <span class="Conceal">¦</span><span class="Constant"> .123       .</span>
<span id="L2688" class="LineNr">2688 </span>  <span class="Conceal">¦</span><span class="Constant"> .45        .</span>
<span id="L2689" class="LineNr">2689 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2690" class="LineNr">2690 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2691" class="LineNr">2691 </span>  ]
<span id="L2692" class="LineNr">2692 </span>  check-trace-count-for-label<span class="Constant"> 8</span>, <span class="Constant">[print-character]</span>
<span id="L2693" class="LineNr">2693 </span>]
<span id="L2694" class="LineNr">2694 </span>
<span id="L2695" class="LineNr">2695 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-6 [
<span id="L2696" class="LineNr">2696 </span>  <span class="Constant">local-scope</span>
<span id="L2697" class="LineNr">2697 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2698" class="LineNr">2698 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2699" class="LineNr">2699 </span><span class="Constant">456]</span>
<span id="L2700" class="LineNr">2700 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2701" class="LineNr">2701 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2702" class="LineNr">2702 </span>  $clear-trace
<span id="L2703" class="LineNr">2703 </span>  <span class="Comment"># start past end of text</span>
<span id="L2704" class="LineNr">2704 </span>  assume-console [
<span id="L2705" class="LineNr">2705 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L2706" class="LineNr">2706 </span>  <span class="Conceal">¦</span> press ctrl-k
<span id="L2707" class="LineNr">2707 </span>  ]
<span id="L2708" class="LineNr">2708 </span>  run [
<span id="L2709" class="LineNr">2709 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2710" class="LineNr">2710 </span>  ]
<span id="L2711" class="LineNr">2711 </span>  <span class="Comment"># cursor deletes nothing</span>
<span id="L2712" class="LineNr">2712 </span>  screen-should-contain [
<span id="L2713" class="LineNr">2713 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2714" class="LineNr">2714 </span>  <span class="Conceal">¦</span><span class="Constant"> .123       .</span>
<span id="L2715" class="LineNr">2715 </span>  <span class="Conceal">¦</span><span class="Constant"> .456       .</span>
<span id="L2716" class="LineNr">2716 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2717" class="LineNr">2717 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2718" class="LineNr">2718 </span>  ]
<span id="L2719" class="LineNr">2719 </span>  <span class="Comment"># no prints necessary</span>
<span id="L2720" class="LineNr">2720 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L2721" class="LineNr">2721 </span>]
<span id="L2722" class="LineNr">2722 </span>
<span id="L2723" class="LineNr">2723 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-wrapped-line-with-ctrl-k [
<span id="L2724" class="LineNr">2724 </span>  <span class="Constant">local-scope</span>
<span id="L2725" class="LineNr">2725 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2726" class="LineNr">2726 </span>  <span class="Comment"># create an editor with the first line wrapping to a second screen row</span>
<span id="L2727" class="LineNr">2727 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1234</span>
<span id="L2728" class="LineNr">2728 </span><span class="Constant">567]</span>
<span id="L2729" class="LineNr">2729 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
<span id="L2730" class="LineNr">2730 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2731" class="LineNr">2731 </span>  $clear-trace
<span id="L2732" class="LineNr">2732 </span>  <span class="Comment"># delete all of the first wrapped line</span>
<span id="L2733" class="LineNr">2733 </span>  assume-console [
<span id="L2734" class="LineNr">2734 </span>  <span class="Conceal">¦</span> press ctrl-k
<span id="L2735" class="LineNr">2735 </span>  ]
<span id="L2736" class="LineNr">2736 </span>  run [
<span id="L2737" class="LineNr">2737 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2738" class="LineNr">2738 </span>  ]
<span id="L2739" class="LineNr">2739 </span>  <span class="Comment"># screen shows an empty unwrapped first line</span>
<span id="L2740" class="LineNr">2740 </span>  screen-should-contain [
<span id="L2741" class="LineNr">2741 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2742" class="LineNr">2742 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2743" class="LineNr">2743 </span>  <span class="Conceal">¦</span><span class="Constant"> .567       .</span>
<span id="L2744" class="LineNr">2744 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌      .</span>
<span id="L2745" class="LineNr">2745 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2746" class="LineNr">2746 </span>  ]
<span id="L2747" class="LineNr">2747 </span>  <span class="Comment"># entire screen is refreshed</span>
<span id="L2748" class="LineNr">2748 </span>  check-trace-count-for-label<span class="Constant"> 16</span>, <span class="Constant">[print-character]</span>
<span id="L2749" class="LineNr">2749 </span>]
<span id="L2750" class="LineNr">2750 </span>
<span id="L2751" class="LineNr">2751 </span><span class="Comment"># scroll down if necessary</span>
<span id="L2752" class="LineNr">2752 </span>
<span id="L2753" class="LineNr">2753 </span><span class="muScenario">scenario</span> editor-can-scroll-down-using-arrow-keys [
<span id="L2754" class="LineNr">2754 </span>  <span class="Constant">local-scope</span>
<span id="L2755" class="LineNr">2755 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2756" class="LineNr">2756 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L2757" class="LineNr">2757 </span>  <span class="Comment"># initialize editor with &gt;3 lines</span>
<span id="L2758" class="LineNr">2758 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L2759" class="LineNr">2759 </span><span class="Constant">b</span>
<span id="L2760" class="LineNr">2760 </span><span class="Constant">c</span>
<span id="L2761" class="LineNr">2761 </span><span class="Constant">d]</span>
<span id="L2762" class="LineNr">2762 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2763" class="LineNr">2763 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2764" class="LineNr">2764 </span>  screen-should-contain [
<span id="L2765" class="LineNr">2765 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2766" class="LineNr">2766 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L2767" class="LineNr">2767 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L2768" class="LineNr">2768 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L2769" class="LineNr">2769 </span>  ]
<span id="L2770" class="LineNr">2770 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
<span id="L2771" class="LineNr">2771 </span>  assume-console [
<span id="L2772" class="LineNr">2772 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L2773" class="LineNr">2773 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L2774" class="LineNr">2774 </span>  ]
<span id="L2775" class="LineNr">2775 </span>  run [
<span id="L2776" class="LineNr">2776 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2777" class="LineNr">2777 </span>  ]
<span id="L2778" class="LineNr">2778 </span>  <span class="Comment"># screen slides by one line</span>
<span id="L2779" class="LineNr">2779 </span>  screen-should-contain [
<span id="L2780" class="LineNr">2780 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2781" class="LineNr">2781 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L2782" class="LineNr">2782 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L2783" class="LineNr">2783 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L2784" class="LineNr">2784 </span>  ]
<span id="L2785" class="LineNr">2785 </span>]
<span id="L2786" class="LineNr">2786 </span>
<span id="L2787" class="LineNr">2787 </span><span class="muRecipe">after</span> <span class="Constant">&lt;scroll-down&gt;</span> [
<span id="L2788" class="LineNr">2788 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[scroll down]</span>
<span id="L2789" class="LineNr">2789 </span>  top-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L2790" class="LineNr">2790 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L2791" class="LineNr">2791 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L2792" class="LineNr">2792 </span>  max:num <span class="Special">&lt;-</span> subtract right, left
<span id="L2793" class="LineNr">2793 </span>  old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy top-of-screen
<span id="L2794" class="LineNr">2794 </span>  top-of-screen <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2804'>before-start-of-next-line</a> top-of-screen, max
<span id="L2795" class="LineNr">2795 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
<span id="L2796" class="LineNr">2796 </span>  no-movement?:bool <span class="Special">&lt;-</span> equal old-top, top-of-screen
<span id="L2797" class="LineNr">2797 </span>  <span class="muControl">return-if</span> no-movement?, <span class="Constant">0/don't-render</span>
<span id="L2798" class="LineNr">2798 </span>]
<span id="L2799" class="LineNr">2799 </span>
<span id="L2800" class="LineNr">2800 </span><span class="Comment"># Takes a pointer into the doubly-linked list, scans ahead at most 'max'</span>
<span id="L2801" class="LineNr">2801 </span><span class="Comment"># positions until the next newline.</span>
<span id="L2802" class="LineNr">2802 </span><span class="Comment"># Returns original if no next newline.</span>
<span id="L2803" class="LineNr">2803 </span><span class="Comment"># Beware: never return null pointer.</span>
<span id="L2804" class="LineNr">2804 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2804'>before-start-of-next-line</a> original:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char, max:num<span class="muRecipe"> -&gt; </span>curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char [
<span id="L2805" class="LineNr">2805 </span>  <span class="Constant">local-scope</span>
<span id="L2806" class="LineNr">2806 </span>  <span class="Constant">load-ingredients</span>
<span id="L2807" class="LineNr">2807 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L2808" class="LineNr">2808 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy original
<span id="L2809" class="LineNr">2809 </span>  <span class="Comment"># skip the initial newline if it exists</span>
<span id="L2810" class="LineNr">2810 </span>  <span class="Delimiter">{</span>
<span id="L2811" class="LineNr">2811 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L2812" class="LineNr">2812 </span>  <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L2813" class="LineNr">2813 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-newline?
<span id="L2814" class="LineNr">2814 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
<span id="L2815" class="LineNr">2815 </span>  <span class="Conceal">¦</span> count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
<span id="L2816" class="LineNr">2816 </span>  <span class="Delimiter">}</span>
<span id="L2817" class="LineNr">2817 </span>  <span class="Delimiter">{</span>
<span id="L2818" class="LineNr">2818 </span>  <span class="Conceal">¦</span> <span class="muControl">return-unless</span> curr, original
<span id="L2819" class="LineNr">2819 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
<span id="L2820" class="LineNr">2820 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L2821" class="LineNr">2821 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L2822" class="LineNr">2822 </span>  <span class="Conceal">¦</span> at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L2823" class="LineNr">2823 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-newline?
<span id="L2824" class="LineNr">2824 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
<span id="L2825" class="LineNr">2825 </span>  <span class="Conceal">¦</span> count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
<span id="L2826" class="LineNr">2826 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L2827" class="LineNr">2827 </span>  <span class="Delimiter">}</span>
<span id="L2828" class="LineNr">2828 </span>  <span class="muControl">return-unless</span> curr, original
<span id="L2829" class="LineNr">2829 </span>  <span class="muControl">return</span> curr
<span id="L2830" class="LineNr">2830 </span>]
<span id="L2831" class="LineNr">2831 </span>
<span id="L2832" class="LineNr">2832 </span><span class="muScenario">scenario</span> editor-scrolls-down-past-wrapped-line-using-arrow-keys [
<span id="L2833" class="LineNr">2833 </span>  <span class="Constant">local-scope</span>
<span id="L2834" class="LineNr">2834 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2835" class="LineNr">2835 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L2836" class="LineNr">2836 </span>  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
<span id="L2837" class="LineNr">2837 </span>  <span class="Comment"># other lines</span>
<span id="L2838" class="LineNr">2838 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
<span id="L2839" class="LineNr">2839 </span><span class="Constant">g</span>
<span id="L2840" class="LineNr">2840 </span><span class="Constant">h</span>
<span id="L2841" class="LineNr">2841 </span><span class="Constant">i]</span>
<span id="L2842" class="LineNr">2842 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2843" class="LineNr">2843 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2844" class="LineNr">2844 </span>  screen-should-contain [
<span id="L2845" class="LineNr">2845 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2846" class="LineNr">2846 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd↩     .</span>
<span id="L2847" class="LineNr">2847 </span>  <span class="Conceal">¦</span><span class="Constant"> .ef        .</span>
<span id="L2848" class="LineNr">2848 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L2849" class="LineNr">2849 </span>  ]
<span id="L2850" class="LineNr">2850 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
<span id="L2851" class="LineNr">2851 </span>  assume-console [
<span id="L2852" class="LineNr">2852 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L2853" class="LineNr">2853 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L2854" class="LineNr">2854 </span>  ]
<span id="L2855" class="LineNr">2855 </span>  run [
<span id="L2856" class="LineNr">2856 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2857" class="LineNr">2857 </span>  ]
<span id="L2858" class="LineNr">2858 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L2859" class="LineNr">2859 </span>  screen-should-contain [
<span id="L2860" class="LineNr">2860 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2861" class="LineNr">2861 </span>  <span class="Conceal">¦</span><span class="Constant"> .ef        .</span>
<span id="L2862" class="LineNr">2862 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L2863" class="LineNr">2863 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L2864" class="LineNr">2864 </span>  ]
<span id="L2865" class="LineNr">2865 </span>]
<span id="L2866" class="LineNr">2866 </span>
<span id="L2867" class="LineNr">2867 </span><span class="muScenario">scenario</span> editor-scrolls-down-past-wrapped-line-using-arrow-keys-2 [
<span id="L2868" class="LineNr">2868 </span>  <span class="Constant">local-scope</span>
<span id="L2869" class="LineNr">2869 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2870" class="LineNr">2870 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L2871" class="LineNr">2871 </span>  <span class="Comment"># editor starts with a long line wrapping twice</span>
<span id="L2872" class="LineNr">2872 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefghij</span>
<span id="L2873" class="LineNr">2873 </span><span class="Constant">k</span>
<span id="L2874" class="LineNr">2874 </span><span class="Constant">l</span>
<span id="L2875" class="LineNr">2875 </span><span class="Constant">m]</span>
<span id="L2876" class="LineNr">2876 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2877" class="LineNr">2877 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
<span id="L2878" class="LineNr">2878 </span>  assume-console [
<span id="L2879" class="LineNr">2879 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L2880" class="LineNr">2880 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L2881" class="LineNr">2881 </span>  ]
<span id="L2882" class="LineNr">2882 </span>  run [
<span id="L2883" class="LineNr">2883 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2884" class="LineNr">2884 </span>  ]
<span id="L2885" class="LineNr">2885 </span>  <span class="Comment"># screen shows partial wrapped line containing a wrap icon</span>
<span id="L2886" class="LineNr">2886 </span>  screen-should-contain [
<span id="L2887" class="LineNr">2887 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2888" class="LineNr">2888 </span>  <span class="Conceal">¦</span><span class="Constant"> .efgh↩     .</span>
<span id="L2889" class="LineNr">2889 </span>  <span class="Conceal">¦</span><span class="Constant"> .ij        .</span>
<span id="L2890" class="LineNr">2890 </span>  <span class="Conceal">¦</span><span class="Constant"> .k         .</span>
<span id="L2891" class="LineNr">2891 </span>  ]
<span id="L2892" class="LineNr">2892 </span>  <span class="Comment"># scroll down again</span>
<span id="L2893" class="LineNr">2893 </span>  assume-console [
<span id="L2894" class="LineNr">2894 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L2895" class="LineNr">2895 </span>  ]
<span id="L2896" class="LineNr">2896 </span>  run [
<span id="L2897" class="LineNr">2897 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2898" class="LineNr">2898 </span>  ]
<span id="L2899" class="LineNr">2899 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L2900" class="LineNr">2900 </span>  screen-should-contain [
<span id="L2901" class="LineNr">2901 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2902" class="LineNr">2902 </span>  <span class="Conceal">¦</span><span class="Constant"> .ij        .</span>
<span id="L2903" class="LineNr">2903 </span>  <span class="Conceal">¦</span><span class="Constant"> .k         .</span>
<span id="L2904" class="LineNr">2904 </span>  <span class="Conceal">¦</span><span class="Constant"> .l         .</span>
<span id="L2905" class="LineNr">2905 </span>  ]
<span id="L2906" class="LineNr">2906 </span>]
<span id="L2907" class="LineNr">2907 </span>
<span id="L2908" class="LineNr">2908 </span><span class="muScenario">scenario</span> editor-scrolls-down-when-line-wraps [
<span id="L2909" class="LineNr">2909 </span>  <span class="Constant">local-scope</span>
<span id="L2910" class="LineNr">2910 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2911" class="LineNr">2911 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L2912" class="LineNr">2912 </span>  <span class="Comment"># editor contains a long line in the third line</span>
<span id="L2913" class="LineNr">2913 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L2914" class="LineNr">2914 </span><span class="Constant">b</span>
<span id="L2915" class="LineNr">2915 </span><span class="Constant">cdef]</span>
<span id="L2916" class="LineNr">2916 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2917" class="LineNr">2917 </span>  <span class="Comment"># position cursor at end, type a character</span>
<span id="L2918" class="LineNr">2918 </span>  assume-console [
<span id="L2919" class="LineNr">2919 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 4</span>
<span id="L2920" class="LineNr">2920 </span>  <span class="Conceal">¦</span> type <span class="Constant">[g]</span>
<span id="L2921" class="LineNr">2921 </span>  ]
<span id="L2922" class="LineNr">2922 </span>  run [
<span id="L2923" class="LineNr">2923 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2924" class="LineNr">2924 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2925" class="LineNr">2925 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2926" class="LineNr">2926 </span>  ]
<span id="L2927" class="LineNr">2927 </span>  <span class="Comment"># screen scrolls</span>
<span id="L2928" class="LineNr">2928 </span>  screen-should-contain [
<span id="L2929" class="LineNr">2929 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
<span id="L2930" class="LineNr">2930 </span>  <span class="Conceal">¦</span><span class="Constant"> .b    .</span>
<span id="L2931" class="LineNr">2931 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .cdef↩.</span>
<span id="L2932" class="LineNr">2932 </span>  <span class="Conceal">¦</span><span class="Constant"> .g    .</span>
<span id="L2933" class="LineNr">2933 </span>  ]
<span id="L2934" class="LineNr">2934 </span>  memory-should-contain [
<span id="L2935" class="LineNr">2935 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L2936" class="LineNr">2936 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L2937" class="LineNr">2937 </span>  ]
<span id="L2938" class="LineNr">2938 </span>]
<span id="L2939" class="LineNr">2939 </span>
<span id="L2940" class="LineNr">2940 </span><span class="muScenario">scenario</span> editor-stops-scrolling-once-bottom-is-visible [
<span id="L2941" class="LineNr">2941 </span>  <span class="Constant">local-scope</span>
<span id="L2942" class="LineNr">2942 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2943" class="LineNr">2943 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L2944" class="LineNr">2944 </span>  <span class="Comment"># initialize editor with 2 lines</span>
<span id="L2945" class="LineNr">2945 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L2946" class="LineNr">2946 </span><span class="Constant">b]</span>
<span id="L2947" class="LineNr">2947 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L2948" class="LineNr">2948 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2949" class="LineNr">2949 </span>  screen-should-contain [
<span id="L2950" class="LineNr">2950 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2951" class="LineNr">2951 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L2952" class="LineNr">2952 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L2953" class="LineNr">2953 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2954" class="LineNr">2954 </span>  ]
<span id="L2955" class="LineNr">2955 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
<span id="L2956" class="LineNr">2956 </span>  assume-console [
<span id="L2957" class="LineNr">2957 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L2958" class="LineNr">2958 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L2959" class="LineNr">2959 </span>  ]
<span id="L2960" class="LineNr">2960 </span>  run [
<span id="L2961" class="LineNr">2961 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2962" class="LineNr">2962 </span>  ]
<span id="L2963" class="LineNr">2963 </span>  <span class="Comment"># no change since the bottom border was already visible</span>
<span id="L2964" class="LineNr">2964 </span>  screen-should-contain [
<span id="L2965" class="LineNr">2965 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L2966" class="LineNr">2966 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L2967" class="LineNr">2967 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L2968" class="LineNr">2968 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2969" class="LineNr">2969 </span>  ]
<span id="L2970" class="LineNr">2970 </span>]
<span id="L2971" class="LineNr">2971 </span>
<span id="L2972" class="LineNr">2972 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-newline [
<span id="L2973" class="LineNr">2973 </span>  <span class="Constant">local-scope</span>
<span id="L2974" class="LineNr">2974 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L2975" class="LineNr">2975 </span>  <span class="Comment"># position cursor after last line and type newline</span>
<span id="L2976" class="LineNr">2976 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L2977" class="LineNr">2977 </span><span class="Constant">b</span>
<span id="L2978" class="LineNr">2978 </span><span class="Constant">c]</span>
<span id="L2979" class="LineNr">2979 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L2980" class="LineNr">2980 </span>  assume-console [
<span id="L2981" class="LineNr">2981 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 4</span>
<span id="L2982" class="LineNr">2982 </span>  <span class="Conceal">¦</span> type [
<span id="L2983" class="LineNr">2983 </span>]
<span id="L2984" class="LineNr">2984 </span>  ]
<span id="L2985" class="LineNr">2985 </span>  run [
<span id="L2986" class="LineNr">2986 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L2987" class="LineNr">2987 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2988" class="LineNr">2988 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2989" class="LineNr">2989 </span>  ]
<span id="L2990" class="LineNr">2990 </span>  <span class="Comment"># screen scrolls</span>
<span id="L2991" class="LineNr">2991 </span>  screen-should-contain [
<span id="L2992" class="LineNr">2992 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
<span id="L2993" class="LineNr">2993 </span>  <span class="Conceal">¦</span><span class="Constant"> .b    .</span>
<span id="L2994" class="LineNr">2994 </span>  <span class="Conceal">¦</span><span class="Constant"> .c    .</span>
<span id="L2995" class="LineNr">2995 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
<span id="L2996" class="LineNr">2996 </span>  ]
<span id="L2997" class="LineNr">2997 </span>  memory-should-contain [
<span id="L2998" class="LineNr">2998 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L2999" class="LineNr">2999 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L3000" class="LineNr">3000 </span>  ]
<span id="L3001" class="LineNr">3001 </span>]
<span id="L3002" class="LineNr">3002 </span>
<span id="L3003" class="LineNr">3003 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-right-arrow [
<span id="L3004" class="LineNr">3004 </span>  <span class="Constant">local-scope</span>
<span id="L3005" class="LineNr">3005 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3006" class="LineNr">3006 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L3007" class="LineNr">3007 </span>  <span class="Comment"># editor contains a wrapped line</span>
<span id="L3008" class="LineNr">3008 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3009" class="LineNr">3009 </span><span class="Constant">b</span>
<span id="L3010" class="LineNr">3010 </span><span class="Constant">cdefgh]</span>
<span id="L3011" class="LineNr">3011 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L3012" class="LineNr">3012 </span>  <span class="Comment"># position cursor at end of screen and try to move right</span>
<span id="L3013" class="LineNr">3013 </span>  assume-console [
<span id="L3014" class="LineNr">3014 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
<span id="L3015" class="LineNr">3015 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L3016" class="LineNr">3016 </span>  ]
<span id="L3017" class="LineNr">3017 </span>  run [
<span id="L3018" class="LineNr">3018 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3019" class="LineNr">3019 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L3020" class="LineNr">3020 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L3021" class="LineNr">3021 </span>  ]
<span id="L3022" class="LineNr">3022 </span>  <span class="Comment"># screen scrolls</span>
<span id="L3023" class="LineNr">3023 </span>  screen-should-contain [
<span id="L3024" class="LineNr">3024 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
<span id="L3025" class="LineNr">3025 </span>  <span class="Conceal">¦</span><span class="Constant"> .b    .</span>
<span id="L3026" class="LineNr">3026 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .cdef↩.</span>
<span id="L3027" class="LineNr">3027 </span>  <span class="Conceal">¦</span><span class="Constant"> .gh   .</span>
<span id="L3028" class="LineNr">3028 </span>  ]
<span id="L3029" class="LineNr">3029 </span>  memory-should-contain [
<span id="L3030" class="LineNr">3030 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L3031" class="LineNr">3031 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L3032" class="LineNr">3032 </span>  ]
<span id="L3033" class="LineNr">3033 </span>]
<span id="L3034" class="LineNr">3034 </span>
<span id="L3035" class="LineNr">3035 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-right-arrow-2 [
<span id="L3036" class="LineNr">3036 </span>  <span class="Constant">local-scope</span>
<span id="L3037" class="LineNr">3037 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3038" class="LineNr">3038 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L3039" class="LineNr">3039 </span>  <span class="Comment"># editor contains more lines than can fit on screen</span>
<span id="L3040" class="LineNr">3040 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3041" class="LineNr">3041 </span><span class="Constant">b</span>
<span id="L3042" class="LineNr">3042 </span><span class="Constant">c</span>
<span id="L3043" class="LineNr">3043 </span><span class="Constant">d]</span>
<span id="L3044" class="LineNr">3044 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L3045" class="LineNr">3045 </span>  <span class="Comment"># position cursor at end of screen and try to move right</span>
<span id="L3046" class="LineNr">3046 </span>  assume-console [
<span id="L3047" class="LineNr">3047 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
<span id="L3048" class="LineNr">3048 </span>  <span class="Conceal">¦</span> press right-arrow
<span id="L3049" class="LineNr">3049 </span>  ]
<span id="L3050" class="LineNr">3050 </span>  run [
<span id="L3051" class="LineNr">3051 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3052" class="LineNr">3052 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L3053" class="LineNr">3053 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L3054" class="LineNr">3054 </span>  ]
<span id="L3055" class="LineNr">3055 </span>  <span class="Comment"># screen scrolls</span>
<span id="L3056" class="LineNr">3056 </span>  screen-should-contain [
<span id="L3057" class="LineNr">3057 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
<span id="L3058" class="LineNr">3058 </span>  <span class="Conceal">¦</span><span class="Constant"> .b    .</span>
<span id="L3059" class="LineNr">3059 </span>  <span class="Conceal">¦</span><span class="Constant"> .c    .</span>
<span id="L3060" class="LineNr">3060 </span>  <span class="Conceal">¦</span><span class="Constant"> .d    .</span>
<span id="L3061" class="LineNr">3061 </span>  ]
<span id="L3062" class="LineNr">3062 </span>  memory-should-contain [
<span id="L3063" class="LineNr">3063 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L3064" class="LineNr">3064 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L3065" class="LineNr">3065 </span>  ]
<span id="L3066" class="LineNr">3066 </span>]
<span id="L3067" class="LineNr">3067 </span>
<span id="L3068" class="LineNr">3068 </span><span class="muScenario">scenario</span> editor-scrolls-at-end-on-down-arrow [
<span id="L3069" class="LineNr">3069 </span>  <span class="Constant">local-scope</span>
<span id="L3070" class="LineNr">3070 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L3071" class="LineNr">3071 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L3072" class="LineNr">3072 </span><span class="Constant">de]</span>
<span id="L3073" class="LineNr">3073 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L3074" class="LineNr">3074 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3075" class="LineNr">3075 </span>  $clear-trace
<span id="L3076" class="LineNr">3076 </span>  <span class="Comment"># try to move down past end of text</span>
<span id="L3077" class="LineNr">3077 </span>  assume-console [
<span id="L3078" class="LineNr">3078 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L3079" class="LineNr">3079 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L3080" class="LineNr">3080 </span>  ]
<span id="L3081" class="LineNr">3081 </span>  run [
<span id="L3082" class="LineNr">3082 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3083" class="LineNr">3083 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L3084" class="LineNr">3084 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L3085" class="LineNr">3085 </span>  ]
<span id="L3086" class="LineNr">3086 </span>  <span class="Comment"># no change</span>
<span id="L3087" class="LineNr">3087 </span>  memory-should-contain [
<span id="L3088" class="LineNr">3088 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L3089" class="LineNr">3089 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L3090" class="LineNr">3090 </span>  ]
<span id="L3091" class="LineNr">3091 </span>]
<span id="L3092" class="LineNr">3092 </span>
<span id="L3093" class="LineNr">3093 </span><span class="muScenario">scenario</span> editor-combines-page-and-line-scroll [
<span id="L3094" class="LineNr">3094 </span>  <span class="Constant">local-scope</span>
<span id="L3095" class="LineNr">3095 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3096" class="LineNr">3096 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3097" class="LineNr">3097 </span>  <span class="Comment"># initialize editor with a few pages of lines</span>
<span id="L3098" class="LineNr">3098 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3099" class="LineNr">3099 </span><span class="Constant">b</span>
<span id="L3100" class="LineNr">3100 </span><span class="Constant">c</span>
<span id="L3101" class="LineNr">3101 </span><span class="Constant">d</span>
<span id="L3102" class="LineNr">3102 </span><span class="Constant">e</span>
<span id="L3103" class="LineNr">3103 </span><span class="Constant">f</span>
<span id="L3104" class="LineNr">3104 </span><span class="Constant">g]</span>
<span id="L3105" class="LineNr">3105 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L3106" class="LineNr">3106 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3107" class="LineNr">3107 </span>  <span class="Comment"># scroll down one page and one line</span>
<span id="L3108" class="LineNr">3108 </span>  assume-console [
<span id="L3109" class="LineNr">3109 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3110" class="LineNr">3110 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L3111" class="LineNr">3111 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L3112" class="LineNr">3112 </span>  ]
<span id="L3113" class="LineNr">3113 </span>  run [
<span id="L3114" class="LineNr">3114 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3115" class="LineNr">3115 </span>  ]
<span id="L3116" class="LineNr">3116 </span>  <span class="Comment"># screen scrolls down 3 lines</span>
<span id="L3117" class="LineNr">3117 </span>  screen-should-contain [
<span id="L3118" class="LineNr">3118 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3119" class="LineNr">3119 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L3120" class="LineNr">3120 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L3121" class="LineNr">3121 </span>  <span class="Conceal">¦</span><span class="Constant"> .f         .</span>
<span id="L3122" class="LineNr">3122 </span>  ]
<span id="L3123" class="LineNr">3123 </span>]
<span id="L3124" class="LineNr">3124 </span>
<span id="L3125" class="LineNr">3125 </span><span class="Comment"># scroll up if necessary</span>
<span id="L3126" class="LineNr">3126 </span>
<span id="L3127" class="LineNr">3127 </span><span class="muScenario">scenario</span> editor-can-scroll-up-using-arrow-keys [
<span id="L3128" class="LineNr">3128 </span>  <span class="Constant">local-scope</span>
<span id="L3129" class="LineNr">3129 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3130" class="LineNr">3130 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3131" class="LineNr">3131 </span>  <span class="Comment"># initialize editor with &gt;3 lines</span>
<span id="L3132" class="LineNr">3132 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3133" class="LineNr">3133 </span><span class="Constant">b</span>
<span id="L3134" class="LineNr">3134 </span><span class="Constant">c</span>
<span id="L3135" class="LineNr">3135 </span><span class="Constant">d]</span>
<span id="L3136" class="LineNr">3136 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L3137" class="LineNr">3137 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3138" class="LineNr">3138 </span>  screen-should-contain [
<span id="L3139" class="LineNr">3139 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3140" class="LineNr">3140 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3141" class="LineNr">3141 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3142" class="LineNr">3142 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3143" class="LineNr">3143 </span>  ]
<span id="L3144" class="LineNr">3144 </span>  <span class="Comment"># position cursor at top of second page, then try to move up</span>
<span id="L3145" class="LineNr">3145 </span>  assume-console [
<span id="L3146" class="LineNr">3146 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3147" class="LineNr">3147 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3148" class="LineNr">3148 </span>  ]
<span id="L3149" class="LineNr">3149 </span>  run [
<span id="L3150" class="LineNr">3150 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3151" class="LineNr">3151 </span>  ]
<span id="L3152" class="LineNr">3152 </span>  <span class="Comment"># screen slides by one line</span>
<span id="L3153" class="LineNr">3153 </span>  screen-should-contain [
<span id="L3154" class="LineNr">3154 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3155" class="LineNr">3155 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3156" class="LineNr">3156 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3157" class="LineNr">3157 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L3158" class="LineNr">3158 </span>  ]
<span id="L3159" class="LineNr">3159 </span>]
<span id="L3160" class="LineNr">3160 </span>
<span id="L3161" class="LineNr">3161 </span><span class="muRecipe">after</span> <span class="Constant">&lt;scroll-up&gt;</span> [
<span id="L3162" class="LineNr">3162 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[scroll up]</span>
<span id="L3163" class="LineNr">3163 </span>  top-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3164" class="LineNr">3164 </span>  old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy top-of-screen
<span id="L3165" class="LineNr">3165 </span>  top-of-screen <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3175'>before-previous-screen-line</a> top-of-screen, editor
<span id="L3166" class="LineNr">3166 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
<span id="L3167" class="LineNr">3167 </span>  no-movement?:bool <span class="Special">&lt;-</span> equal old-top, top-of-screen
<span id="L3168" class="LineNr">3168 </span>  <span class="muControl">return-if</span> no-movement?, <span class="Constant">0/don't-render</span>
<span id="L3169" class="LineNr">3169 </span>]
<span id="L3170" class="LineNr">3170 </span>
<span id="L3171" class="LineNr">3171 </span><span class="Comment"># Takes a pointer into the doubly-linked list, scans back to before start of</span>
<span id="L3172" class="LineNr">3172 </span><span class="Comment"># previous *wrapped* line.</span>
<span id="L3173" class="LineNr">3173 </span><span class="Comment"># Returns original if no next newline.</span>
<span id="L3174" class="LineNr">3174 </span><span class="Comment"># Beware: never return null pointer.</span>
<span id="L3175" class="LineNr">3175 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L3175'>before-previous-screen-line</a> in:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char, editor:&amp;:editor<span class="muRecipe"> -&gt; </span>out:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char [
<span id="L3176" class="LineNr">3176 </span>  <span class="Constant">local-scope</span>
<span id="L3177" class="LineNr">3177 </span>  <span class="Constant">load-ingredients</span>
<span id="L3178" class="LineNr">3178 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy in
<span id="L3179" class="LineNr">3179 </span>  c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L3180" class="LineNr">3180 </span>  <span class="Comment"># compute max, number of characters to skip</span>
<span id="L3181" class="LineNr">3181 </span>  <span class="Comment">#   1 + len%(width-1)</span>
<span id="L3182" class="LineNr">3182 </span>  <span class="Comment">#   except rotate second term to vary from 1 to width-1 rather than 0 to width-2</span>
<span id="L3183" class="LineNr">3183 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L3184" class="LineNr">3184 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L3185" class="LineNr">3185 </span>  max-line-length:num <span class="Special">&lt;-</span> subtract right, left, <span class="Constant">-1/exclusive-right</span>, <span class="Constant">1/wrap-icon</span>
<span id="L3186" class="LineNr">3186 </span>  sentinel:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
<span id="L3187" class="LineNr">3187 </span>  len:num <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L219'>previous-line-length</a> curr, sentinel
<span id="L3188" class="LineNr">3188 </span>  <span class="Delimiter">{</span>
<span id="L3189" class="LineNr">3189 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> len
<span id="L3190" class="LineNr">3190 </span>  <span class="Conceal">¦</span> <span class="Comment"># empty line; just skip this newline</span>
<span id="L3191" class="LineNr">3191 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> curr
<span id="L3192" class="LineNr">3192 </span>  <span class="Conceal">¦</span> <span class="muControl">return-unless</span> <a href='../065duplex_list.mu.html#L36'>prev</a>, curr
<span id="L3193" class="LineNr">3193 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> <a href='../065duplex_list.mu.html#L36'>prev</a>
<span id="L3194" class="LineNr">3194 </span>  <span class="Delimiter">}</span>
<span id="L3195" class="LineNr">3195 </span>  _, max:num <span class="Special">&lt;-</span> divide-with-remainder len, max-line-length
<span id="L3196" class="LineNr">3196 </span>  <span class="Comment"># remainder 0 =&gt; scan one width-worth</span>
<span id="L3197" class="LineNr">3197 </span>  <span class="Delimiter">{</span>
<span id="L3198" class="LineNr">3198 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> max
<span id="L3199" class="LineNr">3199 </span>  <span class="Conceal">¦</span> max <span class="Special">&lt;-</span> copy max-line-length
<span id="L3200" class="LineNr">3200 </span>  <span class="Delimiter">}</span>
<span id="L3201" class="LineNr">3201 </span>  max <span class="Special">&lt;-</span> add max,<span class="Constant"> 1</span>
<span id="L3202" class="LineNr">3202 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L3203" class="LineNr">3203 </span>  <span class="Comment"># skip 'max' characters</span>
<span id="L3204" class="LineNr">3204 </span>  <span class="Delimiter">{</span>
<span id="L3205" class="LineNr">3205 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
<span id="L3206" class="LineNr">3206 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L3207" class="LineNr">3207 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> curr
<span id="L3208" class="LineNr">3208 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L36'>prev</a>
<span id="L3209" class="LineNr">3209 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L36'>prev</a>
<span id="L3210" class="LineNr">3210 </span>  <span class="Conceal">¦</span> count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
<span id="L3211" class="LineNr">3211 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L3212" class="LineNr">3212 </span>  <span class="Delimiter">}</span>
<span id="L3213" class="LineNr">3213 </span>  <span class="muControl">return</span> curr
<span id="L3214" class="LineNr">3214 </span>]
<span id="L3215" class="LineNr">3215 </span>
<span id="L3216" class="LineNr">3216 </span><span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys [
<span id="L3217" class="LineNr">3217 </span>  <span class="Constant">local-scope</span>
<span id="L3218" class="LineNr">3218 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3219" class="LineNr">3219 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3220" class="LineNr">3220 </span>  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
<span id="L3221" class="LineNr">3221 </span>  <span class="Comment"># other lines</span>
<span id="L3222" class="LineNr">3222 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
<span id="L3223" class="LineNr">3223 </span><span class="Constant">g</span>
<span id="L3224" class="LineNr">3224 </span><span class="Constant">h</span>
<span id="L3225" class="LineNr">3225 </span><span class="Constant">i]</span>
<span id="L3226" class="LineNr">3226 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L3227" class="LineNr">3227 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3228" class="LineNr">3228 </span>  screen-should-contain [
<span id="L3229" class="LineNr">3229 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3230" class="LineNr">3230 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd↩     .</span>
<span id="L3231" class="LineNr">3231 </span>  <span class="Conceal">¦</span><span class="Constant"> .ef        .</span>
<span id="L3232" class="LineNr">3232 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L3233" class="LineNr">3233 </span>  ]
<span id="L3234" class="LineNr">3234 </span>  <span class="Comment"># position cursor at top of second page, just below wrapped line</span>
<span id="L3235" class="LineNr">3235 </span>  assume-console [
<span id="L3236" class="LineNr">3236 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3237" class="LineNr">3237 </span>  ]
<span id="L3238" class="LineNr">3238 </span>  run [
<span id="L3239" class="LineNr">3239 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3240" class="LineNr">3240 </span>  ]
<span id="L3241" class="LineNr">3241 </span>  screen-should-contain [
<span id="L3242" class="LineNr">3242 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3243" class="LineNr">3243 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L3244" class="LineNr">3244 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L3245" class="LineNr">3245 </span>  <span class="Conceal">¦</span><span class="Constant"> .i         .</span>
<span id="L3246" class="LineNr">3246 </span>  ]
<span id="L3247" class="LineNr">3247 </span>  <span class="Comment"># now move up one line</span>
<span id="L3248" class="LineNr">3248 </span>  assume-console [
<span id="L3249" class="LineNr">3249 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3250" class="LineNr">3250 </span>  ]
<span id="L3251" class="LineNr">3251 </span>  run [
<span id="L3252" class="LineNr">3252 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3253" class="LineNr">3253 </span>  ]
<span id="L3254" class="LineNr">3254 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L3255" class="LineNr">3255 </span>  screen-should-contain [
<span id="L3256" class="LineNr">3256 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3257" class="LineNr">3257 </span>  <span class="Conceal">¦</span><span class="Constant"> .ef        .</span>
<span id="L3258" class="LineNr">3258 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L3259" class="LineNr">3259 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L3260" class="LineNr">3260 </span>  ]
<span id="L3261" class="LineNr">3261 </span>]
<span id="L3262" class="LineNr">3262 </span>
<span id="L3263" class="LineNr">3263 </span><span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-2 [
<span id="L3264" class="LineNr">3264 </span>  <span class="Constant">local-scope</span>
<span id="L3265" class="LineNr">3265 </span>  <span class="Comment"># screen has 1 line for menu + 4 lines</span>
<span id="L3266" class="LineNr">3266 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L3267" class="LineNr">3267 </span>  <span class="Comment"># editor starts with a long line wrapping twice, occupying 3 of the 4 lines</span>
<span id="L3268" class="LineNr">3268 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefghij</span>
<span id="L3269" class="LineNr">3269 </span><span class="Constant">k</span>
<span id="L3270" class="LineNr">3270 </span><span class="Constant">l</span>
<span id="L3271" class="LineNr">3271 </span><span class="Constant">m]</span>
<span id="L3272" class="LineNr">3272 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L3273" class="LineNr">3273 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3274" class="LineNr">3274 </span>  <span class="Comment"># position cursor at top of second page</span>
<span id="L3275" class="LineNr">3275 </span>  assume-console [
<span id="L3276" class="LineNr">3276 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3277" class="LineNr">3277 </span>  ]
<span id="L3278" class="LineNr">3278 </span>  run [
<span id="L3279" class="LineNr">3279 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3280" class="LineNr">3280 </span>  ]
<span id="L3281" class="LineNr">3281 </span>  screen-should-contain [
<span id="L3282" class="LineNr">3282 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3283" class="LineNr">3283 </span>  <span class="Conceal">¦</span><span class="Constant"> .k         .</span>
<span id="L3284" class="LineNr">3284 </span>  <span class="Conceal">¦</span><span class="Constant"> .l         .</span>
<span id="L3285" class="LineNr">3285 </span>  <span class="Conceal">¦</span><span class="Constant"> .m         .</span>
<span id="L3286" class="LineNr">3286 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L3287" class="LineNr">3287 </span>  ]
<span id="L3288" class="LineNr">3288 </span>  <span class="Comment"># move up one line</span>
<span id="L3289" class="LineNr">3289 </span>  assume-console [
<span id="L3290" class="LineNr">3290 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3291" class="LineNr">3291 </span>  ]
<span id="L3292" class="LineNr">3292 </span>  run [
<span id="L3293" class="LineNr">3293 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3294" class="LineNr">3294 </span>  ]
<span id="L3295" class="LineNr">3295 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L3296" class="LineNr">3296 </span>  screen-should-contain [
<span id="L3297" class="LineNr">3297 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3298" class="LineNr">3298 </span>  <span class="Conceal">¦</span><span class="Constant"> .ij        .</span>
<span id="L3299" class="LineNr">3299 </span>  <span class="Conceal">¦</span><span class="Constant"> .k         .</span>
<span id="L3300" class="LineNr">3300 </span>  <span class="Conceal">¦</span><span class="Constant"> .l         .</span>
<span id="L3301" class="LineNr">3301 </span>  <span class="Conceal">¦</span><span class="Constant"> .m         .</span>
<span id="L3302" class="LineNr">3302 </span>  ]
<span id="L3303" class="LineNr">3303 </span>  <span class="Comment"># move up a second line</span>
<span id="L3304" class="LineNr">3304 </span>  assume-console [
<span id="L3305" class="LineNr">3305 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3306" class="LineNr">3306 </span>  ]
<span id="L3307" class="LineNr">3307 </span>  run [
<span id="L3308" class="LineNr">3308 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3309" class="LineNr">3309 </span>  ]
<span id="L3310" class="LineNr">3310 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L3311" class="LineNr">3311 </span>  screen-should-contain [
<span id="L3312" class="LineNr">3312 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3313" class="LineNr">3313 </span>  <span class="Conceal">¦</span><span class="Constant"> .efgh↩     .</span>
<span id="L3314" class="LineNr">3314 </span>  <span class="Conceal">¦</span><span class="Constant"> .ij        .</span>
<span id="L3315" class="LineNr">3315 </span>  <span class="Conceal">¦</span><span class="Constant"> .k         .</span>
<span id="L3316" class="LineNr">3316 </span>  <span class="Conceal">¦</span><span class="Constant"> .l         .</span>
<span id="L3317" class="LineNr">3317 </span>  ]
<span id="L3318" class="LineNr">3318 </span>  <span class="Comment"># move up a third line</span>
<span id="L3319" class="LineNr">3319 </span>  assume-console [
<span id="L3320" class="LineNr">3320 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3321" class="LineNr">3321 </span>  ]
<span id="L3322" class="LineNr">3322 </span>  run [
<span id="L3323" class="LineNr">3323 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3324" class="LineNr">3324 </span>  ]
<span id="L3325" class="LineNr">3325 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L3326" class="LineNr">3326 </span>  screen-should-contain [
<span id="L3327" class="LineNr">3327 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3328" class="LineNr">3328 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd↩     .</span>
<span id="L3329" class="LineNr">3329 </span>  <span class="Conceal">¦</span><span class="Constant"> .efgh↩     .</span>
<span id="L3330" class="LineNr">3330 </span>  <span class="Conceal">¦</span><span class="Constant"> .ij        .</span>
<span id="L3331" class="LineNr">3331 </span>  <span class="Conceal">¦</span><span class="Constant"> .k         .</span>
<span id="L3332" class="LineNr">3332 </span>  ]
<span id="L3333" class="LineNr">3333 </span>]
<span id="L3334" class="LineNr">3334 </span>
<span id="L3335" class="LineNr">3335 </span><span class="Comment"># same as editor-scrolls-up-past-wrapped-line-using-arrow-keys but length</span>
<span id="L3336" class="LineNr">3336 </span><span class="Comment"># slightly off, just to prevent over-training</span>
<span id="L3337" class="LineNr">3337 </span><span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-3 [
<span id="L3338" class="LineNr">3338 </span>  <span class="Constant">local-scope</span>
<span id="L3339" class="LineNr">3339 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3340" class="LineNr">3340 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3341" class="LineNr">3341 </span>  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
<span id="L3342" class="LineNr">3342 </span>  <span class="Comment"># other lines</span>
<span id="L3343" class="LineNr">3343 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
<span id="L3344" class="LineNr">3344 </span><span class="Constant">g</span>
<span id="L3345" class="LineNr">3345 </span><span class="Constant">h</span>
<span id="L3346" class="LineNr">3346 </span><span class="Constant">i]</span>
<span id="L3347" class="LineNr">3347 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">6/right</span>
<span id="L3348" class="LineNr">3348 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3349" class="LineNr">3349 </span>  screen-should-contain [
<span id="L3350" class="LineNr">3350 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3351" class="LineNr">3351 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcde↩    .</span>
<span id="L3352" class="LineNr">3352 </span>  <span class="Conceal">¦</span><span class="Constant"> .f         .</span>
<span id="L3353" class="LineNr">3353 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L3354" class="LineNr">3354 </span>  ]
<span id="L3355" class="LineNr">3355 </span>  <span class="Comment"># position cursor at top of second page, just below wrapped line</span>
<span id="L3356" class="LineNr">3356 </span>  assume-console [
<span id="L3357" class="LineNr">3357 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3358" class="LineNr">3358 </span>  ]
<span id="L3359" class="LineNr">3359 </span>  run [
<span id="L3360" class="LineNr">3360 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3361" class="LineNr">3361 </span>  ]
<span id="L3362" class="LineNr">3362 </span>  screen-should-contain [
<span id="L3363" class="LineNr">3363 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3364" class="LineNr">3364 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L3365" class="LineNr">3365 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L3366" class="LineNr">3366 </span>  <span class="Conceal">¦</span><span class="Constant"> .i         .</span>
<span id="L3367" class="LineNr">3367 </span>  ]
<span id="L3368" class="LineNr">3368 </span>  <span class="Comment"># now move up one line</span>
<span id="L3369" class="LineNr">3369 </span>  assume-console [
<span id="L3370" class="LineNr">3370 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3371" class="LineNr">3371 </span>  ]
<span id="L3372" class="LineNr">3372 </span>  run [
<span id="L3373" class="LineNr">3373 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3374" class="LineNr">3374 </span>  ]
<span id="L3375" class="LineNr">3375 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L3376" class="LineNr">3376 </span>  screen-should-contain [
<span id="L3377" class="LineNr">3377 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3378" class="LineNr">3378 </span>  <span class="Conceal">¦</span><span class="Constant"> .f         .</span>
<span id="L3379" class="LineNr">3379 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L3380" class="LineNr">3380 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L3381" class="LineNr">3381 </span>  ]
<span id="L3382" class="LineNr">3382 </span>]
<span id="L3383" class="LineNr">3383 </span>
<span id="L3384" class="LineNr">3384 </span><span class="Comment"># check empty lines</span>
<span id="L3385" class="LineNr">3385 </span><span class="muScenario">scenario</span> editor-scrolls-up-past-wrapped-line-using-arrow-keys-4 [
<span id="L3386" class="LineNr">3386 </span>  <span class="Constant">local-scope</span>
<span id="L3387" class="LineNr">3387 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3388" class="LineNr">3388 </span>  <span class="Comment"># initialize editor with some lines around an empty line</span>
<span id="L3389" class="LineNr">3389 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3390" class="LineNr">3390 </span><span class="Constant">b</span>
<span id="L3391" class="LineNr">3391 </span>
<span id="L3392" class="LineNr">3392 </span>c
<span id="L3393" class="LineNr">3393 </span>d
<span id="L3394" class="LineNr">3394 </span>e]
<span id="L3395" class="LineNr">3395 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">6/right</span>
<span id="L3396" class="LineNr">3396 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3397" class="LineNr">3397 </span>  assume-console [
<span id="L3398" class="LineNr">3398 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3399" class="LineNr">3399 </span>  ]
<span id="L3400" class="LineNr">3400 </span>  run [
<span id="L3401" class="LineNr">3401 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3402" class="LineNr">3402 </span>  ]
<span id="L3403" class="LineNr">3403 </span>  screen-should-contain [
<span id="L3404" class="LineNr">3404 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3405" class="LineNr">3405 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3406" class="LineNr">3406 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3407" class="LineNr">3407 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L3408" class="LineNr">3408 </span>  ]
<span id="L3409" class="LineNr">3409 </span>  assume-console [
<span id="L3410" class="LineNr">3410 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3411" class="LineNr">3411 </span>  ]
<span id="L3412" class="LineNr">3412 </span>  run [
<span id="L3413" class="LineNr">3413 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3414" class="LineNr">3414 </span>  ]
<span id="L3415" class="LineNr">3415 </span>  screen-should-contain [
<span id="L3416" class="LineNr">3416 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3417" class="LineNr">3417 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L3418" class="LineNr">3418 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L3419" class="LineNr">3419 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌    .</span>
<span id="L3420" class="LineNr">3420 </span>  ]
<span id="L3421" class="LineNr">3421 </span>  assume-console [
<span id="L3422" class="LineNr">3422 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3820'>page-up</a>
<span id="L3423" class="LineNr">3423 </span>  ]
<span id="L3424" class="LineNr">3424 </span>  run [
<span id="L3425" class="LineNr">3425 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3426" class="LineNr">3426 </span>  ]
<span id="L3427" class="LineNr">3427 </span>  screen-should-contain [
<span id="L3428" class="LineNr">3428 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3429" class="LineNr">3429 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3430" class="LineNr">3430 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3431" class="LineNr">3431 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L3432" class="LineNr">3432 </span>  ]
<span id="L3433" class="LineNr">3433 </span>]
<span id="L3434" class="LineNr">3434 </span>
<span id="L3435" class="LineNr">3435 </span><span class="muScenario">scenario</span> editor-scrolls-up-on-left-arrow [
<span id="L3436" class="LineNr">3436 </span>  <span class="Constant">local-scope</span>
<span id="L3437" class="LineNr">3437 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3438" class="LineNr">3438 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L3439" class="LineNr">3439 </span>  <span class="Comment"># editor contains &gt;3 lines</span>
<span id="L3440" class="LineNr">3440 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3441" class="LineNr">3441 </span><span class="Constant">b</span>
<span id="L3442" class="LineNr">3442 </span><span class="Constant">c</span>
<span id="L3443" class="LineNr">3443 </span><span class="Constant">d</span>
<span id="L3444" class="LineNr">3444 </span><span class="Constant">e]</span>
<span id="L3445" class="LineNr">3445 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L3446" class="LineNr">3446 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3447" class="LineNr">3447 </span>  <span class="Comment"># position cursor at top of second page</span>
<span id="L3448" class="LineNr">3448 </span>  assume-console [
<span id="L3449" class="LineNr">3449 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3450" class="LineNr">3450 </span>  ]
<span id="L3451" class="LineNr">3451 </span>  run [
<span id="L3452" class="LineNr">3452 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3453" class="LineNr">3453 </span>  ]
<span id="L3454" class="LineNr">3454 </span>  screen-should-contain [
<span id="L3455" class="LineNr">3455 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
<span id="L3456" class="LineNr">3456 </span>  <span class="Conceal">¦</span><span class="Constant"> .c    .</span>
<span id="L3457" class="LineNr">3457 </span>  <span class="Conceal">¦</span><span class="Constant"> .d    .</span>
<span id="L3458" class="LineNr">3458 </span>  <span class="Conceal">¦</span><span class="Constant"> .e    .</span>
<span id="L3459" class="LineNr">3459 </span>  ]
<span id="L3460" class="LineNr">3460 </span>  <span class="Comment"># now try to move left</span>
<span id="L3461" class="LineNr">3461 </span>  assume-console [
<span id="L3462" class="LineNr">3462 </span>  <span class="Conceal">¦</span> press left-arrow
<span id="L3463" class="LineNr">3463 </span>  ]
<span id="L3464" class="LineNr">3464 </span>  run [
<span id="L3465" class="LineNr">3465 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3466" class="LineNr">3466 </span>  <span class="Conceal">¦</span> 3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L3467" class="LineNr">3467 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L3468" class="LineNr">3468 </span>  ]
<span id="L3469" class="LineNr">3469 </span>  <span class="Comment"># screen scrolls</span>
<span id="L3470" class="LineNr">3470 </span>  screen-should-contain [
<span id="L3471" class="LineNr">3471 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
<span id="L3472" class="LineNr">3472 </span>  <span class="Conceal">¦</span><span class="Constant"> .b    .</span>
<span id="L3473" class="LineNr">3473 </span>  <span class="Conceal">¦</span><span class="Constant"> .c    .</span>
<span id="L3474" class="LineNr">3474 </span>  <span class="Conceal">¦</span><span class="Constant"> .d    .</span>
<span id="L3475" class="LineNr">3475 </span>  ]
<span id="L3476" class="LineNr">3476 </span>  memory-should-contain [
<span id="L3477" class="LineNr">3477 </span>  <span class="Conceal">¦</span><span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L3478" class="LineNr">3478 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L3479" class="LineNr">3479 </span>  ]
<span id="L3480" class="LineNr">3480 </span>]
<span id="L3481" class="LineNr">3481 </span>
<span id="L3482" class="LineNr">3482 </span><span class="muScenario">scenario</span> editor-can-scroll-up-to-start-of-file [
<span id="L3483" class="LineNr">3483 </span>  <span class="Constant">local-scope</span>
<span id="L3484" class="LineNr">3484 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3485" class="LineNr">3485 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3486" class="LineNr">3486 </span>  <span class="Comment"># initialize editor with &gt;3 lines</span>
<span id="L3487" class="LineNr">3487 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3488" class="LineNr">3488 </span><span class="Constant">b</span>
<span id="L3489" class="LineNr">3489 </span><span class="Constant">c</span>
<span id="L3490" class="LineNr">3490 </span><span class="Constant">d]</span>
<span id="L3491" class="LineNr">3491 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L3492" class="LineNr">3492 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3493" class="LineNr">3493 </span>  screen-should-contain [
<span id="L3494" class="LineNr">3494 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3495" class="LineNr">3495 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3496" class="LineNr">3496 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3497" class="LineNr">3497 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3498" class="LineNr">3498 </span>  ]
<span id="L3499" class="LineNr">3499 </span>  <span class="Comment"># position cursor at top of second page, then try to move up to start of</span>
<span id="L3500" class="LineNr">3500 </span>  <span class="Comment"># text</span>
<span id="L3501" class="LineNr">3501 </span>  assume-console [
<span id="L3502" class="LineNr">3502 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3503" class="LineNr">3503 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3504" class="LineNr">3504 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3505" class="LineNr">3505 </span>  ]
<span id="L3506" class="LineNr">3506 </span>  run [
<span id="L3507" class="LineNr">3507 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3508" class="LineNr">3508 </span>  ]
<span id="L3509" class="LineNr">3509 </span>  <span class="Comment"># screen slides by one line</span>
<span id="L3510" class="LineNr">3510 </span>  screen-should-contain [
<span id="L3511" class="LineNr">3511 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3512" class="LineNr">3512 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3513" class="LineNr">3513 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3514" class="LineNr">3514 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3515" class="LineNr">3515 </span>  ]
<span id="L3516" class="LineNr">3516 </span>  <span class="Comment"># try to move up again</span>
<span id="L3517" class="LineNr">3517 </span>  assume-console [
<span id="L3518" class="LineNr">3518 </span>  <span class="Conceal">¦</span> press up-arrow
<span id="L3519" class="LineNr">3519 </span>  ]
<span id="L3520" class="LineNr">3520 </span>  run [
<span id="L3521" class="LineNr">3521 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3522" class="LineNr">3522 </span>  ]
<span id="L3523" class="LineNr">3523 </span>  <span class="Comment"># screen remains unchanged</span>
<span id="L3524" class="LineNr">3524 </span>  screen-should-contain [
<span id="L3525" class="LineNr">3525 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3526" class="LineNr">3526 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3527" class="LineNr">3527 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3528" class="LineNr">3528 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3529" class="LineNr">3529 </span>  ]
<span id="L3530" class="LineNr">3530 </span>]
<span id="L3531" class="LineNr">3531 </span>
<span id="L3532" class="LineNr">3532 </span><span class="Comment"># ctrl-f/page-down - render next page if it exists</span>
<span id="L3533" class="LineNr">3533 </span>
<span id="L3534" class="LineNr">3534 </span><span class="muScenario">scenario</span> editor-can-scroll [
<span id="L3535" class="LineNr">3535 </span>  <span class="Constant">local-scope</span>
<span id="L3536" class="LineNr">3536 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3537" class="LineNr">3537 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3538" class="LineNr">3538 </span><span class="Constant">b</span>
<span id="L3539" class="LineNr">3539 </span><span class="Constant">c</span>
<span id="L3540" class="LineNr">3540 </span><span class="Constant">d]</span>
<span id="L3541" class="LineNr">3541 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L3542" class="LineNr">3542 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3543" class="LineNr">3543 </span>  screen-should-contain [
<span id="L3544" class="LineNr">3544 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3545" class="LineNr">3545 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3546" class="LineNr">3546 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3547" class="LineNr">3547 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3548" class="LineNr">3548 </span>  ]
<span id="L3549" class="LineNr">3549 </span>  <span class="Comment"># scroll down</span>
<span id="L3550" class="LineNr">3550 </span>  assume-console [
<span id="L3551" class="LineNr">3551 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3552" class="LineNr">3552 </span>  ]
<span id="L3553" class="LineNr">3553 </span>  run [
<span id="L3554" class="LineNr">3554 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3555" class="LineNr">3555 </span>  ]
<span id="L3556" class="LineNr">3556 </span>  <span class="Comment"># screen shows next page</span>
<span id="L3557" class="LineNr">3557 </span>  screen-should-contain [
<span id="L3558" class="LineNr">3558 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3559" class="LineNr">3559 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3560" class="LineNr">3560 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L3561" class="LineNr">3561 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L3562" class="LineNr">3562 </span>  ]
<span id="L3563" class="LineNr">3563 </span>]
<span id="L3564" class="LineNr">3564 </span>
<span id="L3565" class="LineNr">3565 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L3566" class="LineNr">3566 </span>  <span class="Delimiter">{</span>
<span id="L3567" class="LineNr">3567 </span>  <span class="Conceal">¦</span> page-down?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">6/ctrl-f</span>
<span id="L3568" class="LineNr">3568 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> page-down?
<span id="L3569" class="LineNr">3569 </span>  <span class="Conceal">¦</span> old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3570" class="LineNr">3570 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L3571" class="LineNr">3571 </span>  <span class="Conceal">¦</span> <a href='003-shortcuts.mu.html#L3597'>page-down</a> editor
<span id="L3572" class="LineNr">3572 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L3573" class="LineNr">3573 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L3574" class="LineNr">3574 </span>  <span class="Conceal">¦</span> top-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3575" class="LineNr">3575 </span>  <span class="Conceal">¦</span> movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
<span id="L3576" class="LineNr">3576 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> movement?/go-render
<span id="L3577" class="LineNr">3577 </span>  <span class="Delimiter">}</span>
<span id="L3578" class="LineNr">3578 </span>]
<span id="L3579" class="LineNr">3579 </span>
<span id="L3580" class="LineNr">3580 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L3581" class="LineNr">3581 </span>  <span class="Delimiter">{</span>
<span id="L3582" class="LineNr">3582 </span>  <span class="Conceal">¦</span> page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
<span id="L3583" class="LineNr">3583 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> page-down?
<span id="L3584" class="LineNr">3584 </span>  <span class="Conceal">¦</span> old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3585" class="LineNr">3585 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L3586" class="LineNr">3586 </span>  <span class="Conceal">¦</span> <a href='003-shortcuts.mu.html#L3597'>page-down</a> editor
<span id="L3587" class="LineNr">3587 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L3588" class="LineNr">3588 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L3589" class="LineNr">3589 </span>  <span class="Conceal">¦</span> top-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3590" class="LineNr">3590 </span>  <span class="Conceal">¦</span> movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
<span id="L3591" class="LineNr">3591 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> movement?/go-render
<span id="L3592" class="LineNr">3592 </span>  <span class="Delimiter">}</span>
<span id="L3593" class="LineNr">3593 </span>]
<span id="L3594" class="LineNr">3594 </span>
<span id="L3595" class="LineNr">3595 </span><span class="Comment"># page-down skips entire wrapped lines, so it can't scroll past lines</span>
<span id="L3596" class="LineNr">3596 </span><span class="Comment"># taking up the entire screen</span>
<span id="L3597" class="LineNr">3597 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L3597'>page-down</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
<span id="L3598" class="LineNr">3598 </span>  <span class="Constant">local-scope</span>
<span id="L3599" class="LineNr">3599 </span>  <span class="Constant">load-ingredients</span>
<span id="L3600" class="LineNr">3600 </span>  <span class="Comment"># if editor contents don't overflow screen, do nothing</span>
<span id="L3601" class="LineNr">3601 </span>  bottom-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">bottom-of-screen:offset</span>
<span id="L3602" class="LineNr">3602 </span>  <span class="muControl">return-unless</span> bottom-of-screen
<span id="L3603" class="LineNr">3603 </span>  <span class="Comment"># if not, position cursor at final character</span>
<span id="L3604" class="LineNr">3604 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L3605" class="LineNr">3605 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> bottom-of-screen
<span id="L3606" class="LineNr">3606 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L3607" class="LineNr">3607 </span>  <span class="Comment"># keep one line in common with previous page</span>
<span id="L3608" class="LineNr">3608 </span>  <span class="Delimiter">{</span>
<span id="L3609" class="LineNr">3609 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L576'>last</a>:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
<span id="L3610" class="LineNr">3610 </span>  <span class="Conceal">¦</span> newline?:bool <span class="Special">&lt;-</span> equal <a href='../065duplex_list.mu.html#L576'>last</a>, <span class="Constant">10/newline</span>
<span id="L3611" class="LineNr">3611 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> newline?:bool
<span id="L3612" class="LineNr">3612 </span>  <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> before-cursor
<span id="L3613" class="LineNr">3613 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L3614" class="LineNr">3614 </span>  <span class="Delimiter">}</span>
<span id="L3615" class="LineNr">3615 </span>  <span class="Comment"># move cursor and top-of-screen to start of that line</span>
<span id="L3616" class="LineNr">3616 </span>  <a href='003-shortcuts.mu.html#L3622'>move-to-start-of-line</a> editor
<span id="L3617" class="LineNr">3617 </span>  before-cursor <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L3618" class="LineNr">3618 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, before-cursor
<span id="L3619" class="LineNr">3619 </span>]
<span id="L3620" class="LineNr">3620 </span>
<span id="L3621" class="LineNr">3621 </span><span class="Comment"># jump to previous newline</span>
<span id="L3622" class="LineNr">3622 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L3622'>move-to-start-of-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
<span id="L3623" class="LineNr">3623 </span>  <span class="Constant">local-scope</span>
<span id="L3624" class="LineNr">3624 </span>  <span class="Constant">load-ingredients</span>
<span id="L3625" class="LineNr">3625 </span>  <span class="Comment"># update cursor column</span>
<span id="L3626" class="LineNr">3626 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L3627" class="LineNr">3627 </span>  cursor-column:num <span class="Special">&lt;-</span> copy left
<span id="L3628" class="LineNr">3628 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L3629" class="LineNr">3629 </span>  <span class="Comment"># update before-cursor</span>
<span id="L3630" class="LineNr">3630 </span>  before-cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L3631" class="LineNr">3631 </span>  init:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
<span id="L3632" class="LineNr">3632 </span>  <span class="Comment"># while not at start of line, move</span>
<span id="L3633" class="LineNr">3633 </span>  <span class="Delimiter">{</span>
<span id="L3634" class="LineNr">3634 </span>  <span class="Conceal">¦</span> at-start-of-text?:bool <span class="Special">&lt;-</span> equal before-cursor, init
<span id="L3635" class="LineNr">3635 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-start-of-text?
<span id="L3636" class="LineNr">3636 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a>:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
<span id="L3637" class="LineNr">3637 </span>  <span class="Conceal">¦</span> at-start-of-line?:bool <span class="Special">&lt;-</span> equal <a href='../065duplex_list.mu.html#L36'>prev</a>, <span class="Constant">10/newline</span>
<span id="L3638" class="LineNr">3638 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-start-of-line?
<span id="L3639" class="LineNr">3639 </span>  <span class="Conceal">¦</span> before-cursor <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L36'>prev</a> before-cursor
<span id="L3640" class="LineNr">3640 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L3641" class="LineNr">3641 </span>  <span class="Conceal">¦</span> assert before-cursor, <span class="Constant">[move-to-start-of-line tried to move before start of text]</span>
<span id="L3642" class="LineNr">3642 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L3643" class="LineNr">3643 </span>  <span class="Delimiter">}</span>
<span id="L3644" class="LineNr">3644 </span>]
<span id="L3645" class="LineNr">3645 </span>
<span id="L3646" class="LineNr">3646 </span><span class="muScenario">scenario</span> editor-does-not-scroll-past-end [
<span id="L3647" class="LineNr">3647 </span>  <span class="Constant">local-scope</span>
<span id="L3648" class="LineNr">3648 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3649" class="LineNr">3649 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3650" class="LineNr">3650 </span><span class="Constant">b]</span>
<span id="L3651" class="LineNr">3651 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L3652" class="LineNr">3652 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3653" class="LineNr">3653 </span>  screen-should-contain [
<span id="L3654" class="LineNr">3654 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3655" class="LineNr">3655 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3656" class="LineNr">3656 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3657" class="LineNr">3657 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L3658" class="LineNr">3658 </span>  ]
<span id="L3659" class="LineNr">3659 </span>  <span class="Comment"># scroll down</span>
<span id="L3660" class="LineNr">3660 </span>  assume-console [
<span id="L3661" class="LineNr">3661 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3662" class="LineNr">3662 </span>  ]
<span id="L3663" class="LineNr">3663 </span>  run [
<span id="L3664" class="LineNr">3664 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3665" class="LineNr">3665 </span>  ]
<span id="L3666" class="LineNr">3666 </span>  <span class="Comment"># screen remains unmodified</span>
<span id="L3667" class="LineNr">3667 </span>  screen-should-contain [
<span id="L3668" class="LineNr">3668 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3669" class="LineNr">3669 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3670" class="LineNr">3670 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3671" class="LineNr">3671 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L3672" class="LineNr">3672 </span>  ]
<span id="L3673" class="LineNr">3673 </span>]
<span id="L3674" class="LineNr">3674 </span>
<span id="L3675" class="LineNr">3675 </span><span class="muScenario">scenario</span> editor-starts-next-page-at-start-of-wrapped-line [
<span id="L3676" class="LineNr">3676 </span>  <span class="Constant">local-scope</span>
<span id="L3677" class="LineNr">3677 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
<span id="L3678" class="LineNr">3678 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3679" class="LineNr">3679 </span>  <span class="Comment"># editor contains a long last line</span>
<span id="L3680" class="LineNr">3680 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3681" class="LineNr">3681 </span><span class="Constant">b</span>
<span id="L3682" class="LineNr">3682 </span><span class="Constant">cdefgh]</span>
<span id="L3683" class="LineNr">3683 </span>  <span class="Comment"># editor screen triggers wrap of last line</span>
<span id="L3684" class="LineNr">3684 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
<span id="L3685" class="LineNr">3685 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3686" class="LineNr">3686 </span>  <span class="Comment"># some part of last line is not displayed</span>
<span id="L3687" class="LineNr">3687 </span>  screen-should-contain [
<span id="L3688" class="LineNr">3688 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3689" class="LineNr">3689 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3690" class="LineNr">3690 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3691" class="LineNr">3691 </span>  <span class="Conceal">¦</span><span class="Constant"> .cde↩      .</span>
<span id="L3692" class="LineNr">3692 </span>  ]
<span id="L3693" class="LineNr">3693 </span>  <span class="Comment"># scroll down</span>
<span id="L3694" class="LineNr">3694 </span>  assume-console [
<span id="L3695" class="LineNr">3695 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3696" class="LineNr">3696 </span>  ]
<span id="L3697" class="LineNr">3697 </span>  run [
<span id="L3698" class="LineNr">3698 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3699" class="LineNr">3699 </span>  ]
<span id="L3700" class="LineNr">3700 </span>  <span class="Comment"># screen shows entire wrapped line</span>
<span id="L3701" class="LineNr">3701 </span>  screen-should-contain [
<span id="L3702" class="LineNr">3702 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3703" class="LineNr">3703 </span>  <span class="Conceal">¦</span><span class="Constant"> .cde↩      .</span>
<span id="L3704" class="LineNr">3704 </span>  <span class="Conceal">¦</span><span class="Constant"> .fgh       .</span>
<span id="L3705" class="LineNr">3705 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌      .</span>
<span id="L3706" class="LineNr">3706 </span>  ]
<span id="L3707" class="LineNr">3707 </span>]
<span id="L3708" class="LineNr">3708 </span>
<span id="L3709" class="LineNr">3709 </span><span class="muScenario">scenario</span> editor-starts-next-page-at-start-of-wrapped-line-2 [
<span id="L3710" class="LineNr">3710 </span>  <span class="Constant">local-scope</span>
<span id="L3711" class="LineNr">3711 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
<span id="L3712" class="LineNr">3712 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3713" class="LineNr">3713 </span>  <span class="Comment"># editor contains a very long line that occupies last two lines of screen</span>
<span id="L3714" class="LineNr">3714 </span>  <span class="Comment"># and still has something left over</span>
<span id="L3715" class="LineNr">3715 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3716" class="LineNr">3716 </span><span class="Constant">bcdefgh]</span>
<span id="L3717" class="LineNr">3717 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
<span id="L3718" class="LineNr">3718 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3719" class="LineNr">3719 </span>  <span class="Comment"># some part of last line is not displayed</span>
<span id="L3720" class="LineNr">3720 </span>  screen-should-contain [
<span id="L3721" class="LineNr">3721 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3722" class="LineNr">3722 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3723" class="LineNr">3723 </span>  <span class="Conceal">¦</span><span class="Constant"> .bcd↩      .</span>
<span id="L3724" class="LineNr">3724 </span>  <span class="Conceal">¦</span><span class="Constant"> .efg↩      .</span>
<span id="L3725" class="LineNr">3725 </span>  ]
<span id="L3726" class="LineNr">3726 </span>  <span class="Comment"># scroll down</span>
<span id="L3727" class="LineNr">3727 </span>  assume-console [
<span id="L3728" class="LineNr">3728 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3729" class="LineNr">3729 </span>  ]
<span id="L3730" class="LineNr">3730 </span>  run [
<span id="L3731" class="LineNr">3731 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3732" class="LineNr">3732 </span>  ]
<span id="L3733" class="LineNr">3733 </span>  <span class="Comment"># screen shows entire wrapped line</span>
<span id="L3734" class="LineNr">3734 </span>  screen-should-contain [
<span id="L3735" class="LineNr">3735 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3736" class="LineNr">3736 </span>  <span class="Conceal">¦</span><span class="Constant"> .bcd↩      .</span>
<span id="L3737" class="LineNr">3737 </span>  <span class="Conceal">¦</span><span class="Constant"> .efg↩      .</span>
<span id="L3738" class="LineNr">3738 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L3739" class="LineNr">3739 </span>  ]
<span id="L3740" class="LineNr">3740 </span>]
<span id="L3741" class="LineNr">3741 </span>
<span id="L3742" class="LineNr">3742 </span><span class="Comment"># ctrl-b/page-up - render previous page if it exists</span>
<span id="L3743" class="LineNr">3743 </span>
<span id="L3744" class="LineNr">3744 </span><span class="muScenario">scenario</span> editor-can-scroll-up [
<span id="L3745" class="LineNr">3745 </span>  <span class="Constant">local-scope</span>
<span id="L3746" class="LineNr">3746 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3747" class="LineNr">3747 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3748" class="LineNr">3748 </span><span class="Constant">b</span>
<span id="L3749" class="LineNr">3749 </span><span class="Constant">c</span>
<span id="L3750" class="LineNr">3750 </span><span class="Constant">d]</span>
<span id="L3751" class="LineNr">3751 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L3752" class="LineNr">3752 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3753" class="LineNr">3753 </span>  screen-should-contain [
<span id="L3754" class="LineNr">3754 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3755" class="LineNr">3755 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3756" class="LineNr">3756 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3757" class="LineNr">3757 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3758" class="LineNr">3758 </span>  ]
<span id="L3759" class="LineNr">3759 </span>  <span class="Comment"># scroll down</span>
<span id="L3760" class="LineNr">3760 </span>  assume-console [
<span id="L3761" class="LineNr">3761 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3762" class="LineNr">3762 </span>  ]
<span id="L3763" class="LineNr">3763 </span>  run [
<span id="L3764" class="LineNr">3764 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3765" class="LineNr">3765 </span>  ]
<span id="L3766" class="LineNr">3766 </span>  <span class="Comment"># screen shows next page</span>
<span id="L3767" class="LineNr">3767 </span>  screen-should-contain [
<span id="L3768" class="LineNr">3768 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3769" class="LineNr">3769 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3770" class="LineNr">3770 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L3771" class="LineNr">3771 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L3772" class="LineNr">3772 </span>  ]
<span id="L3773" class="LineNr">3773 </span>  <span class="Comment"># scroll back up</span>
<span id="L3774" class="LineNr">3774 </span>  assume-console [
<span id="L3775" class="LineNr">3775 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3820'>page-up</a>
<span id="L3776" class="LineNr">3776 </span>  ]
<span id="L3777" class="LineNr">3777 </span>  run [
<span id="L3778" class="LineNr">3778 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3779" class="LineNr">3779 </span>  ]
<span id="L3780" class="LineNr">3780 </span>  <span class="Comment"># screen shows original page again</span>
<span id="L3781" class="LineNr">3781 </span>  screen-should-contain [
<span id="L3782" class="LineNr">3782 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3783" class="LineNr">3783 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3784" class="LineNr">3784 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3785" class="LineNr">3785 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3786" class="LineNr">3786 </span>  ]
<span id="L3787" class="LineNr">3787 </span>]
<span id="L3788" class="LineNr">3788 </span>
<span id="L3789" class="LineNr">3789 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L3790" class="LineNr">3790 </span>  <span class="Delimiter">{</span>
<span id="L3791" class="LineNr">3791 </span>  <span class="Conceal">¦</span> page-up?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">2/ctrl-b</span>
<span id="L3792" class="LineNr">3792 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> page-up?
<span id="L3793" class="LineNr">3793 </span>  <span class="Conceal">¦</span> old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3794" class="LineNr">3794 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L3795" class="LineNr">3795 </span>  <span class="Conceal">¦</span> editor <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3820'>page-up</a> editor, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L3796" class="LineNr">3796 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L3797" class="LineNr">3797 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L3798" class="LineNr">3798 </span>  <span class="Conceal">¦</span> top-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3799" class="LineNr">3799 </span>  <span class="Conceal">¦</span> movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
<span id="L3800" class="LineNr">3800 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> movement?/go-render
<span id="L3801" class="LineNr">3801 </span>  <span class="Delimiter">}</span>
<span id="L3802" class="LineNr">3802 </span>]
<span id="L3803" class="LineNr">3803 </span>
<span id="L3804" class="LineNr">3804 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L199'>&lt;handle-special-key&gt;</a></span> [
<span id="L3805" class="LineNr">3805 </span>  <span class="Delimiter">{</span>
<span id="L3806" class="LineNr">3806 </span>  <span class="Conceal">¦</span> page-up?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65519/page-up</span>
<span id="L3807" class="LineNr">3807 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> page-up?
<span id="L3808" class="LineNr">3808 </span>  <span class="Conceal">¦</span> old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3809" class="LineNr">3809 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L3810" class="LineNr">3810 </span>  <span class="Conceal">¦</span> editor <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3820'>page-up</a> editor, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L3811" class="LineNr">3811 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L3812" class="LineNr">3812 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L3813" class="LineNr">3813 </span>  <span class="Conceal">¦</span> top-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3814" class="LineNr">3814 </span>  <span class="Conceal">¦</span> movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
<span id="L3815" class="LineNr">3815 </span>  <span class="Conceal">¦</span> <span class="Comment"># don't bother re-rendering if nothing changed. todo: test this</span>
<span id="L3816" class="LineNr">3816 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> movement?/go-render
<span id="L3817" class="LineNr">3817 </span>  <span class="Delimiter">}</span>
<span id="L3818" class="LineNr">3818 </span>]
<span id="L3819" class="LineNr">3819 </span>
<span id="L3820" class="LineNr">3820 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L3820'>page-up</a> editor:&amp;:editor, <a href='../081print.mu.html#L782'>screen-height</a>:num<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
<span id="L3821" class="LineNr">3821 </span>  <span class="Constant">local-scope</span>
<span id="L3822" class="LineNr">3822 </span>  <span class="Constant">load-ingredients</span>
<span id="L3823" class="LineNr">3823 </span>  max:num <span class="Special">&lt;-</span> subtract <a href='../081print.mu.html#L782'>screen-height</a>, <span class="Constant">1/menu-bar</span>, <span class="Constant">1/overlapping-line</span>
<span id="L3824" class="LineNr">3824 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L3825" class="LineNr">3825 </span>  top-of-screen:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L3826" class="LineNr">3826 </span>  <span class="Delimiter">{</span>
<span id="L3827" class="LineNr">3827 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
<span id="L3828" class="LineNr">3828 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
<span id="L3829" class="LineNr">3829 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3175'>before-previous-screen-line</a> top-of-screen, editor
<span id="L3830" class="LineNr">3830 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L36'>prev</a>
<span id="L3831" class="LineNr">3831 </span>  <span class="Conceal">¦</span> top-of-screen <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L36'>prev</a>
<span id="L3832" class="LineNr">3832 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
<span id="L3833" class="LineNr">3833 </span>  <span class="Conceal">¦</span> count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
<span id="L3834" class="LineNr">3834 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L3835" class="LineNr">3835 </span>  <span class="Delimiter">}</span>
<span id="L3836" class="LineNr">3836 </span>]
<span id="L3837" class="LineNr">3837 </span>
<span id="L3838" class="LineNr">3838 </span><span class="muScenario">scenario</span> editor-can-scroll-up-multiple-pages [
<span id="L3839" class="LineNr">3839 </span>  <span class="Constant">local-scope</span>
<span id="L3840" class="LineNr">3840 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3841" class="LineNr">3841 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3842" class="LineNr">3842 </span>  <span class="Comment"># initialize editor with 8 lines</span>
<span id="L3843" class="LineNr">3843 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3844" class="LineNr">3844 </span><span class="Constant">b</span>
<span id="L3845" class="LineNr">3845 </span><span class="Constant">c</span>
<span id="L3846" class="LineNr">3846 </span><span class="Constant">d</span>
<span id="L3847" class="LineNr">3847 </span><span class="Constant">e</span>
<span id="L3848" class="LineNr">3848 </span><span class="Constant">f</span>
<span id="L3849" class="LineNr">3849 </span><span class="Constant">g</span>
<span id="L3850" class="LineNr">3850 </span><span class="Constant">h]</span>
<span id="L3851" class="LineNr">3851 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L3852" class="LineNr">3852 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3853" class="LineNr">3853 </span>  screen-should-contain [
<span id="L3854" class="LineNr">3854 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3855" class="LineNr">3855 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3856" class="LineNr">3856 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3857" class="LineNr">3857 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3858" class="LineNr">3858 </span>  ]
<span id="L3859" class="LineNr">3859 </span>  <span class="Comment"># scroll down two pages</span>
<span id="L3860" class="LineNr">3860 </span>  assume-console [
<span id="L3861" class="LineNr">3861 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3862" class="LineNr">3862 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3863" class="LineNr">3863 </span>  ]
<span id="L3864" class="LineNr">3864 </span>  run [
<span id="L3865" class="LineNr">3865 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3866" class="LineNr">3866 </span>  ]
<span id="L3867" class="LineNr">3867 </span>  <span class="Comment"># screen shows third page</span>
<span id="L3868" class="LineNr">3868 </span>  screen-should-contain [
<span id="L3869" class="LineNr">3869 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3870" class="LineNr">3870 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L3871" class="LineNr">3871 </span>  <span class="Conceal">¦</span><span class="Constant"> .f         .</span>
<span id="L3872" class="LineNr">3872 </span>  <span class="Conceal">¦</span><span class="Constant"> .g         .</span>
<span id="L3873" class="LineNr">3873 </span>  ]
<span id="L3874" class="LineNr">3874 </span>  <span class="Comment"># scroll up</span>
<span id="L3875" class="LineNr">3875 </span>  assume-console [
<span id="L3876" class="LineNr">3876 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3820'>page-up</a>
<span id="L3877" class="LineNr">3877 </span>  ]
<span id="L3878" class="LineNr">3878 </span>  run [
<span id="L3879" class="LineNr">3879 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3880" class="LineNr">3880 </span>  ]
<span id="L3881" class="LineNr">3881 </span>  <span class="Comment"># screen shows second page</span>
<span id="L3882" class="LineNr">3882 </span>  screen-should-contain [
<span id="L3883" class="LineNr">3883 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3884" class="LineNr">3884 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3885" class="LineNr">3885 </span>  <span class="Conceal">¦</span><span class="Constant"> .d         .</span>
<span id="L3886" class="LineNr">3886 </span>  <span class="Conceal">¦</span><span class="Constant"> .e         .</span>
<span id="L3887" class="LineNr">3887 </span>  ]
<span id="L3888" class="LineNr">3888 </span>  <span class="Comment"># scroll up again</span>
<span id="L3889" class="LineNr">3889 </span>  assume-console [
<span id="L3890" class="LineNr">3890 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3820'>page-up</a>
<span id="L3891" class="LineNr">3891 </span>  ]
<span id="L3892" class="LineNr">3892 </span>  run [
<span id="L3893" class="LineNr">3893 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3894" class="LineNr">3894 </span>  ]
<span id="L3895" class="LineNr">3895 </span>  <span class="Comment"># screen shows original page again</span>
<span id="L3896" class="LineNr">3896 </span>  screen-should-contain [
<span id="L3897" class="LineNr">3897 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3898" class="LineNr">3898 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3899" class="LineNr">3899 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3900" class="LineNr">3900 </span>  <span class="Conceal">¦</span><span class="Constant"> .c         .</span>
<span id="L3901" class="LineNr">3901 </span>  ]
<span id="L3902" class="LineNr">3902 </span>]
<span id="L3903" class="LineNr">3903 </span>
<span id="L3904" class="LineNr">3904 </span><span class="muScenario">scenario</span> editor-can-scroll-up-wrapped-lines [
<span id="L3905" class="LineNr">3905 </span>  <span class="Constant">local-scope</span>
<span id="L3906" class="LineNr">3906 </span>  <span class="Comment"># screen has 1 line for menu + 5 lines for text</span>
<span id="L3907" class="LineNr">3907 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">6/height</span>
<span id="L3908" class="LineNr">3908 </span>  <span class="Comment"># editor contains a long line in the first page</span>
<span id="L3909" class="LineNr">3909 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3910" class="LineNr">3910 </span><span class="Constant">b</span>
<span id="L3911" class="LineNr">3911 </span><span class="Constant">cdefgh</span>
<span id="L3912" class="LineNr">3912 </span><span class="Constant">i</span>
<span id="L3913" class="LineNr">3913 </span><span class="Constant">j</span>
<span id="L3914" class="LineNr">3914 </span><span class="Constant">k</span>
<span id="L3915" class="LineNr">3915 </span><span class="Constant">l</span>
<span id="L3916" class="LineNr">3916 </span><span class="Constant">m</span>
<span id="L3917" class="LineNr">3917 </span><span class="Constant">n</span>
<span id="L3918" class="LineNr">3918 </span><span class="Constant">o]</span>
<span id="L3919" class="LineNr">3919 </span>  <span class="Comment"># editor screen triggers wrap of last line</span>
<span id="L3920" class="LineNr">3920 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
<span id="L3921" class="LineNr">3921 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3922" class="LineNr">3922 </span>  <span class="Comment"># some part of last line is not displayed</span>
<span id="L3923" class="LineNr">3923 </span>  screen-should-contain [
<span id="L3924" class="LineNr">3924 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3925" class="LineNr">3925 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3926" class="LineNr">3926 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3927" class="LineNr">3927 </span>  <span class="Conceal">¦</span><span class="Constant"> .cde↩      .</span>
<span id="L3928" class="LineNr">3928 </span>  <span class="Conceal">¦</span><span class="Constant"> .fgh       .</span>
<span id="L3929" class="LineNr">3929 </span>  <span class="Conceal">¦</span><span class="Constant"> .i         .</span>
<span id="L3930" class="LineNr">3930 </span>  ]
<span id="L3931" class="LineNr">3931 </span>  <span class="Comment"># scroll down a page and a line</span>
<span id="L3932" class="LineNr">3932 </span>  assume-console [
<span id="L3933" class="LineNr">3933 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3934" class="LineNr">3934 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 5</span>,<span class="Constant"> 0</span>
<span id="L3935" class="LineNr">3935 </span>  <span class="Conceal">¦</span> press down-arrow
<span id="L3936" class="LineNr">3936 </span>  ]
<span id="L3937" class="LineNr">3937 </span>  run [
<span id="L3938" class="LineNr">3938 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3939" class="LineNr">3939 </span>  ]
<span id="L3940" class="LineNr">3940 </span>  <span class="Comment"># screen shows entire wrapped line</span>
<span id="L3941" class="LineNr">3941 </span>  screen-should-contain [
<span id="L3942" class="LineNr">3942 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3943" class="LineNr">3943 </span>  <span class="Conceal">¦</span><span class="Constant"> .j         .</span>
<span id="L3944" class="LineNr">3944 </span>  <span class="Conceal">¦</span><span class="Constant"> .k         .</span>
<span id="L3945" class="LineNr">3945 </span>  <span class="Conceal">¦</span><span class="Constant"> .l         .</span>
<span id="L3946" class="LineNr">3946 </span>  <span class="Conceal">¦</span><span class="Constant"> .m         .</span>
<span id="L3947" class="LineNr">3947 </span>  <span class="Conceal">¦</span><span class="Constant"> .n         .</span>
<span id="L3948" class="LineNr">3948 </span>  ]
<span id="L3949" class="LineNr">3949 </span>  <span class="Comment"># now scroll up one page</span>
<span id="L3950" class="LineNr">3950 </span>  assume-console [
<span id="L3951" class="LineNr">3951 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3820'>page-up</a>
<span id="L3952" class="LineNr">3952 </span>  ]
<span id="L3953" class="LineNr">3953 </span>  run [
<span id="L3954" class="LineNr">3954 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3955" class="LineNr">3955 </span>  ]
<span id="L3956" class="LineNr">3956 </span>  <span class="Comment"># screen resets</span>
<span id="L3957" class="LineNr">3957 </span>  screen-should-contain [
<span id="L3958" class="LineNr">3958 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3959" class="LineNr">3959 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L3960" class="LineNr">3960 </span>  <span class="Conceal">¦</span><span class="Constant"> .cde↩      .</span>
<span id="L3961" class="LineNr">3961 </span>  <span class="Conceal">¦</span><span class="Constant"> .fgh       .</span>
<span id="L3962" class="LineNr">3962 </span>  <span class="Conceal">¦</span><span class="Constant"> .i         .</span>
<span id="L3963" class="LineNr">3963 </span>  <span class="Conceal">¦</span><span class="Constant"> .j         .</span>
<span id="L3964" class="LineNr">3964 </span>  ]
<span id="L3965" class="LineNr">3965 </span>]
<span id="L3966" class="LineNr">3966 </span>
<span id="L3967" class="LineNr">3967 </span><span class="muScenario">scenario</span> editor-can-scroll-up-wrapped-lines-2 [
<span id="L3968" class="LineNr">3968 </span>  <span class="Constant">local-scope</span>
<span id="L3969" class="LineNr">3969 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines for text</span>
<span id="L3970" class="LineNr">3970 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3971" class="LineNr">3971 </span>  <span class="Comment"># editor contains a very long line that occupies last two lines of screen</span>
<span id="L3972" class="LineNr">3972 </span>  <span class="Comment"># and still has something left over</span>
<span id="L3973" class="LineNr">3973 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3974" class="LineNr">3974 </span><span class="Constant">bcdefgh]</span>
<span id="L3975" class="LineNr">3975 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
<span id="L3976" class="LineNr">3976 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3977" class="LineNr">3977 </span>  <span class="Comment"># some part of last line is not displayed</span>
<span id="L3978" class="LineNr">3978 </span>  screen-should-contain [
<span id="L3979" class="LineNr">3979 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3980" class="LineNr">3980 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L3981" class="LineNr">3981 </span>  <span class="Conceal">¦</span><span class="Constant"> .bcd↩      .</span>
<span id="L3982" class="LineNr">3982 </span>  <span class="Conceal">¦</span><span class="Constant"> .efg↩      .</span>
<span id="L3983" class="LineNr">3983 </span>  ]
<span id="L3984" class="LineNr">3984 </span>  <span class="Comment"># scroll down</span>
<span id="L3985" class="LineNr">3985 </span>  assume-console [
<span id="L3986" class="LineNr">3986 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3987" class="LineNr">3987 </span>  ]
<span id="L3988" class="LineNr">3988 </span>  run [
<span id="L3989" class="LineNr">3989 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L3990" class="LineNr">3990 </span>  ]
<span id="L3991" class="LineNr">3991 </span>  <span class="Comment"># screen shows entire wrapped line</span>
<span id="L3992" class="LineNr">3992 </span>  screen-should-contain [
<span id="L3993" class="LineNr">3993 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L3994" class="LineNr">3994 </span>  <span class="Conceal">¦</span><span class="Constant"> .bcd↩      .</span>
<span id="L3995" class="LineNr">3995 </span>  <span class="Conceal">¦</span><span class="Constant"> .efg↩      .</span>
<span id="L3996" class="LineNr">3996 </span>  <span class="Conceal">¦</span><span class="Constant"> .h         .</span>
<span id="L3997" class="LineNr">3997 </span>  ]
<span id="L3998" class="LineNr">3998 </span>  <span class="Comment"># scroll back up</span>
<span id="L3999" class="LineNr">3999 </span>  assume-console [
<span id="L4000" class="LineNr">4000 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3820'>page-up</a>
<span id="L4001" class="LineNr">4001 </span>  ]
<span id="L4002" class="LineNr">4002 </span>  run [
<span id="L4003" class="LineNr">4003 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4004" class="LineNr">4004 </span>  ]
<span id="L4005" class="LineNr">4005 </span>  <span class="Comment"># screen resets</span>
<span id="L4006" class="LineNr">4006 </span>  screen-should-contain [
<span id="L4007" class="LineNr">4007 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4008" class="LineNr">4008 </span>  <span class="Conceal">¦</span><span class="Constant"> .a         .</span>
<span id="L4009" class="LineNr">4009 </span>  <span class="Conceal">¦</span><span class="Constant"> .bcd↩      .</span>
<span id="L4010" class="LineNr">4010 </span>  <span class="Conceal">¦</span><span class="Constant"> .efg↩      .</span>
<span id="L4011" class="LineNr">4011 </span>  ]
<span id="L4012" class="LineNr">4012 </span>]
<span id="L4013" class="LineNr">4013 </span>
<span id="L4014" class="LineNr">4014 </span><span class="muScenario">scenario</span> editor-can-scroll-up-past-nonempty-lines [
<span id="L4015" class="LineNr">4015 </span>  <span class="Constant">local-scope</span>
<span id="L4016" class="LineNr">4016 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L4017" class="LineNr">4017 </span>  <span class="Comment"># text with empty line in second screen</span>
<span id="L4018" class="LineNr">4018 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[axx</span>
<span id="L4019" class="LineNr">4019 </span><span class="Constant">bxx</span>
<span id="L4020" class="LineNr">4020 </span><span class="Constant">cxx</span>
<span id="L4021" class="LineNr">4021 </span><span class="Constant">dxx</span>
<span id="L4022" class="LineNr">4022 </span><span class="Constant">exx</span>
<span id="L4023" class="LineNr">4023 </span><span class="Constant">fxx</span>
<span id="L4024" class="LineNr">4024 </span><span class="Constant">gxx</span>
<span id="L4025" class="LineNr">4025 </span><span class="Constant">hxx</span>
<span id="L4026" class="LineNr">4026 </span><span class="Constant">]</span>
<span id="L4027" class="LineNr">4027 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
<span id="L4028" class="LineNr">4028 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L4029" class="LineNr">4029 </span>  screen-should-contain [
<span id="L4030" class="LineNr">4030 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4031" class="LineNr">4031 </span>  <span class="Conceal">¦</span><span class="Constant"> .axx       .</span>
<span id="L4032" class="LineNr">4032 </span>  <span class="Conceal">¦</span><span class="Constant"> .bxx       .</span>
<span id="L4033" class="LineNr">4033 </span>  <span class="Conceal">¦</span><span class="Constant"> .cxx       .</span>
<span id="L4034" class="LineNr">4034 </span>  ]
<span id="L4035" class="LineNr">4035 </span>  assume-console [
<span id="L4036" class="LineNr">4036 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L4037" class="LineNr">4037 </span>  ]
<span id="L4038" class="LineNr">4038 </span>  run [
<span id="L4039" class="LineNr">4039 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4040" class="LineNr">4040 </span>  ]
<span id="L4041" class="LineNr">4041 </span>  screen-should-contain [
<span id="L4042" class="LineNr">4042 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4043" class="LineNr">4043 </span>  <span class="Conceal">¦</span><span class="Constant"> .cxx       .</span>
<span id="L4044" class="LineNr">4044 </span>  <span class="Conceal">¦</span><span class="Constant"> .dxx       .</span>
<span id="L4045" class="LineNr">4045 </span>  <span class="Conceal">¦</span><span class="Constant"> .exx       .</span>
<span id="L4046" class="LineNr">4046 </span>  ]
<span id="L4047" class="LineNr">4047 </span>  assume-console [
<span id="L4048" class="LineNr">4048 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L4049" class="LineNr">4049 </span>  ]
<span id="L4050" class="LineNr">4050 </span>  run [
<span id="L4051" class="LineNr">4051 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4052" class="LineNr">4052 </span>  ]
<span id="L4053" class="LineNr">4053 </span>  screen-should-contain [
<span id="L4054" class="LineNr">4054 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4055" class="LineNr">4055 </span>  <span class="Conceal">¦</span><span class="Constant"> .exx       .</span>
<span id="L4056" class="LineNr">4056 </span>  <span class="Conceal">¦</span><span class="Constant"> .fxx       .</span>
<span id="L4057" class="LineNr">4057 </span>  <span class="Conceal">¦</span><span class="Constant"> .gxx       .</span>
<span id="L4058" class="LineNr">4058 </span>  ]
<span id="L4059" class="LineNr">4059 </span>  <span class="Comment"># scroll back up past empty line</span>
<span id="L4060" class="LineNr">4060 </span>  assume-console [
<span id="L4061" class="LineNr">4061 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3820'>page-up</a>
<span id="L4062" class="LineNr">4062 </span>  ]
<span id="L4063" class="LineNr">4063 </span>  run [
<span id="L4064" class="LineNr">4064 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4065" class="LineNr">4065 </span>  ]
<span id="L4066" class="LineNr">4066 </span>  screen-should-contain [
<span id="L4067" class="LineNr">4067 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4068" class="LineNr">4068 </span>  <span class="Conceal">¦</span><span class="Constant"> .cxx       .</span>
<span id="L4069" class="LineNr">4069 </span>  <span class="Conceal">¦</span><span class="Constant"> .dxx       .</span>
<span id="L4070" class="LineNr">4070 </span>  <span class="Conceal">¦</span><span class="Constant"> .exx       .</span>
<span id="L4071" class="LineNr">4071 </span>  ]
<span id="L4072" class="LineNr">4072 </span>]
<span id="L4073" class="LineNr">4073 </span>
<span id="L4074" class="LineNr">4074 </span><span class="muScenario">scenario</span> editor-can-scroll-up-past-empty-lines [
<span id="L4075" class="LineNr">4075 </span>  <span class="Constant">local-scope</span>
<span id="L4076" class="LineNr">4076 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L4077" class="LineNr">4077 </span>  <span class="Comment"># text with empty line in second screen</span>
<span id="L4078" class="LineNr">4078 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[axy</span>
<span id="L4079" class="LineNr">4079 </span><span class="Constant">bxy</span>
<span id="L4080" class="LineNr">4080 </span><span class="Constant">cxy</span>
<span id="L4081" class="LineNr">4081 </span>
<span id="L4082" class="LineNr">4082 </span>dxy
<span id="L4083" class="LineNr">4083 </span>exy
<span id="L4084" class="LineNr">4084 </span>fxy
<span id="L4085" class="LineNr">4085 </span>gxy
<span id="L4086" class="LineNr">4086 </span>]
<span id="L4087" class="LineNr">4087 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>
<span id="L4088" class="LineNr">4088 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L4089" class="LineNr">4089 </span>  screen-should-contain [
<span id="L4090" class="LineNr">4090 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4091" class="LineNr">4091 </span>  <span class="Conceal">¦</span><span class="Constant"> .axy       .</span>
<span id="L4092" class="LineNr">4092 </span>  <span class="Conceal">¦</span><span class="Constant"> .bxy       .</span>
<span id="L4093" class="LineNr">4093 </span>  <span class="Conceal">¦</span><span class="Constant"> .cxy       .</span>
<span id="L4094" class="LineNr">4094 </span>  ]
<span id="L4095" class="LineNr">4095 </span>  assume-console [
<span id="L4096" class="LineNr">4096 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L4097" class="LineNr">4097 </span>  ]
<span id="L4098" class="LineNr">4098 </span>  run [
<span id="L4099" class="LineNr">4099 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4100" class="LineNr">4100 </span>  ]
<span id="L4101" class="LineNr">4101 </span>  screen-should-contain [
<span id="L4102" class="LineNr">4102 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4103" class="LineNr">4103 </span>  <span class="Conceal">¦</span><span class="Constant"> .cxy       .</span>
<span id="L4104" class="LineNr">4104 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4105" class="LineNr">4105 </span>  <span class="Conceal">¦</span><span class="Constant"> .dxy       .</span>
<span id="L4106" class="LineNr">4106 </span>  ]
<span id="L4107" class="LineNr">4107 </span>  assume-console [
<span id="L4108" class="LineNr">4108 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L4109" class="LineNr">4109 </span>  ]
<span id="L4110" class="LineNr">4110 </span>  run [
<span id="L4111" class="LineNr">4111 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4112" class="LineNr">4112 </span>  ]
<span id="L4113" class="LineNr">4113 </span>  screen-should-contain [
<span id="L4114" class="LineNr">4114 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4115" class="LineNr">4115 </span>  <span class="Conceal">¦</span><span class="Constant"> .dxy       .</span>
<span id="L4116" class="LineNr">4116 </span>  <span class="Conceal">¦</span><span class="Constant"> .exy       .</span>
<span id="L4117" class="LineNr">4117 </span>  <span class="Conceal">¦</span><span class="Constant"> .fxy       .</span>
<span id="L4118" class="LineNr">4118 </span>  ]
<span id="L4119" class="LineNr">4119 </span>  <span class="Comment"># scroll back up past empty line</span>
<span id="L4120" class="LineNr">4120 </span>  assume-console [
<span id="L4121" class="LineNr">4121 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3820'>page-up</a>
<span id="L4122" class="LineNr">4122 </span>  ]
<span id="L4123" class="LineNr">4123 </span>  run [
<span id="L4124" class="LineNr">4124 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4125" class="LineNr">4125 </span>  ]
<span id="L4126" class="LineNr">4126 </span>  screen-should-contain [
<span id="L4127" class="LineNr">4127 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4128" class="LineNr">4128 </span>  <span class="Conceal">¦</span><span class="Constant"> .cxy       .</span>
<span id="L4129" class="LineNr">4129 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4130" class="LineNr">4130 </span>  <span class="Conceal">¦</span><span class="Constant"> .dxy       .</span>
<span id="L4131" class="LineNr">4131 </span>  ]
<span id="L4132" class="LineNr">4132 </span>]
<span id="L4133" class="LineNr">4133 </span>
<span id="L4134" class="LineNr">4134 </span><span class="Comment"># ctrl-s - scroll up by one line</span>
<span id="L4135" class="LineNr">4135 </span><span class="Comment"># todo: scenarios</span>
<span id="L4136" class="LineNr">4136 </span>
<span id="L4137" class="LineNr">4137 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L4138" class="LineNr">4138 </span>  <span class="Delimiter">{</span>
<span id="L4139" class="LineNr">4139 </span>  <span class="Conceal">¦</span> scroll-up?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">19/ctrl-s</span>
<span id="L4140" class="LineNr">4140 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> scroll-up?
<span id="L4141" class="LineNr">4141 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L4142" class="LineNr">4142 </span>  <span class="Conceal">¦</span> go-render?:bool, editor <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L4149'>line-up</a> editor, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L4143" class="LineNr">4143 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">5/line-up</span>
<span id="L4144" class="LineNr">4144 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L4145" class="LineNr">4145 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> go-render?
<span id="L4146" class="LineNr">4146 </span>  <span class="Delimiter">}</span>
<span id="L4147" class="LineNr">4147 </span>]
<span id="L4148" class="LineNr">4148 </span>
<span id="L4149" class="LineNr">4149 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L4149'>line-up</a> editor:&amp;:editor, <a href='../081print.mu.html#L782'>screen-height</a>:num<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
<span id="L4150" class="LineNr">4150 </span>  <span class="Constant">local-scope</span>
<span id="L4151" class="LineNr">4151 </span>  <span class="Constant">load-ingredients</span>
<span id="L4152" class="LineNr">4152 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L4153" class="LineNr">4153 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L4154" class="LineNr">4154 </span>  max:num <span class="Special">&lt;-</span> subtract right, left
<span id="L4155" class="LineNr">4155 </span>  old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L4156" class="LineNr">4156 </span>  new-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2804'>before-start-of-next-line</a> old-top, max
<span id="L4157" class="LineNr">4157 </span>  movement?:bool <span class="Special">&lt;-</span> not-equal old-top, new-top
<span id="L4158" class="LineNr">4158 </span>  <span class="Delimiter">{</span>
<span id="L4159" class="LineNr">4159 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> movement?
<span id="L4160" class="LineNr">4160 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, new-top
<span id="L4161" class="LineNr">4161 </span>  <span class="Delimiter">}</span>
<span id="L4162" class="LineNr">4162 </span>  <span class="muControl">return</span> movement?
<span id="L4163" class="LineNr">4163 </span>]
<span id="L4164" class="LineNr">4164 </span>
<span id="L4165" class="LineNr">4165 </span><span class="Comment"># ctrl-x - scroll down by one line</span>
<span id="L4166" class="LineNr">4166 </span><span class="Comment"># todo: scenarios</span>
<span id="L4167" class="LineNr">4167 </span>
<span id="L4168" class="LineNr">4168 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L4169" class="LineNr">4169 </span>  <span class="Delimiter">{</span>
<span id="L4170" class="LineNr">4170 </span>  <span class="Conceal">¦</span> scroll-down?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">24/ctrl-x</span>
<span id="L4171" class="LineNr">4171 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> scroll-down?
<span id="L4172" class="LineNr">4172 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L4173" class="LineNr">4173 </span>  <span class="Conceal">¦</span> go-render?:bool, editor <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L4180'>line-down</a> editor, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L4174" class="LineNr">4174 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">6/line-down</span>
<span id="L4175" class="LineNr">4175 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L4176" class="LineNr">4176 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> go-render?
<span id="L4177" class="LineNr">4177 </span>  <span class="Delimiter">}</span>
<span id="L4178" class="LineNr">4178 </span>]
<span id="L4179" class="LineNr">4179 </span>
<span id="L4180" class="LineNr">4180 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L4180'>line-down</a> editor:&amp;:editor, <a href='../081print.mu.html#L782'>screen-height</a>:num<span class="muRecipe"> -&gt; </span>go-render?:bool, editor:&amp;:editor [
<span id="L4181" class="LineNr">4181 </span>  <span class="Constant">local-scope</span>
<span id="L4182" class="LineNr">4182 </span>  <span class="Constant">load-ingredients</span>
<span id="L4183" class="LineNr">4183 </span>  old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L4184" class="LineNr">4184 </span>  new-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3175'>before-previous-screen-line</a> old-top, editor
<span id="L4185" class="LineNr">4185 </span>  movement?:bool <span class="Special">&lt;-</span> not-equal old-top, new-top
<span id="L4186" class="LineNr">4186 </span>  <span class="Delimiter">{</span>
<span id="L4187" class="LineNr">4187 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> movement?
<span id="L4188" class="LineNr">4188 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, new-top
<span id="L4189" class="LineNr">4189 </span>  <span class="Delimiter">}</span>
<span id="L4190" class="LineNr">4190 </span>  <span class="muControl">return</span> movement?
<span id="L4191" class="LineNr">4191 </span>]
<span id="L4192" class="LineNr">4192 </span>
<span id="L4193" class="LineNr">4193 </span><span class="Comment"># ctrl-t - move current line to top of screen</span>
<span id="L4194" class="LineNr">4194 </span><span class="Comment"># todo: scenarios</span>
<span id="L4195" class="LineNr">4195 </span>
<span id="L4196" class="LineNr">4196 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L4197" class="LineNr">4197 </span>  <span class="Delimiter">{</span>
<span id="L4198" class="LineNr">4198 </span>  <span class="Conceal">¦</span> scroll-down?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">20/ctrl-t</span>
<span id="L4199" class="LineNr">4199 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> scroll-down?
<span id="L4200" class="LineNr">4200 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-begin&gt;</span>
<span id="L4201" class="LineNr">4201 </span>  <span class="Conceal">¦</span> old-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">top-of-screen:offset</span>
<span id="L4202" class="LineNr">4202 </span>  <span class="Conceal">¦</span> cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L4203" class="LineNr">4203 </span>  <span class="Conceal">¦</span> cursor <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> cursor
<span id="L4204" class="LineNr">4204 </span>  <span class="Conceal">¦</span> new-top:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3175'>before-previous-screen-line</a> cursor, editor
<span id="L4205" class="LineNr">4205 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, new-top
<span id="L4206" class="LineNr">4206 </span>  <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>,<span class="Constant"> 1</span>
<span id="L4207" class="LineNr">4207 </span>  <span class="Conceal">¦</span> go-render?:bool <span class="Special">&lt;-</span> not-equal new-top, old-top
<span id="L4208" class="LineNr">4208 </span>  <span class="Conceal">¦</span> undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L4209" class="LineNr">4209 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;move-cursor-end&gt;</span>
<span id="L4210" class="LineNr">4210 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span> go-render?
<span id="L4211" class="LineNr">4211 </span>  <span class="Delimiter">}</span>
<span id="L4212" class="LineNr">4212 </span>]
<span id="L4213" class="LineNr">4213 </span>
<span id="L4214" class="LineNr">4214 </span><span class="Comment"># ctrl-/ - comment/uncomment current line</span>
<span id="L4215" class="LineNr">4215 </span>
<span id="L4216" class="LineNr">4216 </span><span class="muRecipe">after</span> <span class="Constant"><a href='002-typing.mu.html#L185'>&lt;handle-special-character&gt;</a></span> [
<span id="L4217" class="LineNr">4217 </span>  <span class="Delimiter">{</span>
<span id="L4218" class="LineNr">4218 </span>  <span class="Conceal">¦</span> comment-toggle?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">31/ctrl-slash</span>
<span id="L4219" class="LineNr">4219 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> comment-toggle?
<span id="L4220" class="LineNr">4220 </span>  <span class="Conceal">¦</span> cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L4221" class="LineNr">4221 </span>  <span class="Conceal">¦</span> data:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">data:offset</span>
<span id="L4222" class="LineNr">4222 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;insert-character-begin&gt;</span>
<span id="L4223" class="LineNr">4223 </span>  <span class="Conceal">¦</span> before-line-start:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L4280'>before-start-of-screen-line</a> editor
<span id="L4224" class="LineNr">4224 </span>  <span class="Conceal">¦</span> line-start:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-line-start
<span id="L4225" class="LineNr">4225 </span>  <span class="Conceal">¦</span> commented-out?:bool <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L589'>match</a> line-start, <span class="Constant">[#? ]</span>  <span class="Comment"># comment prefix</span>
<span id="L4226" class="LineNr">4226 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L4227" class="LineNr">4227 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> commented-out?
<span id="L4228" class="LineNr">4228 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># uncomment</span>
<span id="L4229" class="LineNr">4229 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> data <span class="Special">&lt;-</span> remove line-start, <span class="Constant">3/length-comment-prefix</span>, data
<span id="L4230" class="LineNr">4230 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> subtract cursor-column, <span class="Constant">3/length-comment-prefix</span>
<span id="L4231" class="LineNr">4231 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L4232" class="LineNr">4232 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> go-render? <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L4250'>render-line-from-start</a> <a href='../081print.mu.html#L16'>screen</a>, editor, <span class="Constant">3/size-of-comment-leader</span>
<span id="L4233" class="LineNr">4233 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L4234" class="LineNr">4234 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
<span id="L4235" class="LineNr">4235 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> commented-out?
<span id="L4236" class="LineNr">4236 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># comment</span>
<span id="L4237" class="LineNr">4237 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> insert before-line-start, <span class="Constant">[#? ]</span>
<span id="L4238" class="LineNr">4238 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> cursor-column <span class="Special">&lt;-</span> add cursor-column, <span class="Constant">3/length-comment-prefix</span>
<span id="L4239" class="LineNr">4239 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L4240" class="LineNr">4240 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> go-render? <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L4250'>render-line-from-start</a> <a href='../081print.mu.html#L16'>screen</a>, editor,<span class="Constant"> 0</span>
<span id="L4241" class="LineNr">4241 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
<span id="L4242" class="LineNr">4242 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> &lt;insert-character-end&gt;</span>
<span id="L4243" class="LineNr">4243 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
<span id="L4244" class="LineNr">4244 </span>  <span class="Delimiter">}</span>
<span id="L4245" class="LineNr">4245 </span>]
<span id="L4246" class="LineNr">4246 </span>
<span id="L4247" class="LineNr">4247 </span><span class="Comment"># Render just from the start of the current line, and only if it wasn't</span>
<span id="L4248" class="LineNr">4248 </span><span class="Comment"># wrapping before (include margin) and isn't wrapping now. Otherwise just tell</span>
<span id="L4249" class="LineNr">4249 </span><span class="Comment"># the caller to go-render? the entire screen.</span>
<span id="L4250" class="LineNr">4250 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L4250'>render-line-from-start</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, editor:&amp;:editor, right-margin:num<span class="muRecipe"> -&gt; </span>go-render?:bool, <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a> [
<span id="L4251" class="LineNr">4251 </span>  <span class="Constant">local-scope</span>
<span id="L4252" class="LineNr">4252 </span>  <span class="Constant">load-ingredients</span>
<span id="L4253" class="LineNr">4253 </span>  before-line-start:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L4280'>before-start-of-screen-line</a> editor
<span id="L4254" class="LineNr">4254 </span>  line-start:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> before-line-start
<span id="L4255" class="LineNr">4255 </span>  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
<span id="L4256" class="LineNr">4256 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L4257" class="LineNr">4257 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L4258" class="LineNr">4258 </span>  <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, cursor-row, left
<span id="L4259" class="LineNr">4259 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L4260" class="LineNr">4260 </span>  end:num <span class="Special">&lt;-</span> subtract right, right-margin
<span id="L4261" class="LineNr">4261 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L4262" class="LineNr">4262 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy line-start
<span id="L4263" class="LineNr">4263 </span>  <span class="Delimiter">{</span>
<span id="L4264" class="LineNr">4264 </span>  <span class="Conceal">¦</span> render-all?:bool <span class="Special">&lt;-</span> greater-or-equal i, end
<span id="L4265" class="LineNr">4265 </span>  <span class="Conceal">¦</span> <span class="muControl">return-if</span> render-all?, <span class="Constant">1/go-render</span>
<span id="L4266" class="LineNr">4266 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
<span id="L4267" class="LineNr">4267 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L4268" class="LineNr">4268 </span>  <span class="Conceal">¦</span> newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L4269" class="LineNr">4269 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> newline?
<span id="L4270" class="LineNr">4270 </span>  <span class="Conceal">¦</span> color <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L397'>get-color</a> color, c
<span id="L4271" class="LineNr">4271 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, c, color
<span id="L4272" class="LineNr">4272 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
<span id="L4273" class="LineNr">4273 </span>  <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L4274" class="LineNr">4274 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
<span id="L4275" class="LineNr">4275 </span>  <span class="Delimiter">}</span>
<span id="L4276" class="LineNr">4276 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right
<span id="L4277" class="LineNr">4277 </span>  <span class="muControl">return</span> <span class="Constant">0/dont-render</span>
<span id="L4278" class="LineNr">4278 </span>]
<span id="L4279" class="LineNr">4279 </span>
<span id="L4280" class="LineNr">4280 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L4280'>before-start-of-screen-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char [
<span id="L4281" class="LineNr">4281 </span>  <span class="Constant">local-scope</span>
<span id="L4282" class="LineNr">4282 </span>  <span class="Constant">load-ingredients</span>
<span id="L4283" class="LineNr">4283 </span>  cursor:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> get *editor, <span class="Constant">before-cursor:offset</span>
<span id="L4284" class="LineNr">4284 </span>  <span class="Delimiter">{</span>
<span id="L4285" class="LineNr">4285 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> cursor
<span id="L4286" class="LineNr">4286 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L4287" class="LineNr">4287 </span>  <span class="Conceal">¦</span> cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L29'>next</a>
<span id="L4288" class="LineNr">4288 </span>  <span class="Delimiter">}</span>
<span id="L4289" class="LineNr">4289 </span>  result <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L3175'>before-previous-screen-line</a> cursor, editor
<span id="L4290" class="LineNr">4290 </span>]
<span id="L4291" class="LineNr">4291 </span>
<span id="L4292" class="LineNr">4292 </span><span class="muScenario">scenario</span> editor-comments-empty-line [
<span id="L4293" class="LineNr">4293 </span>  <span class="Constant">local-scope</span>
<span id="L4294" class="LineNr">4294 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L4295" class="LineNr">4295 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L4296" class="LineNr">4296 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L4297" class="LineNr">4297 </span>  $clear-trace
<span id="L4298" class="LineNr">4298 </span>  assume-console [
<span id="L4299" class="LineNr">4299 </span>  <span class="Conceal">¦</span> press ctrl-slash
<span id="L4300" class="LineNr">4300 </span>  ]
<span id="L4301" class="LineNr">4301 </span>  run [
<span id="L4302" class="LineNr">4302 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4303" class="LineNr">4303 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L4304" class="LineNr">4304 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L4305" class="LineNr">4305 </span>  ]
<span id="L4306" class="LineNr">4306 </span>  screen-should-contain [
<span id="L4307" class="LineNr">4307 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4308" class="LineNr">4308 </span>  <span class="Conceal">¦</span><span class="Constant"> .#?        .</span>
<span id="L4309" class="LineNr">4309 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4310" class="LineNr">4310 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4311" class="LineNr">4311 </span>  ]
<span id="L4312" class="LineNr">4312 </span>  memory-should-contain [
<span id="L4313" class="LineNr">4313 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L4314" class="LineNr">4314 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L4315" class="LineNr">4315 </span>  ]
<span id="L4316" class="LineNr">4316 </span>  check-trace-count-for-label<span class="Constant"> 5</span>, <span class="Constant">[print-character]</span>
<span id="L4317" class="LineNr">4317 </span>]
<span id="L4318" class="LineNr">4318 </span>
<span id="L4319" class="LineNr">4319 </span><span class="muScenario">scenario</span> editor-comments-at-start-of-contents [
<span id="L4320" class="LineNr">4320 </span>  <span class="Constant">local-scope</span>
<span id="L4321" class="LineNr">4321 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L4322" class="LineNr">4322 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[ab]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L4323" class="LineNr">4323 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L4324" class="LineNr">4324 </span>  $clear-trace
<span id="L4325" class="LineNr">4325 </span>  assume-console [
<span id="L4326" class="LineNr">4326 </span>  <span class="Conceal">¦</span> press ctrl-slash
<span id="L4327" class="LineNr">4327 </span>  ]
<span id="L4328" class="LineNr">4328 </span>  run [
<span id="L4329" class="LineNr">4329 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4330" class="LineNr">4330 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L4331" class="LineNr">4331 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L4332" class="LineNr">4332 </span>  ]
<span id="L4333" class="LineNr">4333 </span>  screen-should-contain [
<span id="L4334" class="LineNr">4334 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4335" class="LineNr">4335 </span>  <span class="Conceal">¦</span><span class="Constant"> .#? ab     .</span>
<span id="L4336" class="LineNr">4336 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L4337" class="LineNr">4337 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4338" class="LineNr">4338 </span>  ]
<span id="L4339" class="LineNr">4339 </span>  memory-should-contain [
<span id="L4340" class="LineNr">4340 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L4341" class="LineNr">4341 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L4342" class="LineNr">4342 </span>  ]
<span id="L4343" class="LineNr">4343 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L4344" class="LineNr">4344 </span>]
<span id="L4345" class="LineNr">4345 </span>
<span id="L4346" class="LineNr">4346 </span><span class="muScenario">scenario</span> editor-comments-at-end-of-contents [
<span id="L4347" class="LineNr">4347 </span>  <span class="Constant">local-scope</span>
<span id="L4348" class="LineNr">4348 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L4349" class="LineNr">4349 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[ab]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span>
<span id="L4350" class="LineNr">4350 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L4351" class="LineNr">4351 </span>  $clear-trace
<span id="L4352" class="LineNr">4352 </span>  assume-console [
<span id="L4353" class="LineNr">4353 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>
<span id="L4354" class="LineNr">4354 </span>  <span class="Conceal">¦</span> press ctrl-slash
<span id="L4355" class="LineNr">4355 </span>  ]
<span id="L4356" class="LineNr">4356 </span>  run [
<span id="L4357" class="LineNr">4357 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4358" class="LineNr">4358 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L4359" class="LineNr">4359 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L4360" class="LineNr">4360 </span>  ]
<span id="L4361" class="LineNr">4361 </span>  screen-should-contain [
<span id="L4362" class="LineNr">4362 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4363" class="LineNr">4363 </span>  <span class="Conceal">¦</span><span class="Constant"> .#? ab     .</span>
<span id="L4364" class="LineNr">4364 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L4365" class="LineNr">4365 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4366" class="LineNr">4366 </span>  ]
<span id="L4367" class="LineNr">4367 </span>  memory-should-contain [
<span id="L4368" class="LineNr">4368 </span>  <span class="Conceal">¦</span><span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L4369" class="LineNr">4369 </span>  <span class="Conceal">¦</span><span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 5</span>
<span id="L4370" class="LineNr">4370 </span>  ]
<span id="L4371" class="LineNr">4371 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L4372" class="LineNr">4372 </span>  <span class="Comment"># toggle to uncomment</span>
<span id="L4373" class="LineNr">4373 </span>  $clear-trace
<span id="L4374" class="LineNr">4374 </span>  assume-console [
<span id="L4375" class="LineNr">4375 </span>  <span class="Conceal">¦</span> press ctrl-slash
<span id="L4376" class="LineNr">4376 </span>  ]
<span id="L4377" class="LineNr">4377 </span>  run [
<span id="L4378" class="LineNr">4378 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4379" class="LineNr">4379 </span>  <span class="Conceal">¦</span> 4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L4380" class="LineNr">4380 </span>  <span class="Conceal">¦</span> 5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L4381" class="LineNr">4381 </span>  ]
<span id="L4382" class="LineNr">4382 </span>  screen-should-contain [
<span id="L4383" class="LineNr">4383 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4384" class="LineNr">4384 </span>  <span class="Conceal">¦</span><span class="Constant"> .ab        .</span>
<span id="L4385" class="LineNr">4385 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L4386" class="LineNr">4386 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4387" class="LineNr">4387 </span>  ]
<span id="L4388" class="LineNr">4388 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L4389" class="LineNr">4389 </span>]
<span id="L4390" class="LineNr">4390 </span>
<span id="L4391" class="LineNr">4391 </span><span class="muScenario">scenario</span> editor-comments-almost-wrapping-line [
<span id="L4392" class="LineNr">4392 </span>  <span class="Constant">local-scope</span>
<span id="L4393" class="LineNr">4393 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L4394" class="LineNr">4394 </span>  <span class="Comment"># editor starts out with a non-wrapping line</span>
<span id="L4395" class="LineNr">4395 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[abcd]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L4396" class="LineNr">4396 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L4397" class="LineNr">4397 </span>  screen-should-contain [
<span id="L4398" class="LineNr">4398 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4399" class="LineNr">4399 </span>  <span class="Conceal">¦</span><span class="Constant"> .abcd      .</span>
<span id="L4400" class="LineNr">4400 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4401" class="LineNr">4401 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4402" class="LineNr">4402 </span>  ]
<span id="L4403" class="LineNr">4403 </span>  $clear-trace
<span id="L4404" class="LineNr">4404 </span>  <span class="Comment"># on commenting the line is now wrapped</span>
<span id="L4405" class="LineNr">4405 </span>  assume-console [
<span id="L4406" class="LineNr">4406 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>
<span id="L4407" class="LineNr">4407 </span>  <span class="Conceal">¦</span> press ctrl-slash
<span id="L4408" class="LineNr">4408 </span>  ]
<span id="L4409" class="LineNr">4409 </span>  run [
<span id="L4410" class="LineNr">4410 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4411" class="LineNr">4411 </span>  ]
<span id="L4412" class="LineNr">4412 </span>  screen-should-contain [
<span id="L4413" class="LineNr">4413 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4414" class="LineNr">4414 </span>  <span class="Conceal">¦</span><span class="Constant"> .#? a↩     .</span>
<span id="L4415" class="LineNr">4415 </span>  <span class="Conceal">¦</span><span class="Constant"> .bcd       .</span>
<span id="L4416" class="LineNr">4416 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4417" class="LineNr">4417 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4418" class="LineNr">4418 </span>  ]
<span id="L4419" class="LineNr">4419 </span>]
<span id="L4420" class="LineNr">4420 </span>
<span id="L4421" class="LineNr">4421 </span><span class="muScenario">scenario</span> editor-uncomments-just-wrapping-line [
<span id="L4422" class="LineNr">4422 </span>  <span class="Constant">local-scope</span>
<span id="L4423" class="LineNr">4423 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L4424" class="LineNr">4424 </span>  <span class="Comment"># editor starts out with a comment that wraps the line</span>
<span id="L4425" class="LineNr">4425 </span>  e:&amp;:editor <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L51'>new-editor</a> <span class="Constant">[#? ab]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span>
<span id="L4426" class="LineNr">4426 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L4427" class="LineNr">4427 </span>  screen-should-contain [
<span id="L4428" class="LineNr">4428 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4429" class="LineNr">4429 </span>  <span class="Conceal">¦</span><span class="Constant"> .#? a↩     .</span>
<span id="L4430" class="LineNr">4430 </span>  <span class="Conceal">¦</span><span class="Constant"> .b         .</span>
<span id="L4431" class="LineNr">4431 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4432" class="LineNr">4432 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4433" class="LineNr">4433 </span>  ]
<span id="L4434" class="LineNr">4434 </span>  $clear-trace
<span id="L4435" class="LineNr">4435 </span>  <span class="Comment"># on uncommenting the line is no longer wrapped</span>
<span id="L4436" class="LineNr">4436 </span>  assume-console [
<span id="L4437" class="LineNr">4437 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>
<span id="L4438" class="LineNr">4438 </span>  <span class="Conceal">¦</span> press ctrl-slash
<span id="L4439" class="LineNr">4439 </span>  ]
<span id="L4440" class="LineNr">4440 </span>  run [
<span id="L4441" class="LineNr">4441 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
<span id="L4442" class="LineNr">4442 </span>  ]
<span id="L4443" class="LineNr">4443 </span>  screen-should-contain [
<span id="L4444" class="LineNr">4444 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4445" class="LineNr">4445 </span>  <span class="Conceal">¦</span><span class="Constant"> .ab        .</span>
<span id="L4446" class="LineNr">4446 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4447" class="LineNr">4447 </span>  <span class="Conceal">¦</span><span class="Constant"> .          .</span>
<span id="L4448" class="LineNr">4448 </span>  ]
<span id="L4449" class="LineNr">4449 </span>]
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->