about summary refs log blame commit diff stats
path: root/html/edit/003-shortcuts.mu.html
blob: 9d7cd6d130777c63bb781b27f3515c6e8e0f8592 (plain) (tree)
1
2
3
4
5
6
7
8
9
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890




                                                                                          
                                         
                                                
                                   
                                                                                                               
                                           

                       


                                                                                                 
                                       
                                      
                             
                               
                            
                              
                                   
                             
                           
                            
                                                        
                              

        



                               






















                                                                                 

         
       
                             
                         








                                                                                                                                                

                                                                                                                           

                                                                                                                                                                                                                            

                                                            
                                                       

                                                 
                                                                                                                                                                                                     

                                                                   


                                                                                        







                                                                                                                                                                     

                                                                                                                                                                                                                                                               

                                                            
                                                       

                                                 
                                                                                                                                                                                                     

                                                                   


                                                                                          




                                                                                                                                                                      
                                                                                                                                                                                    
                                                                            




                                                                                                                                                   

                                                                                                                                                                                                                                               

                                                                                                        







                                                                                                                                        

                                                                                                                                                                                                                                                               

                                                            

                                                                                                                         

                                                 
                                                                                                                                                                                                     

                                                                                                                                                                                  

                                                                   



                                                                                                            

                                                                   

                                                                                                                                                



                                                                                                                                                                                                                             
                                                                                                                                                                                    
                                                                            

                                                                                                                                                                   


                                                                                                                                                                                                                                                                                                       
                                                                                    





                                                                                                                                                                          
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
                                                                                      
                                                                                      

                                                                                                                                                                                                                               
                                                                                                                                      

                                                                                                                                                                                                                                                                 

                                                                                                                                                                              

                                                                                                                                                                                    
                                                                                                                                                                                                                         
                                                                                                                                                   

                                                                                                                                                                      
                                                                                                                                                                                                                                        






                                                                                                                                                                 

                                                                                                                                                                                                                     

                                                                                                                  







                                                                                                                                                        
                                                                                                                                                                                        
                                                                                                                                              
                                                                                                                                            
                                                                                  


                                                                                                                                      
                                                                                                                                                                                      


                                                                                                                                     
                                                                                                                                                                                                                                                 
                                                                                      
                                                                                      
                                                                                                                                          
                                                                                                                                                                                                                               




                                                                                                                                                                 





                                                                                                                                                                                      



                                                                                                                                                                                                      


                                                                                                                                                                  

                                                                             


                                                                                                                                      

                                                                             





                                                                                                                                                                                        

                                                                                                                                                                                                            














                                                                                                                                                                          









                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                                                                                           
                                                                                      
                                                                                      




                                                                                                                               
                                                                                                                                            







                                                                                                                                                    







                                                                                                                                         
                                                                                                                                                                                                                              
                                                             

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    



                                                                                                             

                                                                    

                                                                                                                                                 








                                                                                                                                         

                                                                                                                                                                                                                              


                                                                                                                                            

                                                                                                                          

                                                  
                                                                                                                                                                                                      


                                                                                                                       




                                                                                                             






                                                                                                                                         

                                                                                                                                                                                                                                                                        

                                                                                                 



                                                                                                         



                                                                                                                                                                

                                                                                                                          

                                                  
                                                                                                                                                                                                      


                                                                                                                                                   




                                                                                                         







                                                                                                                                         

                                                                                                                                                                                                                                                                

                                                             
                                                           

                                                  
                                                                                                                                                                                                      

                                                                    



                                                                                                             



                                                                                                                                                                                                                              
                                                           

                                                  
                                                                                                                                                                                                      

                                                                    



                                                                                                             



                                                                                                                                                                                                                 
                                                                                                                                                                               
                                                                             

                                                                                                                                                                 


                                                                                                                                                                                                                                                                                                
                                                                                    


                                                                             
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
                                                                                      
                                                                                      


                                                                                                                                                                                                                               





                                                                                                                                                           
                                                                                                                                                                                                                                                                                

                                                                                                                                                                 
                                                                                                                                                                                                                
                                                                                                                  
                                                                                                                                                                                                                                        
                                                                             
                                                                                                                             
                                                                                                                                                                                  




                                                                                                                                                        
                                                                                                                                                                                        
                                                                                                                                              
                                                                                                                                            
                                                                                  


                                                                                                                                      
                                                                                                                                                                                      







                                                                                                                                         

                                                                                                                                                                                                                                                                

                                                             

                                                                                     

                                                  
                                                                                                                                                                                                      

                                                                    



                                                                                                             



                                                                                                                                                                                                                    
                                                                                                                                                                               
                                                                             


                                                                                                                                                                       
                                                                                                                                                                                                                              




                                                                                                                                                                        

                                                                                                                                                                                                                                     


                                                                                                                                                        


                                                                             
                                                                                                                                                                                                                                                                                                            
                                                                                      
                                                                                      
                                                                                                                                                                                                                              





                                                                                                                                                                 






                                                                                                                                                                           
                                                                                                                                                                                                                                    




                                                                                                                                                                                                              


                                                                                                                               




                                                                                                                                                 

                                                                                                                                                                                                                                                                   






                                                                                                                                                                        
                                                                                                                                                                                                                                    




                                                                                                                                                                                                              











                                                                                                                                                                      

                                                                                                                                                                                                                              


                                                                                                                                       



                                                                                                          

                                                  
                                                                                                                                                                                                      



                                                                                                                                                         
                                                                                     

                                                  
                                                                                                                                                                                                      

                                                                    




                                                                                                             








                                                                                                                                                                                                                   

                                                                                                                                                                                                                              
                                                             




                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                    




                                                                                                           





                                                                                                                                               

                                                                                                                                                                                                                                                                  

                                                             

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    




                                                                                                   

                                                                    

                                                                                                                                                 







                                                                                                                                                         

                                                                                                                                                                                                                                                                 


                                                                                                                                             

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    

                                                                                                                                                 


                                                                                                     
                                                                

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    

                                                                                                                                                 






                                                                                                                                                         

                                                                                                                                                                                                                                                                  

                                                             

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    




                                                                                                   

                                                                    

                                                                                                                                                 








                                                                                                                                                         

                                                                                                                                                                                                                              


                                                                                                                                    


                                                                                                                          

                                                  
                                                                                                                                                                                                      


                                                                                                                




                                                                                                             










                                                                                                                                                         

                                                                                                                                                                                                                                                                

                                                             


                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                    



                                                                                                             



                                                                                                                                                         
                                                                                                                                                                               
                                                                             



                                                                                                                                                                          

                                                                                                                                                                                                                                                                   
                                                                                                      

                                                                                                                                                                         



                                                                                                                                                                        








                                                                                                                                                           

                                                                                                                                                                                                                              


                                                                                                                                                    

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    

                                                                                                                                                 










                                                                                                                                                             

                                                                                                                                                                                                                                   



                                                                                                                                                      


                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                    




                                                                                                             









                                                                                                                                                                                                      

                                                                                                                                                                                                                              


                                                                                                                                                     


                                                                                                                          

                                                  
                                                                                                                                                                                                      


                                                                                                                




                                                                                                             










                                                                                                                                                                                                              

                                                                                                                                                                                                                              


                                                                                                                  


                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                    




                                                                                                             







                                                                                                                                                                                                      

                                                                                                                                                                                                                                                                  

                                                                    




                                                                                                   


                                                                                                                  

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    

                                                                                                                                                                                                               









                                                                                                                                                         

                                                                                                                                                                                                                             

                                                                    




                                                                                                   


                                                                                                                  

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    

                                                                                                                                                                                                     









                                                                                                                                                             

                                                                                                                                                                                                                             

                                                                    




                                                                                                   


                                                                                                                  

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    

                                                                                                                                                                                                     












                                                                                                                                                         

                                                                                                                                                                                                                              

                                                             

                                                                                                                          

                                                  
                                                                                                                                                                                                      

                                                                                                                                                                                   

                                                                    

                                                                                                                                                 


                                                                                                                                                         
                                                                                     

                                                  
                                                                                                                                                                                                      

                                                                    




                                                                                                             


                                              
                                                                                                                                                                               
                                                                             


                                                                                                                                                                   
                                                                                                                                                                   


                                                                                                                                                     


                                                                             
                                                                                                                                                                                                                                            
                                                                                       
                                                                                       


                                                                                                                                                                  
                                                                                                                                                                                                                                



                                                                                                                                                                     




                                                                                                                                                              

                                                                                                                                                                            


                                                                                                                            
                                                                                                                                                                            



                                                                                                                    
                                                                                                                                                                            













                                                                                                                                                                         
                                                                                                                                                                                                                          











                                                                                                                                                                           

                                                                              



                                                                                                                               


                                                                              




























































                                                                                                                                                                                                                                                                                                                                                         
                                               






























                                                                                                                                                                                                                               
                                               






































                                                                                                                                                                                                                               
                                               











































                                                                                                                                                                                                                               
                                               


                                                                                                                                                  
                                               



















































                                                                                                                                                                                                                                                                  
                                                                                                    


                                               












                                                                                                                                                                                                                              
                                               




















































































































































































































































































































































































































































                                                                                                                                                                                                                                                                                                  
                                               





































































































































































                                                                                                                                                                                                                                                                    
                                               





































































































































































































































































































                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
                                                                     
                                                                                          























































                                                                                                                                                                                                                               
                                               



















































                                                                                                                                                                                                                              
                                                                                          






















                                                                                                                                                                                                                              
                                                                     
                                                                                          






























































































































                                                                                                                                                                                                                              
                                                                     
                                                                                          




























































































































































































































































































































































                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

                                             





























































































                                                                                                                                                                                                                                                                                                                                                  
                                               























































                                                                                                                                                                                                                              
                                             












































































                                                                                                                                                                                                                               
                                               























































































































































                                                                                                                                                                                                                                











                                                                                                                                                  

                                                                                                                                                                                                                              
                                                                     



                                                                                            
                                               

                                                                                                                                           
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          
                                               

                                                                                                 
                                                              

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                              



                                                                                          











                                                                                                                                                      

                                                                                                                                                                                                                              

                                                                                                                  
                                                                                                         

                                                   
                                                                                                                                                                                                       
                                               
                                                                     




                                                                                                    
                                               

                                                                                             
                                                              

                                                   
                                                                                                                                                                                                       


                                                                                                              




                                                                                          
                                               

                                                                                                  
                                                              

                                                   
                                                                                                                                                                                                       


                                                                                                              




                                                                                            
                                               

                                                                                                 
                                                              

                                                   
                                                                                                                                                                                                       


                                                                                                              




                                                                                            














                                                                                                                                                  

                                                                                                                                                                                                                              
                                                                     



                                                                                            
                                               

                                                                                                                                           
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          
                                               

                                                                                                 
                                                              

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                              



                                                                                          













                                                                                                                                             

                                                                                                                                                                                                                              
                                                              
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          

                                                              
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                                      

                                                              
                                                                                                       

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          












                                                                                                                                         

                                                                                                                                                                                                                              

                                                                                                                  
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                     


                                                                                                 
                                                                

                                                   
                                                                                                                                                                                                       

                                                                                                                                                                                    
                                               

                                                                                           



                                                                                     

                                                                     

                                                                                                                                                  











                                                                                                                                          

                                                                                                                                                                                                                               
                                                                     



                                                                                          
                                               


                                                                                                                                                   
                                                                                                         

                                                              

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                      



                                                                                          
                                               

                                                                                                 
                                                              

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                     



                                                                                          











                                                                                                                                          

                                                                                                                                                                                                                               
                                                                     



                                                                                          
                                               

                                                                                        
                                                                                                         

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                   



                                                                                                              


                                               
                                                                                                                                                                                      
                                                                              

                                                                                                                                                  
                                                                                                                                                                                                                            
                                                                                                       
                                                                                                          

                                                                                                                                                   
                                                                                                                                                                                                                                  

                                                                                                                                  


                                                                              
                                                                                                                                                                                
                                                                              

                                                                                                                                                         
                                                                                                                                                                                                                            
                                                                                                       
                                                                                                          

                                                                                                                                                   
                                                                                                                                                                                                                                  

                                                                                                                                  




                                                                                                                                              
                                                                                                                                                                                                               
                                                                                       
                                                                                       
                                                                                                                                 
                                                                                                                                                                                                                                      

                                                                                                                       

                                                                                                                                                                                                                                  


                                                                                                                                                                       

                                                                                                                                                                                                        
                                                                                                         
                                                                                                                                                               
                                                                                                                                                                         

                                                                                                                                
                                                                                                                    




                                                                                                                                                                       
                                                                                                                                                                                                                           
                                                                                       
                                                                                       




                                                                                                                                                                       

                                                                                                                                                                                                                                

                                                                                                             

                                                                                                                                   

                                                                                                                                                                                                          
                                                                                                         
                                                                                                                                                               


                                                                                                                                                                         







                                                                                                                                          

                                                                                                                                                                                                                               
                                                                     



                                                                                                              
                                               

                                                                                        
                                                                                                         

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                      



                                                                                                              











                                                                                                                                          

                                                                                                                                                                                                                              

                                                                                                                    



                                                                                            
                                               

                                                                                        
                                                                                                         

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                             



                                                                                                  










                                                                                                                                                    

                                                                                                                                                                                                                              

                                                                                                                    



                                                                                            
                                               

                                                                                        
                                                                                                         

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                             



                                                                                            











                                                                                                                                          

                                                                                                                                                                                                                               
                                                                     



                                                                                          
                                               

                                                                                        
                                                                                                         

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                   



                                                                                                              
                                               

                                                                                           
                                                                                                       

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                             



                                                                                          


                                               
                                                                                                                                                                                      
                                                                              

                                                                                                                                                
                                                                                                                                                                                                                            
                                                                                                       
                                                                                                                                                                                                        

                                                                                                                                                   
                                                                                                                                                                                                                                  

                                                                                                                                  


                                                                              
                                                                                                                                                                                
                                                                              

                                                                                                                                                     
                                                                                                                                                                                                                            
                                                                                                       
                                                                                                                                                                                                        

                                                                                                                                                   
                                                                                                                                                                                                                                  


                                                                                                                                            


                                                                              
                                                                                                                                                                                                                                                                       
                                                                                       
                                                                                       
                                                                                                                                                                                                                                                  
                                                                                                                               
                                                                                                                                                                                                                                
                                                                              

                                                                                                                         
                                                                                                                                                                                                                                                                                                 

                                                                                                                                                      


                                                                                                                                                                         















                                                                                                                                          

                                                                                                                                                                                                                               
                                                                     



                                                                                          


                                                                                                  

                                                                                                         

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                    



                                                                                          
                                               

                                                                                      
                                                                                                       

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                     



                                                                                          
                                               

                                                                                            
                                                                                                       

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                             



                                                                                          


















                                                                                                                                          

                                                                                                                                                                                                                              

                                                                                                                    





                                                                                            


                                                                                                          
                                                                                                         

                                                                                                                           

                                                   
                                                                                                                                                                                                       


                                                                                                             





                                                                                          
                                               

                                                                                                   
                                                                                                       

                                                   
                                                                                                                                                                                                       


                                                                                          





                                                                                            










                                                                                                                                                    

                                                                                                                                                                                                                              

                                                                                                                    



                                                                                            
                                               

                                                                                        
                                                                                                         

                                                   
                                                                                                                                                                                                       
                                               

                                                                                                             



                                                                                            
                                               

                                                                                           
                                                                                                       

                                                   
                                                                                                                                                                                                       
                                               

                                                                                          



                                                                                            















                                                                                                                                          

                                                                                                                                                                                                                              
                                                                     



                                                                                          

                                                              
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          

                                                              
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          
                                               

                                                                                                           
                                                                                                       

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          















                                                                                                                                          

                                                                                                                                                                                                                              
                                                                     



                                                                                          

                                                              
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          

                                                              
                                                                                                         

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          
                                               

                                                                                                           
                                                                                                       

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                          





                                                                                                         
                                                                                                                                                                                      
                                                                              


                                                                                                                                                   
                                                                                                                                                                                                                         


                                                                                                                                                     


                                                                              
                                                                                                                                                                                                                                                                                        
                                                                                       
                                                                                       


                                                                                                                                                  
                                                                                                                                                                                                                          
                                                                                                                                                                                                                                           

                                                                                                                          

                                                                                                                                                                   
                                                                              
                                                                                             




                                                                                                           
                                                                                                                                                                                      
                                                                              


                                                                                                                                                     
                                                                                                                                                                                                                           


                                                                                                                                                       


                                                                              
                                                                                                                                                                                                                                                                                          
                                                                                       
                                                                                       
                                                                                                                                                                                                                          
                                                                                                                                                                                                                                                

                                                                                                                          

                                                                                                                                                                   
                                                                              
                                                                                             




                                                                                                                      
                                                                                                                                                                                      
                                                                              


                                                                                                                                                     


                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                 





                                                                                                                                                                                        




                                                                                                                  
                                                                                                                                                                                      
                                                                              


                                                                                                                                                                    
                                                                                                                                                                                                                
                                                                                                            


                                                                                                                                                                                                                                                        





                                                                                                                                                                                
                                                                                                                                                                                                                                                                             






                                                                                                                                                                           
                                                                                                                                                                                                                                                      


                                                                                                          





                                                                                                                                                       
                                                                                                                                                                                                                                                                                                                                                                                                                                            
                                                                                       
                                                                                       

                                                                                                                                                                                                                                                 


                                                                                                                                                            
                                                                                                                                                                                                        


                                                                                                                                                  
                                                                                                                                                                       
                                                                              





                                                                                                                                                  
                                                                                                                                                 

                                                                                                                                             

                                                                                                                           
                                                                              
                                                                                                                                                         
                                                                                                                               

                                             
                                                                                                                                                                                                                                                                                      
                                                                                       
                                                                                       
                                                                                                                                                                                                                         
                                                                              


                                                                                                                                                                                                                                                             
                                                                              
                                                                                                                                                                            




                                                                                                                                          

                                                                                                                                                                                                                                                             

                                                              
                                                                

                                                   
                                                                                                                                                                                                       

                                                                                                                                                                                    

                                                                     



                                                                                                    

                                                                     

                                                                                                                                                  






                                                                                                                                                          

                                                                                                                                                                                                                                                                

                                                              
                                                                

                                                   
                                                                                                                                                                                                       

                                                                                                                                                                                    

                                                                     



                                                                                                              

                                                                     

                                                                                                                                                  






                                                                                                                                                           

                                                                                                                                                                                                                                                                

                                                              

                                                                                                                           

                                                   
                                                                                                                                                                                                       

                                                                                                                                                                                    

                                                                     



                                                                                                              

                                                                     

                                                                                                                                                  




                                                                                                                                                           
                                                                

                                                   
                                                                                                                                                                                                       

                                                                                                                                                                                    

                                                                     



                                                                                                              







                                                                                                                                                           

                                                                                                                                                                                                                                                                 
                                                                     



                                                                                                    



                                                                                                                  

                                                                                                                           

                                                   
                                                                                                                                                                                                       
                                               
                                                                     




                                                                                                    






                                                                                                                                          

                                                                                                                                                                                                                                                                  
                                                                     




                                                                                                    



                                                                                                                          

                                                                                                                           

                                                   
                                                                                                                                                                                                       

                                                                     



                                                                                                    

                                               


       
                                     
<!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; }
.muRecipe { color: #ff8700; }
.muScenario { color: #00af00; }
.Special { color: #c00000; }
.Delimiter { color: #800080; }
.SalientComment { color: #00ffff; }
.Constant { color: #00a0a0; }
.LineNr { color: #444444; }
.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>    press tab
<span id="L17" class="LineNr">  17 </span>  ]
<span id="L18" class="LineNr">  18 </span>  run [
<span id="L19" class="LineNr">  19 </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="Constant"> .          .</span>
<span id="L23" class="LineNr">  23 </span>   <span class="Constant"> .  ab      .</span>
<span id="L24" class="LineNr">  24 </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>    press tab
<span id="L38" class="LineNr">  38 </span>  ]
<span id="L39" class="LineNr">  39 </span>  run [
<span id="L40" class="LineNr">  40 </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="Constant"> .          .</span>
<span id="L44" class="LineNr">  44 </span>   <span class="Constant"> .  ab↩     .</span>
<span id="L45" class="LineNr">  45 </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>    tab?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">9/tab</span>
<span id="L54" class="LineNr">  54 </span>    <span class="muControl">break-unless</span> tab?
<span id="L55" class="LineNr">  55 </span><span class="Constant">    &lt;begin-insert-character&gt;</span>
<span id="L56" class="LineNr">  56 </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="Comment"># so that 'tab' doesn't render the current line multiple times</span>
<span id="L58" class="LineNr">  58 </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>    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">    &lt;end-insert-character&gt;</span>
<span id="L61" class="LineNr">  61 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L75" class="LineNr">  75 </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>    <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>    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>    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="Constant"> .          .</span>
<span id="L84" class="LineNr">  84 </span>   <span class="Constant"> .bc        .</span>
<span id="L85" class="LineNr">  85 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L86" class="LineNr">  86 </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="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L90" class="LineNr">  90 </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>    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="muControl">break-unless</span> delete-previous-character?
<span id="L99" class="LineNr">  99 </span><span class="Constant">    <a href='003-shortcuts.mu.html#L99'>&lt;begin-backspace-character&gt;</a></span>
<span id="L100" class="LineNr"> 100 </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">    <a href='003-shortcuts.mu.html#L101'>&lt;end-backspace-character&gt;</a></span>
<span id="L102" class="LineNr"> 102 </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-inputs</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#L32'>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#L32'>prev</a> before-cursor
<span id="L116" class="LineNr"> 116 </span>  <span class="muControl">return-unless</span> <a href='../065duplex_list.mu.html#L32'>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#L32'>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#L25'>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="Comment"># hit right margin? give up and let caller render</span>
<span id="L138" class="LineNr"> 138 </span>    at-right?:bool <span class="Special">&lt;-</span> greater-or-equal curr-column, right
<span id="L139" class="LineNr"> 139 </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="muControl">break-unless</span> curr
<span id="L141" class="LineNr"> 141 </span>    <span class="Comment"># newline? done.</span>
<span id="L142" class="LineNr"> 142 </span>    currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L143" class="LineNr"> 143 </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="muControl">break-if</span> at-newline?
<span id="L145" class="LineNr"> 145 </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>    curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
<span id="L147" class="LineNr"> 147 </span>    curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> curr
<span id="L148" class="LineNr"> 148 </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-inputs</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>    at-left-margin?:bool <span class="Special">&lt;-</span> equal cursor-column, left
<span id="L167" class="LineNr"> 167 </span>    <span class="muControl">break-if</span> at-left-margin?
<span id="L168" class="LineNr"> 168 </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>    cursor-column <span class="Special">&lt;-</span> subtract cursor-column,<span class="Constant"> 1</span>
<span id="L170" class="LineNr"> 170 </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="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="muControl">break-if</span> top-of-screen?
<span id="L177" class="LineNr"> 177 </span>    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>
<span id="L178" class="LineNr"> 178 </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="muControl">break-unless</span> top-of-screen?
<span id="L182" class="LineNr"> 182 </span><span class="Constant">    &lt;scroll-up&gt;</span>
<span id="L183" class="LineNr"> 183 </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="Comment"># case 1: if previous character was newline, figure out how long the previous line is</span>
<span id="L187" class="LineNr"> 187 </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>    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="muControl">break-unless</span> previous-character-is-newline?
<span id="L190" class="LineNr"> 190 </span>    <span class="Comment"># compute length of previous line</span>
<span id="L191" class="LineNr"> 191 </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>    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>    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>    right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L195" class="LineNr"> 195 </span>    width:num <span class="Special">&lt;-</span> subtract right, left
<span id="L196" class="LineNr"> 196 </span>    wrap?:bool <span class="Special">&lt;-</span> greater-than end-of-line, width
<span id="L197" class="LineNr"> 197 </span>    <span class="Delimiter">{</span>
<span id="L198" class="LineNr"> 198 </span>      <span class="muControl">break-unless</span> wrap?
<span id="L199" class="LineNr"> 199 </span>      _, column-offset:num <span class="Special">&lt;-</span> divide-with-remainder end-of-line, width
<span id="L200" class="LineNr"> 200 </span>      cursor-column <span class="Special">&lt;-</span> add left, column-offset
<span id="L201" class="LineNr"> 201 </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="Delimiter">}</span>
<span id="L203" class="LineNr"> 203 </span>    <span class="Delimiter">{</span>
<span id="L204" class="LineNr"> 204 </span>      <span class="muControl">break-if</span> wrap?
<span id="L205" class="LineNr"> 205 </span>      cursor-column <span class="Special">&lt;-</span> add left, end-of-line
<span id="L206" class="LineNr"> 206 </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="Delimiter">}</span>
<span id="L208" class="LineNr"> 208 </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-inputs</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>    curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L32'>prev</a> curr
<span id="L228" class="LineNr"> 228 </span>    <span class="muControl">break-unless</span> curr
<span id="L229" class="LineNr"> 229 </span>    at-start?:bool <span class="Special">&lt;-</span> equal curr, start
<span id="L230" class="LineNr"> 230 </span>    <span class="muControl">break-if</span> at-start?
<span id="L231" class="LineNr"> 231 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L232" class="LineNr"> 232 </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="muControl">break-if</span> at-newline?
<span id="L234" class="LineNr"> 234 </span>    result <span class="Special">&lt;-</span> add result,<span class="Constant"> 1</span>
<span id="L235" class="LineNr"> 235 </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>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L247" class="LineNr"> 247 </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>    <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>    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>    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="Constant"> .          .</span>
<span id="L256" class="LineNr"> 256 </span>   <span class="Constant"> .abcd      .</span>
<span id="L257" class="LineNr"> 257 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L258" class="LineNr"> 258 </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="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L262" class="LineNr"> 262 </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>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L278" class="LineNr"> 278 </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>    <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="Constant"> .          .</span>
<span id="L286" class="LineNr"> 286 </span>   <span class="Constant"> .abc defgh↩.</span>
<span id="L287" class="LineNr"> 287 </span>   <span class="Constant"> .i jkl     .</span>
<span id="L288" class="LineNr"> 288 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L289" class="LineNr"> 289 </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="Constant"> .          .</span>
<span id="L302" class="LineNr"> 302 </span>   <span class="Constant"> .abc def↩  .</span>
<span id="L303" class="LineNr"> 303 </span>   <span class="Constant"> . ghij     .</span>
<span id="L304" class="LineNr"> 304 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>
<span id="L310" class="LineNr"> 310 </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>    <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="Constant"> .          .</span>
<span id="L318" class="LineNr"> 318 </span>   <span class="Constant"> .abcdef ↩  .</span>
<span id="L319" class="LineNr"> 319 </span>   <span class="Constant"> .ghij      .</span>
<span id="L320" class="LineNr"> 320 </span>   <span class="Constant"> .╌╌╌╌╌╌╌╌  .</span>
<span id="L321" class="LineNr"> 321 </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>    press delete
<span id="L335" class="LineNr"> 335 </span>  ]
<span id="L336" class="LineNr"> 336 </span>  run [
<span id="L337" class="LineNr"> 337 </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="Constant"> .          .</span>
<span id="L341" class="LineNr"> 341 </span>   <span class="Constant"> .bc        .</span>
<span id="L342" class="LineNr"> 342 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L343" class="LineNr"> 343 </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>    press delete
<span id="L349" class="LineNr"> 349 </span>  ]
<span id="L350" class="LineNr"> 350 </span>  run [
<span id="L351" class="LineNr"> 351 </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="Constant"> .          .</span>
<span id="L355" class="LineNr"> 355 </span>   <span class="Constant"> .c         .</span>
<span id="L356" class="LineNr"> 356 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L357" class="LineNr"> 357 </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>    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="muControl">break-unless</span> delete-next-character?
<span id="L366" class="LineNr"> 366 </span><span class="Constant">    <a href='003-shortcuts.mu.html#L366'>&lt;begin-delete-character&gt;</a></span>
<span id="L367" class="LineNr"> 367 </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">    <a href='003-shortcuts.mu.html#L368'>&lt;end-delete-character&gt;</a></span>
<span id="L369" class="LineNr"> 369 </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-inputs</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#L25'>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#L25'>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="Comment"># hit right margin? give up and let caller render</span>
<span id="L393" class="LineNr"> 393 </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="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span>
<span id="L395" class="LineNr"> 395 </span>    <span class="muControl">break-unless</span> curr
<span id="L396" class="LineNr"> 396 </span>    currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L397" class="LineNr"> 397 </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="muControl">break-if</span> at-newline?
<span id="L399" class="LineNr"> 399 </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>    curr-column <span class="Special">&lt;-</span> add curr-column,<span class="Constant"> 1</span>
<span id="L401" class="LineNr"> 401 </span>    curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> curr
<span id="L402" class="LineNr"> 402 </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>    press right-arrow
<span id="L420" class="LineNr"> 420 </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>    <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="Constant"> .          .</span>
<span id="L427" class="LineNr"> 427 </span>   <span class="Constant"> .a0bc      .</span>
<span id="L428" class="LineNr"> 428 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L429" class="LineNr"> 429 </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>    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="muControl">break-unless</span> move-to-next-character?
<span id="L438" class="LineNr"> 438 </span>    <span class="Comment"># if not at end of text</span>
<span id="L439" class="LineNr"> 439 </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#L25'>next</a> before-cursor
<span id="L440" class="LineNr"> 440 </span>    <span class="muControl">break-unless</span> next-cursor
<span id="L441" class="LineNr"> 441 </span>    <span class="Comment"># scan to next character</span>
<span id="L442" class="LineNr"> 442 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L443" class="LineNr"> 443 </span>    before-cursor <span class="Special">&lt;-</span> copy next-cursor
<span id="L444" class="LineNr"> 444 </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>    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>    <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>    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">    &lt;end-move-cursor&gt;</span>
<span id="L449" class="LineNr"> 449 </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-inputs</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>    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>    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="muControl">break-unless</span> was-at-newline?
<span id="L466" class="LineNr"> 466 </span>    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
<span id="L467" class="LineNr"> 467 </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>    cursor-column <span class="Special">&lt;-</span> copy left
<span id="L469" class="LineNr"> 469 </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>    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="muControl">return-unless</span> below-screen?, <span class="Constant">0/don't-render</span>
<span id="L472" class="LineNr"> 472 </span><span class="Constant">    &lt;scroll-down&gt;</span>
<span id="L473" class="LineNr"> 473 </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>    *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="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="Comment"># if we're at the column just before the wrap indicator</span>
<span id="L480" class="LineNr"> 480 </span>    wrap-column:num <span class="Special">&lt;-</span> subtract right,<span class="Constant"> 1</span>
<span id="L481" class="LineNr"> 481 </span>    at-wrap?:bool <span class="Special">&lt;-</span> equal cursor-column, wrap-column
<span id="L482" class="LineNr"> 482 </span>    <span class="muControl">break-unless</span> at-wrap?
<span id="L483" class="LineNr"> 483 </span>    <span class="Comment"># and if next character isn't newline</span>
<span id="L484" class="LineNr"> 484 </span>    <a href='../065duplex_list.mu.html#L25'>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#L25'>next</a> before-cursor
<span id="L485" class="LineNr"> 485 </span>    <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L486" class="LineNr"> 486 </span>    next-character:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
<span id="L487" class="LineNr"> 487 </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="muControl">break-if</span> newline?
<span id="L489" class="LineNr"> 489 </span>    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
<span id="L490" class="LineNr"> 490 </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>    cursor-column <span class="Special">&lt;-</span> copy left
<span id="L492" class="LineNr"> 492 </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>    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="muControl">return-unless</span> below-screen?, <span class="Constant">0/no-more-render</span>
<span id="L495" class="LineNr"> 495 </span><span class="Constant">    &lt;scroll-down&gt;</span>
<span id="L496" class="LineNr"> 496 </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>    *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="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>    press right-arrow
<span id="L517" class="LineNr"> 517 </span>    press right-arrow
<span id="L518" class="LineNr"> 518 </span>    press right-arrow
<span id="L519" class="LineNr"> 519 </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>    <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>    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>    <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="Constant"> .          .</span>
<span id="L534" class="LineNr"> 534 </span>   <span class="Constant"> .abc       .</span>
<span id="L535" class="LineNr"> 535 </span>   <span class="Constant"> .0d        .</span>
<span id="L536" class="LineNr"> 536 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L537" class="LineNr"> 537 </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>    press right-arrow
<span id="L551" class="LineNr"> 551 </span>    press right-arrow
<span id="L552" class="LineNr"> 552 </span>    press right-arrow
<span id="L553" class="LineNr"> 553 </span>    press right-arrow  <span class="Comment"># next line</span>
<span id="L554" class="LineNr"> 554 </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>    <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="Constant"> .          .</span>
<span id="L561" class="LineNr"> 561 </span>   <span class="Constant"> . abc      .</span>
<span id="L562" class="LineNr"> 562 </span>   <span class="Constant"> . 0d       .</span>
<span id="L563" class="LineNr"> 563 </span>   <span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span>
<span id="L564" class="LineNr"> 564 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L576" class="LineNr"> 576 </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>    <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>    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>    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="Constant"> .          .</span>
<span id="L585" class="LineNr"> 585 </span>   <span class="Constant"> .abcd↩     .</span>
<span id="L586" class="LineNr"> 586 </span>   <span class="Constant"> .ef        .</span>
<span id="L587" class="LineNr"> 587 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L588" class="LineNr"> 588 </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="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L592" class="LineNr"> 592 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L607" class="LineNr"> 607 </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>    <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>    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>    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="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L616" class="LineNr"> 616 </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>    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>    <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>    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>    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="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L629" class="LineNr"> 629 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span>
<span id="L642" class="LineNr"> 642 </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>    <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>    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>    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="Constant"> .          .</span>
<span id="L651" class="LineNr"> 651 </span>   <span class="Constant"> . abcd↩    .</span>
<span id="L652" class="LineNr"> 652 </span>   <span class="Constant"> . ef       .</span>
<span id="L653" class="LineNr"> 653 </span>   <span class="Constant"> . ╌╌╌╌╌    .</span>
<span id="L654" class="LineNr"> 654 </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="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L658" class="LineNr"> 658 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L674" class="LineNr"> 674 </span>    press right-arrow
<span id="L675" class="LineNr"> 675 </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>    <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="Constant"> .          .</span>
<span id="L683" class="LineNr"> 683 </span>   <span class="Constant"> .abc       .</span>
<span id="L684" class="LineNr"> 684 </span>   <span class="Constant"> .0d        .</span>
<span id="L685" class="LineNr"> 685 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L686" class="LineNr"> 686 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
<span id="L703" class="LineNr"> 703 </span>    press left-arrow
<span id="L704" class="LineNr"> 704 </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>    <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="Constant"> .          .</span>
<span id="L711" class="LineNr"> 711 </span>   <span class="Constant"> .a0bc      .</span>
<span id="L712" class="LineNr"> 712 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L713" class="LineNr"> 713 </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>    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="muControl">break-unless</span> move-to-previous-character?
<span id="L722" class="LineNr"> 722 </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="Comment"># if not at start of text (before-cursor at § sentinel)</span>
<span id="L724" class="LineNr"> 724 </span>    <a href='../065duplex_list.mu.html#L32'>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#L32'>prev</a> before-cursor
<span id="L725" class="LineNr"> 725 </span>    <span class="muControl">return-unless</span> <a href='../065duplex_list.mu.html#L32'>prev</a>, <span class="Constant">0/don't-render</span>
<span id="L726" class="LineNr"> 726 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L727" class="LineNr"> 727 </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>    before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L32'>prev</a>
<span id="L729" class="LineNr"> 729 </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>    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">    &lt;end-move-cursor&gt;</span>
<span id="L732" class="LineNr"> 732 </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>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L748" class="LineNr"> 748 </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>    <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>    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>    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="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L757" class="LineNr"> 757 </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>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L776" class="LineNr"> 776 </span>    press left-arrow
<span id="L777" class="LineNr"> 777 </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>    <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="Constant"> .          .</span>
<span id="L784" class="LineNr"> 784 </span>   <span class="Constant"> .abc       .</span>
<span id="L785" class="LineNr"> 785 </span>   <span class="Constant"> .def0      .</span>
<span id="L786" class="LineNr"> 786 </span>   <span class="Constant"> .g         .</span>
<span id="L787" class="LineNr"> 787 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
<span id="L804" class="LineNr"> 804 </span>    press left-arrow
<span id="L805" class="LineNr"> 805 </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>    <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="Constant"> .          .</span>
<span id="L813" class="LineNr"> 813 </span>   <span class="Constant"> .0abc      .</span>
<span id="L814" class="LineNr"> 814 </span>   <span class="Constant"> .def       .</span>
<span id="L815" class="LineNr"> 815 </span>   <span class="Constant"> .g         .</span>
<span id="L816" class="LineNr"> 816 </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>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L834" class="LineNr"> 834 </span>    press left-arrow
<span id="L835" class="LineNr"> 835 </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>    <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="Constant"> .          .</span>
<span id="L842" class="LineNr"> 842 </span>   <span class="Constant"> .abc       .</span>
<span id="L843" class="LineNr"> 843 </span>   <span class="Constant"> .0         .</span>
<span id="L844" class="LineNr"> 844 </span>   <span class="Constant"> .d         .</span>
<span id="L845" class="LineNr"> 845 </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="Constant"> .          .</span>
<span id="L859" class="LineNr"> 859 </span>   <span class="Constant"> .abcd↩     .</span>
<span id="L860" class="LineNr"> 860 </span>   <span class="Constant"> .ef        .</span>
<span id="L861" class="LineNr"> 861 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L862" class="LineNr"> 862 </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>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L867" class="LineNr"> 867 </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>    <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>    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>    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="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="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="Constant"> .          .</span>
<span id="L892" class="LineNr"> 892 </span>   <span class="Constant"> .abcd↩     .</span>
<span id="L893" class="LineNr"> 893 </span>   <span class="Constant"> .ef        .</span>
<span id="L894" class="LineNr"> 894 </span>   <span class="Constant"> .g         .</span>
<span id="L895" class="LineNr"> 895 </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>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L900" class="LineNr"> 900 </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>    <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>    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>    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="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="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="Constant"> .          .</span>
<span id="L925" class="LineNr"> 925 </span>   <span class="Constant"> .abcd      .</span>
<span id="L926" class="LineNr"> 926 </span>   <span class="Constant"> .e         .</span>
<span id="L927" class="LineNr"> 927 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L928" class="LineNr"> 928 </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>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L933" class="LineNr"> 933 </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>    <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>    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>    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="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="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>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L961" class="LineNr"> 961 </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>    <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>    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>    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="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L970" class="LineNr"> 970 </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>    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>    <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="Constant"> .          .</span>
<span id="L981" class="LineNr"> 981 </span>   <span class="Constant"> .a0bc      .</span>
<span id="L982" class="LineNr"> 982 </span>   <span class="Constant"> .def       .</span>
<span id="L983" class="LineNr"> 983 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L984" class="LineNr"> 984 </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>    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="muControl">break-unless</span> move-to-previous-line?
<span id="L992" class="LineNr"> 992 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L993" class="LineNr"> 993 </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>    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">    &lt;end-move-cursor&gt;</span>
<span id="L996" class="LineNr"> 996 </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-inputs</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="Comment"># if cursor not at top, move it</span>
<span id="L1012" class="LineNr">1012 </span>    <span class="muControl">break-if</span> already-at-top?
<span id="L1013" class="LineNr">1013 </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="Comment"># then scan back another line</span>
<span id="L1015" class="LineNr">1015 </span>    <span class="Comment"># if either step fails, give up without modifying cursor or coordinates</span>
<span id="L1016" class="LineNr">1016 </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>    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="Delimiter">{</span>
<span id="L1019" class="LineNr">1019 </span>      at-left?:bool <span class="Special">&lt;-</span> equal cursor-column, left
<span id="L1020" class="LineNr">1020 </span>      <span class="muControl">break-if</span> at-left?
<span id="L1021" class="LineNr">1021 </span>      curr <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L1067'>before-previous-screen-line</a> curr, editor
<span id="L1022" class="LineNr">1022 </span>      no-motion?:bool <span class="Special">&lt;-</span> equal curr, old
<span id="L1023" class="LineNr">1023 </span>      <span class="muControl">return-if</span> no-motion?
<span id="L1024" class="LineNr">1024 </span>    <span class="Delimiter">}</span>
<span id="L1025" class="LineNr">1025 </span>    <span class="Delimiter">{</span>
<span id="L1026" class="LineNr">1026 </span>      curr <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L1067'>before-previous-screen-line</a> curr, editor
<span id="L1027" class="LineNr">1027 </span>      no-motion?:bool <span class="Special">&lt;-</span> equal curr, old
<span id="L1028" class="LineNr">1028 </span>      <span class="muControl">return-if</span> no-motion?
<span id="L1029" class="LineNr">1029 </span>    <span class="Delimiter">}</span>
<span id="L1030" class="LineNr">1030 </span>    before-cursor <span class="Special">&lt;-</span> copy curr
<span id="L1031" class="LineNr">1031 </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>    cursor-row <span class="Special">&lt;-</span> subtract cursor-row,<span class="Constant"> 1</span>
<span id="L1033" class="LineNr">1033 </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="Comment"># scan ahead to right column or until end of line</span>
<span id="L1035" class="LineNr">1035 </span>    target-column:num <span class="Special">&lt;-</span> copy cursor-column
<span id="L1036" class="LineNr">1036 </span>    cursor-column <span class="Special">&lt;-</span> copy left
<span id="L1037" class="LineNr">1037 </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="Delimiter">{</span>
<span id="L1039" class="LineNr">1039 </span>      done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, target-column
<span id="L1040" class="LineNr">1040 </span>      <span class="muControl">break-if</span> done?
<span id="L1041" class="LineNr">1041 </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#L25'>next</a> before-cursor
<span id="L1042" class="LineNr">1042 </span>      <span class="muControl">break-unless</span> curr
<span id="L1043" class="LineNr">1043 </span>      currc:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L1044" class="LineNr">1044 </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="muControl">break-if</span> at-newline?
<span id="L1046" class="LineNr">1046 </span>      <span class="Comment">#</span>
<span id="L1047" class="LineNr">1047 </span>      before-cursor <span class="Special">&lt;-</span> copy curr
<span id="L1048" class="LineNr">1048 </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>      cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L1050" class="LineNr">1050 </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="muControl"> loop</span>
<span id="L1052" class="LineNr">1052 </span>    <span class="Delimiter">}</span>
<span id="L1053" class="LineNr">1053 </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="Comment"># if cursor already at top, scroll up</span>
<span id="L1057" class="LineNr">1057 </span>    <span class="muControl">break-unless</span> already-at-top?
<span id="L1058" class="LineNr">1058 </span><span class="Constant">    &lt;scroll-up&gt;</span>
<span id="L1059" class="LineNr">1059 </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="Comment"># Takes a pointer into the doubly-linked list, scans back to before start of</span>
<span id="L1064" class="LineNr">1064 </span><span class="Comment"># previous *wrapped* line.</span>
<span id="L1065" class="LineNr">1065 </span><span class="Comment"># Returns original if no next newline.</span>
<span id="L1066" class="LineNr">1066 </span><span class="Comment"># Beware: never return null pointer.</span>
<span id="L1067" class="LineNr">1067 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1067'>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="L1068" class="LineNr">1068 </span>  <span class="Constant">local-scope</span>
<span id="L1069" class="LineNr">1069 </span>  <span class="Constant">load-inputs</span>
<span id="L1070" class="LineNr">1070 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy in
<span id="L1071" class="LineNr">1071 </span>  c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L1072" class="LineNr">1072 </span>  <span class="Comment"># compute max, number of characters to skip</span>
<span id="L1073" class="LineNr">1073 </span>  <span class="Comment">#   1 + len%(width-1)</span>
<span id="L1074" class="LineNr">1074 </span>  <span class="Comment">#   except rotate second term to vary from 1 to width-1 rather than 0 to width-2</span>
<span id="L1075" class="LineNr">1075 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L1076" class="LineNr">1076 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L1077" class="LineNr">1077 </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="L1078" class="LineNr">1078 </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="L1079" class="LineNr">1079 </span>  len:num <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L219'>previous-line-length</a> curr, sentinel
<span id="L1080" class="LineNr">1080 </span>  <span class="Delimiter">{</span>
<span id="L1081" class="LineNr">1081 </span>    <span class="muControl">break-if</span> len
<span id="L1082" class="LineNr">1082 </span>    <span class="Comment"># empty line; just skip this newline</span>
<span id="L1083" class="LineNr">1083 </span>    <a href='../065duplex_list.mu.html#L32'>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#L32'>prev</a> curr
<span id="L1084" class="LineNr">1084 </span>    <span class="muControl">return-unless</span> <a href='../065duplex_list.mu.html#L32'>prev</a>, curr
<span id="L1085" class="LineNr">1085 </span>   <span class="muControl"> return</span> <a href='../065duplex_list.mu.html#L32'>prev</a>
<span id="L1086" class="LineNr">1086 </span>  <span class="Delimiter">}</span>
<span id="L1087" class="LineNr">1087 </span>  _, max:num <span class="Special">&lt;-</span> divide-with-remainder len, max-line-length
<span id="L1088" class="LineNr">1088 </span>  <span class="Comment"># remainder 0 =&gt; scan one width-worth</span>
<span id="L1089" class="LineNr">1089 </span>  <span class="Delimiter">{</span>
<span id="L1090" class="LineNr">1090 </span>    <span class="muControl">break-if</span> max
<span id="L1091" class="LineNr">1091 </span>    max <span class="Special">&lt;-</span> copy max-line-length
<span id="L1092" class="LineNr">1092 </span>  <span class="Delimiter">}</span>
<span id="L1093" class="LineNr">1093 </span>  max <span class="Special">&lt;-</span> add max,<span class="Constant"> 1</span>
<span id="L1094" class="LineNr">1094 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L1095" class="LineNr">1095 </span>  <span class="Comment"># skip 'max' characters</span>
<span id="L1096" class="LineNr">1096 </span>  <span class="Delimiter">{</span>
<span id="L1097" class="LineNr">1097 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
<span id="L1098" class="LineNr">1098 </span>    <span class="muControl">break-if</span> done?
<span id="L1099" class="LineNr">1099 </span>    <a href='../065duplex_list.mu.html#L32'>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#L32'>prev</a> curr
<span id="L1100" class="LineNr">1100 </span>    <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L32'>prev</a>
<span id="L1101" class="LineNr">1101 </span>    curr <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L32'>prev</a>
<span id="L1102" class="LineNr">1102 </span>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
<span id="L1103" class="LineNr">1103 </span>   <span class="muControl"> loop</span>
<span id="L1104" class="LineNr">1104 </span>  <span class="Delimiter">}</span>
<span id="L1105" class="LineNr">1105 </span> <span class="muControl"> return</span> curr
<span id="L1106" class="LineNr">1106 </span>]
<span id="L1107" class="LineNr">1107 </span>
<span id="L1108" class="LineNr">1108 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-previous-line [
<span id="L1109" class="LineNr">1109 </span>  <span class="Constant">local-scope</span>
<span id="L1110" class="LineNr">1110 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1111" class="LineNr">1111 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[ab</span>
<span id="L1112" class="LineNr">1112 </span><span class="Constant">def]</span>
<span id="L1113" class="LineNr">1113 </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="L1114" class="LineNr">1114 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1115" class="LineNr">1115 </span>  $clear-trace
<span id="L1116" class="LineNr">1116 </span>  assume-console [
<span id="L1117" class="LineNr">1117 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L1118" class="LineNr">1118 </span>    press up-arrow
<span id="L1119" class="LineNr">1119 </span>  ]
<span id="L1120" class="LineNr">1120 </span>  run [
<span id="L1121" class="LineNr">1121 </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="L1122" class="LineNr">1122 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1123" class="LineNr">1123 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1124" class="LineNr">1124 </span>  ]
<span id="L1125" class="LineNr">1125 </span>  memory-should-contain [
<span id="L1126" class="LineNr">1126 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1127" class="LineNr">1127 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1128" class="LineNr">1128 </span>  ]
<span id="L1129" class="LineNr">1129 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1130" class="LineNr">1130 </span>  assume-console [
<span id="L1131" class="LineNr">1131 </span>    type <span class="Constant">[0]</span>
<span id="L1132" class="LineNr">1132 </span>  ]
<span id="L1133" class="LineNr">1133 </span>  run [
<span id="L1134" class="LineNr">1134 </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="L1135" class="LineNr">1135 </span>  ]
<span id="L1136" class="LineNr">1136 </span>  screen-should-contain [
<span id="L1137" class="LineNr">1137 </span>   <span class="Constant"> .          .</span>
<span id="L1138" class="LineNr">1138 </span>   <span class="Constant"> .ab0       .</span>
<span id="L1139" class="LineNr">1139 </span>   <span class="Constant"> .def       .</span>
<span id="L1140" class="LineNr">1140 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1141" class="LineNr">1141 </span>   <span class="Constant"> .          .</span>
<span id="L1142" class="LineNr">1142 </span>  ]
<span id="L1143" class="LineNr">1143 </span>]
<span id="L1144" class="LineNr">1144 </span>
<span id="L1145" class="LineNr">1145 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-empty-line [
<span id="L1146" class="LineNr">1146 </span>  <span class="Constant">local-scope</span>
<span id="L1147" class="LineNr">1147 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1148" class="LineNr">1148 </span>  s:text <span class="Special">&lt;-</span> new [
<span id="L1149" class="LineNr">1149 </span><span class="muRecipe">def</span>]
<span id="L1150" class="LineNr">1150 </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="L1151" class="LineNr">1151 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1152" class="LineNr">1152 </span>  $clear-trace
<span id="L1153" class="LineNr">1153 </span>  assume-console [
<span id="L1154" class="LineNr">1154 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L1155" class="LineNr">1155 </span>    press up-arrow
<span id="L1156" class="LineNr">1156 </span>  ]
<span id="L1157" class="LineNr">1157 </span>  run [
<span id="L1158" class="LineNr">1158 </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="L1159" class="LineNr">1159 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1160" class="LineNr">1160 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1161" class="LineNr">1161 </span>  ]
<span id="L1162" class="LineNr">1162 </span>  memory-should-contain [
<span id="L1163" class="LineNr">1163 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1164" class="LineNr">1164 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1165" class="LineNr">1165 </span>  ]
<span id="L1166" class="LineNr">1166 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1167" class="LineNr">1167 </span>  assume-console [
<span id="L1168" class="LineNr">1168 </span>    type <span class="Constant">[0]</span>
<span id="L1169" class="LineNr">1169 </span>  ]
<span id="L1170" class="LineNr">1170 </span>  run [
<span id="L1171" class="LineNr">1171 </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="L1172" class="LineNr">1172 </span>  ]
<span id="L1173" class="LineNr">1173 </span>  screen-should-contain [
<span id="L1174" class="LineNr">1174 </span>   <span class="Constant"> .          .</span>
<span id="L1175" class="LineNr">1175 </span>   <span class="Constant"> .0         .</span>
<span id="L1176" class="LineNr">1176 </span>   <span class="Constant"> .def       .</span>
<span id="L1177" class="LineNr">1177 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1178" class="LineNr">1178 </span>   <span class="Constant"> .          .</span>
<span id="L1179" class="LineNr">1179 </span>  ]
<span id="L1180" class="LineNr">1180 </span>]
<span id="L1181" class="LineNr">1181 </span>
<span id="L1182" class="LineNr">1182 </span><span class="muScenario">scenario</span> editor-moves-to-previous-line-from-zero-margin [
<span id="L1183" class="LineNr">1183 </span>  <span class="Constant">local-scope</span>
<span id="L1184" class="LineNr">1184 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1185" class="LineNr">1185 </span>  <span class="Comment"># start out with three lines</span>
<span id="L1186" class="LineNr">1186 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L1187" class="LineNr">1187 </span><span class="Constant">def</span>
<span id="L1188" class="LineNr">1188 </span><span class="Constant">ghi]</span>
<span id="L1189" class="LineNr">1189 </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="L1190" class="LineNr">1190 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1191" class="LineNr">1191 </span>  $clear-trace
<span id="L1192" class="LineNr">1192 </span>  <span class="Comment"># click on the third line and hit up-arrow, so you end up just after a newline</span>
<span id="L1193" class="LineNr">1193 </span>  assume-console [
<span id="L1194" class="LineNr">1194 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L1195" class="LineNr">1195 </span>    press up-arrow
<span id="L1196" class="LineNr">1196 </span>  ]
<span id="L1197" class="LineNr">1197 </span>  run [
<span id="L1198" class="LineNr">1198 </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="L1199" class="LineNr">1199 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1200" class="LineNr">1200 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1201" class="LineNr">1201 </span>  ]
<span id="L1202" class="LineNr">1202 </span>  memory-should-contain [
<span id="L1203" class="LineNr">1203 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1204" class="LineNr">1204 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1205" class="LineNr">1205 </span>  ]
<span id="L1206" class="LineNr">1206 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1207" class="LineNr">1207 </span>  assume-console [
<span id="L1208" class="LineNr">1208 </span>    type <span class="Constant">[0]</span>
<span id="L1209" class="LineNr">1209 </span>  ]
<span id="L1210" class="LineNr">1210 </span>  run [
<span id="L1211" class="LineNr">1211 </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="L1212" class="LineNr">1212 </span>  ]
<span id="L1213" class="LineNr">1213 </span>  screen-should-contain [
<span id="L1214" class="LineNr">1214 </span>   <span class="Constant"> .          .</span>
<span id="L1215" class="LineNr">1215 </span>   <span class="Constant"> .abc       .</span>
<span id="L1216" class="LineNr">1216 </span>   <span class="Constant"> .0def      .</span>
<span id="L1217" class="LineNr">1217 </span>   <span class="Constant"> .ghi       .</span>
<span id="L1218" class="LineNr">1218 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1219" class="LineNr">1219 </span>  ]
<span id="L1220" class="LineNr">1220 </span>]
<span id="L1221" class="LineNr">1221 </span>
<span id="L1222" class="LineNr">1222 </span><span class="muScenario">scenario</span> editor-moves-to-previous-line-from-left-margin [
<span id="L1223" class="LineNr">1223 </span>  <span class="Constant">local-scope</span>
<span id="L1224" class="LineNr">1224 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1225" class="LineNr">1225 </span>  <span class="Comment"># start out with three lines</span>
<span id="L1226" class="LineNr">1226 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L1227" class="LineNr">1227 </span><span class="Constant">def</span>
<span id="L1228" class="LineNr">1228 </span><span class="Constant">ghi]</span>
<span id="L1229" class="LineNr">1229 </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="L1230" class="LineNr">1230 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1231" class="LineNr">1231 </span>  $clear-trace
<span id="L1232" class="LineNr">1232 </span>  <span class="Comment"># click on the third line and hit up-arrow, so you end up just after a newline</span>
<span id="L1233" class="LineNr">1233 </span>  assume-console [
<span id="L1234" class="LineNr">1234 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span>
<span id="L1235" class="LineNr">1235 </span>    press up-arrow
<span id="L1236" class="LineNr">1236 </span>  ]
<span id="L1237" class="LineNr">1237 </span>  run [
<span id="L1238" class="LineNr">1238 </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="L1239" class="LineNr">1239 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1240" class="LineNr">1240 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1241" class="LineNr">1241 </span>  ]
<span id="L1242" class="LineNr">1242 </span>  memory-should-contain [
<span id="L1243" class="LineNr">1243 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1244" class="LineNr">1244 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1245" class="LineNr">1245 </span>  ]
<span id="L1246" class="LineNr">1246 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1247" class="LineNr">1247 </span>  assume-console [
<span id="L1248" class="LineNr">1248 </span>    type <span class="Constant">[0]</span>
<span id="L1249" class="LineNr">1249 </span>  ]
<span id="L1250" class="LineNr">1250 </span>  run [
<span id="L1251" class="LineNr">1251 </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="L1252" class="LineNr">1252 </span>  ]
<span id="L1253" class="LineNr">1253 </span>  screen-should-contain [
<span id="L1254" class="LineNr">1254 </span>   <span class="Constant"> .          .</span>
<span id="L1255" class="LineNr">1255 </span>   <span class="Constant"> . abc      .</span>
<span id="L1256" class="LineNr">1256 </span>   <span class="Constant"> . 0def     .</span>
<span id="L1257" class="LineNr">1257 </span>   <span class="Constant"> . ghi      .</span>
<span id="L1258" class="LineNr">1258 </span>   <span class="Constant"> . ╌╌╌╌╌╌╌╌╌.</span>
<span id="L1259" class="LineNr">1259 </span>  ]
<span id="L1260" class="LineNr">1260 </span>]
<span id="L1261" class="LineNr">1261 </span>
<span id="L1262" class="LineNr">1262 </span><span class="muScenario">scenario</span> editor-moves-to-top-line-in-presence-of-wrapped-line [
<span id="L1263" class="LineNr">1263 </span>  <span class="Constant">local-scope</span>
<span id="L1264" class="LineNr">1264 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1265" class="LineNr">1265 </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="L1266" class="LineNr">1266 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1267" class="LineNr">1267 </span>  screen-should-contain [
<span id="L1268" class="LineNr">1268 </span>   <span class="Constant"> .          .</span>
<span id="L1269" class="LineNr">1269 </span>   <span class="Constant"> .abcd↩     .</span>
<span id="L1270" class="LineNr">1270 </span>   <span class="Constant"> .e         .</span>
<span id="L1271" class="LineNr">1271 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1272" class="LineNr">1272 </span>  ]
<span id="L1273" class="LineNr">1273 </span>  $clear-trace
<span id="L1274" class="LineNr">1274 </span>  assume-console [
<span id="L1275" class="LineNr">1275 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L1276" class="LineNr">1276 </span>    press up-arrow
<span id="L1277" class="LineNr">1277 </span>  ]
<span id="L1278" class="LineNr">1278 </span>  run [
<span id="L1279" class="LineNr">1279 </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="L1280" class="LineNr">1280 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1281" class="LineNr">1281 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1282" class="LineNr">1282 </span>  ]
<span id="L1283" class="LineNr">1283 </span>  memory-should-contain [
<span id="L1284" class="LineNr">1284 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1285" class="LineNr">1285 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1286" class="LineNr">1286 </span>  ]
<span id="L1287" class="LineNr">1287 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1288" class="LineNr">1288 </span>  assume-console [
<span id="L1289" class="LineNr">1289 </span>    type <span class="Constant">[0]</span>
<span id="L1290" class="LineNr">1290 </span>  ]
<span id="L1291" class="LineNr">1291 </span>  run [
<span id="L1292" class="LineNr">1292 </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="L1293" class="LineNr">1293 </span>  ]
<span id="L1294" class="LineNr">1294 </span>  screen-should-contain [
<span id="L1295" class="LineNr">1295 </span>   <span class="Constant"> .          .</span>
<span id="L1296" class="LineNr">1296 </span>   <span class="Constant"> .0abc↩     .</span>
<span id="L1297" class="LineNr">1297 </span>   <span class="Constant"> .de        .</span>
<span id="L1298" class="LineNr">1298 </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="muScenario">scenario</span> editor-moves-to-top-line-in-presence-of-wrapped-line-2 [
<span id="L1303" class="LineNr">1303 </span>  <span class="Constant">local-scope</span>
<span id="L1304" class="LineNr">1304 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1305" class="LineNr">1305 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L1306" class="LineNr">1306 </span><span class="Constant">defgh]</span>
<span id="L1307" class="LineNr">1307 </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="L1308" class="LineNr">1308 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1309" class="LineNr">1309 </span>  screen-should-contain [
<span id="L1310" class="LineNr">1310 </span>   <span class="Constant"> .          .</span>
<span id="L1311" class="LineNr">1311 </span>   <span class="Constant"> .abc       .</span>
<span id="L1312" class="LineNr">1312 </span>   <span class="Constant"> .defg↩     .</span>
<span id="L1313" class="LineNr">1313 </span>   <span class="Constant"> .h         .</span>
<span id="L1314" class="LineNr">1314 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1315" class="LineNr">1315 </span>  ]
<span id="L1316" class="LineNr">1316 </span>  $clear-trace
<span id="L1317" class="LineNr">1317 </span>  assume-console [
<span id="L1318" class="LineNr">1318 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L1319" class="LineNr">1319 </span>    press up-arrow
<span id="L1320" class="LineNr">1320 </span>    press up-arrow
<span id="L1321" class="LineNr">1321 </span>  ]
<span id="L1322" class="LineNr">1322 </span>  run [
<span id="L1323" class="LineNr">1323 </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="L1324" class="LineNr">1324 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1325" class="LineNr">1325 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1326" class="LineNr">1326 </span>  ]
<span id="L1327" class="LineNr">1327 </span>  memory-should-contain [
<span id="L1328" class="LineNr">1328 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1329" class="LineNr">1329 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1330" class="LineNr">1330 </span>  ]
<span id="L1331" class="LineNr">1331 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1332" class="LineNr">1332 </span>  assume-console [
<span id="L1333" class="LineNr">1333 </span>    type <span class="Constant">[0]</span>
<span id="L1334" class="LineNr">1334 </span>  ]
<span id="L1335" class="LineNr">1335 </span>  run [
<span id="L1336" class="LineNr">1336 </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="L1337" class="LineNr">1337 </span>  ]
<span id="L1338" class="LineNr">1338 </span>  screen-should-contain [
<span id="L1339" class="LineNr">1339 </span>   <span class="Constant"> .          .</span>
<span id="L1340" class="LineNr">1340 </span>   <span class="Constant"> .0abc      .</span>
<span id="L1341" class="LineNr">1341 </span>   <span class="Constant"> .defg↩     .</span>
<span id="L1342" class="LineNr">1342 </span>   <span class="Constant"> .h         .</span>
<span id="L1343" class="LineNr">1343 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1344" class="LineNr">1344 </span>  ]
<span id="L1345" class="LineNr">1345 </span>]
<span id="L1346" class="LineNr">1346 </span>
<span id="L1347" class="LineNr">1347 </span><span class="Comment"># down arrow</span>
<span id="L1348" class="LineNr">1348 </span>
<span id="L1349" class="LineNr">1349 </span><span class="muScenario">scenario</span> editor-moves-to-next-line-with-down-arrow [
<span id="L1350" class="LineNr">1350 </span>  <span class="Constant">local-scope</span>
<span id="L1351" class="LineNr">1351 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1352" class="LineNr">1352 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L1353" class="LineNr">1353 </span><span class="Constant">def]</span>
<span id="L1354" class="LineNr">1354 </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="L1355" class="LineNr">1355 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1356" class="LineNr">1356 </span>  $clear-trace
<span id="L1357" class="LineNr">1357 </span>  <span class="Comment"># cursor starts out at (1, 0)</span>
<span id="L1358" class="LineNr">1358 </span>  assume-console [
<span id="L1359" class="LineNr">1359 </span>    press down-arrow
<span id="L1360" class="LineNr">1360 </span>  ]
<span id="L1361" class="LineNr">1361 </span>  run [
<span id="L1362" class="LineNr">1362 </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="L1363" class="LineNr">1363 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1364" class="LineNr">1364 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1365" class="LineNr">1365 </span>  ]
<span id="L1366" class="LineNr">1366 </span>  <span class="Comment"># ..and ends at (2, 0)</span>
<span id="L1367" class="LineNr">1367 </span>  memory-should-contain [
<span id="L1368" class="LineNr">1368 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1369" class="LineNr">1369 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1370" class="LineNr">1370 </span>  ]
<span id="L1371" class="LineNr">1371 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1372" class="LineNr">1372 </span>  assume-console [
<span id="L1373" class="LineNr">1373 </span>    type <span class="Constant">[0]</span>
<span id="L1374" class="LineNr">1374 </span>  ]
<span id="L1375" class="LineNr">1375 </span>  run [
<span id="L1376" class="LineNr">1376 </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="L1377" class="LineNr">1377 </span>  ]
<span id="L1378" class="LineNr">1378 </span>  screen-should-contain [
<span id="L1379" class="LineNr">1379 </span>   <span class="Constant"> .          .</span>
<span id="L1380" class="LineNr">1380 </span>   <span class="Constant"> .abc       .</span>
<span id="L1381" class="LineNr">1381 </span>   <span class="Constant"> .0def      .</span>
<span id="L1382" class="LineNr">1382 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1383" class="LineNr">1383 </span>   <span class="Constant"> .          .</span>
<span id="L1384" class="LineNr">1384 </span>  ]
<span id="L1385" class="LineNr">1385 </span>]
<span id="L1386" class="LineNr">1386 </span>
<span id="L1387" class="LineNr">1387 </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="L1388" class="LineNr">1388 </span>  <span class="Delimiter">{</span>
<span id="L1389" class="LineNr">1389 </span>    move-to-next-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65516/down-arrow</span>
<span id="L1390" class="LineNr">1390 </span>    <span class="muControl">break-unless</span> move-to-next-line?
<span id="L1391" class="LineNr">1391 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L1392" class="LineNr">1392 </span>    go-render? <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L1399'>move-to-next-line</a> editor, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L1393" class="LineNr">1393 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">4/down-arrow</span>
<span id="L1394" class="LineNr">1394 </span><span class="Constant">    &lt;end-move-cursor&gt;</span>
<span id="L1395" class="LineNr">1395 </span>   <span class="muControl"> return</span>
<span id="L1396" class="LineNr">1396 </span>  <span class="Delimiter">}</span>
<span id="L1397" class="LineNr">1397 </span>]
<span id="L1398" class="LineNr">1398 </span>
<span id="L1399" class="LineNr">1399 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1399'>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="L1400" class="LineNr">1400 </span>  <span class="Constant">local-scope</span>
<span id="L1401" class="LineNr">1401 </span>  <span class="Constant">load-inputs</span>
<span id="L1402" class="LineNr">1402 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L1403" class="LineNr">1403 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L1404" class="LineNr">1404 </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="L1405" class="LineNr">1405 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L1406" class="LineNr">1406 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L1407" class="LineNr">1407 </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="L1408" class="LineNr">1408 </span>  bottom:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">bottom:offset</span>
<span id="L1409" class="LineNr">1409 </span>  at-bottom-of-screen?:bool <span class="Special">&lt;-</span> greater-or-equal bottom, last-line
<span id="L1410" class="LineNr">1410 </span>  <span class="Delimiter">{</span>
<span id="L1411" class="LineNr">1411 </span>    <span class="muControl">break-if</span> before-cursor
<span id="L1412" class="LineNr">1412 </span>    <span class="Delimiter">{</span>
<span id="L1413" class="LineNr">1413 </span>      <span class="muControl">break-if</span> at-bottom-of-screen?
<span id="L1414" class="LineNr">1414 </span>     <span class="muControl"> return</span> <span class="Constant">0/don't-render</span>
<span id="L1415" class="LineNr">1415 </span>    <span class="Delimiter">}</span>
<span id="L1416" class="LineNr">1416 </span>    <span class="Delimiter">{</span>
<span id="L1417" class="LineNr">1417 </span>      <span class="muControl">break-unless</span> at-bottom-of-screen?
<span id="L1418" class="LineNr">1418 </span>     <span class="muControl"> jump</span> <span class="Constant">+try-to-scroll</span>
<span id="L1419" class="LineNr">1419 </span>    <span class="Delimiter">}</span>
<span id="L1420" class="LineNr">1420 </span>  <span class="Delimiter">}</span>
<span id="L1421" class="LineNr">1421 </span>  <a href='../065duplex_list.mu.html#L25'>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#L25'>next</a> before-cursor
<span id="L1422" class="LineNr">1422 </span>  <span class="Delimiter">{</span>
<span id="L1423" class="LineNr">1423 </span>    <span class="muControl">break-if</span> <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L1424" class="LineNr">1424 </span>    <span class="Delimiter">{</span>
<span id="L1425" class="LineNr">1425 </span>      <span class="muControl">break-if</span> at-bottom-of-screen?
<span id="L1426" class="LineNr">1426 </span>     <span class="muControl"> return</span> <span class="Constant">0/don't-render</span>
<span id="L1427" class="LineNr">1427 </span>    <span class="Delimiter">}</span>
<span id="L1428" class="LineNr">1428 </span>    <span class="Delimiter">{</span>
<span id="L1429" class="LineNr">1429 </span>      <span class="muControl">break-unless</span> at-bottom-of-screen?
<span id="L1430" class="LineNr">1430 </span>     <span class="muControl"> jump</span> <span class="Constant">+try-to-scroll</span>
<span id="L1431" class="LineNr">1431 </span>    <span class="Delimiter">}</span>
<span id="L1432" class="LineNr">1432 </span>  <span class="Delimiter">}</span>
<span id="L1433" class="LineNr">1433 </span>  already-at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-row, last-line
<span id="L1434" class="LineNr">1434 </span>  <span class="Delimiter">{</span>
<span id="L1435" class="LineNr">1435 </span>    <span class="Comment"># if cursor not at bottom, move it</span>
<span id="L1436" class="LineNr">1436 </span>    <span class="muControl">break-if</span> already-at-bottom?
<span id="L1437" class="LineNr">1437 </span>    target-column:num <span class="Special">&lt;-</span> copy cursor-column
<span id="L1438" class="LineNr">1438 </span>    <span class="Comment"># scan to start of next line</span>
<span id="L1439" class="LineNr">1439 </span>    <span class="Delimiter">{</span>
<span id="L1440" class="LineNr">1440 </span>      <a href='../065duplex_list.mu.html#L25'>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#L25'>next</a> before-cursor
<span id="L1441" class="LineNr">1441 </span>      <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L1442" class="LineNr">1442 </span>      done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, right
<span id="L1443" class="LineNr">1443 </span>      <span class="muControl">break-if</span> done?
<span id="L1444" class="LineNr">1444 </span>      cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L1445" class="LineNr">1445 </span>      before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L1446" class="LineNr">1446 </span>      c:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
<span id="L1447" class="LineNr">1447 </span>      at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L1448" class="LineNr">1448 </span>      <span class="muControl">break-if</span> at-newline?
<span id="L1449" class="LineNr">1449 </span>     <span class="muControl"> loop</span>
<span id="L1450" class="LineNr">1450 </span>    <span class="Delimiter">}</span>
<span id="L1451" class="LineNr">1451 </span>    <span class="Delimiter">{</span>
<span id="L1452" class="LineNr">1452 </span>      <span class="muControl">break-if</span> <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L1453" class="LineNr">1453 </span>      <span class="Delimiter">{</span>
<span id="L1454" class="LineNr">1454 </span>        <span class="muControl">break-if</span> at-bottom-of-screen?
<span id="L1455" class="LineNr">1455 </span>       <span class="muControl"> return</span> <span class="Constant">0/don't-render</span>
<span id="L1456" class="LineNr">1456 </span>      <span class="Delimiter">}</span>
<span id="L1457" class="LineNr">1457 </span>      <span class="Delimiter">{</span>
<span id="L1458" class="LineNr">1458 </span>        <span class="muControl">break-unless</span> at-bottom-of-screen?
<span id="L1459" class="LineNr">1459 </span>       <span class="muControl"> jump</span> <span class="Constant">+try-to-scroll</span>
<span id="L1460" class="LineNr">1460 </span>      <span class="Delimiter">}</span>
<span id="L1461" class="LineNr">1461 </span>    <span class="Delimiter">}</span>
<span id="L1462" class="LineNr">1462 </span>    cursor-row <span class="Special">&lt;-</span> add cursor-row,<span class="Constant"> 1</span>
<span id="L1463" class="LineNr">1463 </span>    cursor-column <span class="Special">&lt;-</span> copy left
<span id="L1464" class="LineNr">1464 </span>    <span class="Delimiter">{</span>
<span id="L1465" class="LineNr">1465 </span>      <a href='../065duplex_list.mu.html#L25'>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#L25'>next</a> before-cursor
<span id="L1466" class="LineNr">1466 </span>      <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L1467" class="LineNr">1467 </span>      c:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
<span id="L1468" class="LineNr">1468 </span>      at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L1469" class="LineNr">1469 </span>      <span class="muControl">break-if</span> at-newline?
<span id="L1470" class="LineNr">1470 </span>      done?:bool <span class="Special">&lt;-</span> greater-or-equal cursor-column, target-column
<span id="L1471" class="LineNr">1471 </span>      <span class="muControl">break-if</span> done?
<span id="L1472" class="LineNr">1472 </span>      cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L1473" class="LineNr">1473 </span>      before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L1474" class="LineNr">1474 </span>     <span class="muControl"> loop</span>
<span id="L1475" class="LineNr">1475 </span>    <span class="Delimiter">}</span>
<span id="L1476" class="LineNr">1476 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L1477" class="LineNr">1477 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L1478" class="LineNr">1478 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L1479" class="LineNr">1479 </span>   <span class="muControl"> return</span> <span class="Constant">0/don't-render</span>
<span id="L1480" class="LineNr">1480 </span>  <span class="Delimiter">}</span>
<span id="L1481" class="LineNr">1481 </span><span class="Constant">  +try-to-scroll</span>
<span id="L1482" class="LineNr">1482 </span><span class="Constant">  &lt;scroll-down&gt;</span>
<span id="L1483" class="LineNr">1483 </span>  go-render? <span class="Special">&lt;-</span> copy <span class="Constant">1/true</span>
<span id="L1484" class="LineNr">1484 </span>]
<span id="L1485" class="LineNr">1485 </span>
<span id="L1486" class="LineNr">1486 </span><span class="muScenario">scenario</span> editor-adjusts-column-at-next-line [
<span id="L1487" class="LineNr">1487 </span>  <span class="Constant">local-scope</span>
<span id="L1488" class="LineNr">1488 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1489" class="LineNr">1489 </span>  <span class="Comment"># second line is shorter than first</span>
<span id="L1490" class="LineNr">1490 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcde</span>
<span id="L1491" class="LineNr">1491 </span><span class="Constant">fg</span>
<span id="L1492" class="LineNr">1492 </span><span class="Constant">hi]</span>
<span id="L1493" class="LineNr">1493 </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="L1494" class="LineNr">1494 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1495" class="LineNr">1495 </span>  $clear-trace
<span id="L1496" class="LineNr">1496 </span>  <span class="Comment"># move to end of first line, then press down</span>
<span id="L1497" class="LineNr">1497 </span>  assume-console [
<span id="L1498" class="LineNr">1498 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 8</span>
<span id="L1499" class="LineNr">1499 </span>    press down-arrow
<span id="L1500" class="LineNr">1500 </span>  ]
<span id="L1501" class="LineNr">1501 </span>  run [
<span id="L1502" class="LineNr">1502 </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="L1503" class="LineNr">1503 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1504" class="LineNr">1504 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1505" class="LineNr">1505 </span>  ]
<span id="L1506" class="LineNr">1506 </span>  <span class="Comment"># cursor doesn't go vertically down, it goes to end of shorter line</span>
<span id="L1507" class="LineNr">1507 </span>  memory-should-contain [
<span id="L1508" class="LineNr">1508 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1509" class="LineNr">1509 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1510" class="LineNr">1510 </span>  ]
<span id="L1511" class="LineNr">1511 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1512" class="LineNr">1512 </span>  assume-console [
<span id="L1513" class="LineNr">1513 </span>    type <span class="Constant">[0]</span>
<span id="L1514" class="LineNr">1514 </span>  ]
<span id="L1515" class="LineNr">1515 </span>  run [
<span id="L1516" class="LineNr">1516 </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="L1517" class="LineNr">1517 </span>  ]
<span id="L1518" class="LineNr">1518 </span>  screen-should-contain [
<span id="L1519" class="LineNr">1519 </span>   <span class="Constant"> .          .</span>
<span id="L1520" class="LineNr">1520 </span>   <span class="Constant"> .abcde     .</span>
<span id="L1521" class="LineNr">1521 </span>   <span class="Constant"> .fg0       .</span>
<span id="L1522" class="LineNr">1522 </span>   <span class="Constant"> .hi        .</span>
<span id="L1523" class="LineNr">1523 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1524" class="LineNr">1524 </span>  ]
<span id="L1525" class="LineNr">1525 </span>]
<span id="L1526" class="LineNr">1526 </span>
<span id="L1527" class="LineNr">1527 </span><span class="muScenario">scenario</span> editor-moves-down-within-wrapped-line [
<span id="L1528" class="LineNr">1528 </span>  <span class="Constant">local-scope</span>
<span id="L1529" class="LineNr">1529 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1530" class="LineNr">1530 </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="L1531" class="LineNr">1531 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1532" class="LineNr">1532 </span>  screen-should-contain [
<span id="L1533" class="LineNr">1533 </span>   <span class="Constant"> .          .</span>
<span id="L1534" class="LineNr">1534 </span><span class="Constant">    .abcdefghi↩.</span>
<span id="L1535" class="LineNr">1535 </span>   <span class="Constant"> .jklmno    .</span>
<span id="L1536" class="LineNr">1536 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1537" class="LineNr">1537 </span>   <span class="Constant"> .          .</span>
<span id="L1538" class="LineNr">1538 </span>  ]
<span id="L1539" class="LineNr">1539 </span>  <span class="Comment"># position cursor on first screen line, but past end of second screen line</span>
<span id="L1540" class="LineNr">1540 </span>  assume-console [
<span id="L1541" class="LineNr">1541 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 8</span>
<span id="L1542" class="LineNr">1542 </span>    press down-arrow
<span id="L1543" class="LineNr">1543 </span>  ]
<span id="L1544" class="LineNr">1544 </span>  run [
<span id="L1545" class="LineNr">1545 </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="L1546" class="LineNr">1546 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1547" class="LineNr">1547 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1548" class="LineNr">1548 </span>  ]
<span id="L1549" class="LineNr">1549 </span>  <span class="Comment"># cursor should be at end of second screen line</span>
<span id="L1550" class="LineNr">1550 </span>  memory-should-contain [
<span id="L1551" class="LineNr">1551 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1552" class="LineNr">1552 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 6</span>
<span id="L1553" class="LineNr">1553 </span>  ]
<span id="L1554" class="LineNr">1554 </span>]
<span id="L1555" class="LineNr">1555 </span>
<span id="L1556" class="LineNr">1556 </span><span class="Comment"># ctrl-a/home - move cursor to start of line</span>
<span id="L1557" class="LineNr">1557 </span>
<span id="L1558" class="LineNr">1558 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-ctrl-a [
<span id="L1559" class="LineNr">1559 </span>  <span class="Constant">local-scope</span>
<span id="L1560" class="LineNr">1560 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1561" class="LineNr">1561 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1562" class="LineNr">1562 </span><span class="Constant">456]</span>
<span id="L1563" class="LineNr">1563 </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="L1564" class="LineNr">1564 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1565" class="LineNr">1565 </span>  $clear-trace
<span id="L1566" class="LineNr">1566 </span>  <span class="Comment"># start on second line, press ctrl-a</span>
<span id="L1567" class="LineNr">1567 </span>  assume-console [
<span id="L1568" class="LineNr">1568 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L1569" class="LineNr">1569 </span>    press ctrl-a
<span id="L1570" class="LineNr">1570 </span>  ]
<span id="L1571" class="LineNr">1571 </span>  run [
<span id="L1572" class="LineNr">1572 </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="L1573" class="LineNr">1573 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1574" class="LineNr">1574 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1575" class="LineNr">1575 </span>  ]
<span id="L1576" class="LineNr">1576 </span>  <span class="Comment"># cursor moves to start of line</span>
<span id="L1577" class="LineNr">1577 </span>  memory-should-contain [
<span id="L1578" class="LineNr">1578 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1579" class="LineNr">1579 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1580" class="LineNr">1580 </span>  ]
<span id="L1581" class="LineNr">1581 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1582" class="LineNr">1582 </span>]
<span id="L1583" class="LineNr">1583 </span>
<span id="L1584" class="LineNr">1584 </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="L1585" class="LineNr">1585 </span>  <span class="Delimiter">{</span>
<span id="L1586" class="LineNr">1586 </span>    move-to-start-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">1/ctrl-a</span>
<span id="L1587" class="LineNr">1587 </span>    <span class="muControl">break-unless</span> move-to-start-of-line?
<span id="L1588" class="LineNr">1588 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L1589" class="LineNr">1589 </span>    <a href='003-shortcuts.mu.html#L1610'>move-to-start-of-screen-line</a> editor
<span id="L1590" class="LineNr">1590 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L1591" class="LineNr">1591 </span><span class="Constant">    &lt;end-move-cursor&gt;</span>
<span id="L1592" class="LineNr">1592 </span>   <span class="muControl"> return</span> <span class="Constant">0/don't-render</span>
<span id="L1593" class="LineNr">1593 </span>  <span class="Delimiter">}</span>
<span id="L1594" class="LineNr">1594 </span>]
<span id="L1595" class="LineNr">1595 </span>
<span id="L1596" class="LineNr">1596 </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="L1597" class="LineNr">1597 </span>  <span class="Delimiter">{</span>
<span id="L1598" class="LineNr">1598 </span>    move-to-start-of-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65521/home</span>
<span id="L1599" class="LineNr">1599 </span>    <span class="muControl">break-unless</span> move-to-start-of-line?
<span id="L1600" class="LineNr">1600 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L1601" class="LineNr">1601 </span>    <a href='003-shortcuts.mu.html#L1610'>move-to-start-of-screen-line</a> editor
<span id="L1602" class="LineNr">1602 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L1603" class="LineNr">1603 </span><span class="Constant">    &lt;end-move-cursor&gt;</span>
<span id="L1604" class="LineNr">1604 </span>   <span class="muControl"> return</span> <span class="Constant">0/don't-render</span>
<span id="L1605" class="LineNr">1605 </span>  <span class="Delimiter">}</span>
<span id="L1606" class="LineNr">1606 </span>]
<span id="L1607" class="LineNr">1607 </span>
<span id="L1608" class="LineNr">1608 </span><span class="Comment"># handles wrapped lines</span>
<span id="L1609" class="LineNr">1609 </span><span class="Comment"># precondition: cursor-column should be in a consistent state</span>
<span id="L1610" class="LineNr">1610 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1610'>move-to-start-of-screen-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
<span id="L1611" class="LineNr">1611 </span>  <span class="Constant">local-scope</span>
<span id="L1612" class="LineNr">1612 </span>  <span class="Constant">load-inputs</span>
<span id="L1613" class="LineNr">1613 </span>  <span class="Comment"># update cursor column</span>
<span id="L1614" class="LineNr">1614 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L1615" class="LineNr">1615 </span>  col:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L1616" class="LineNr">1616 </span>  <span class="Comment"># update before-cursor</span>
<span id="L1617" class="LineNr">1617 </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="L1618" class="LineNr">1618 </span>  <span class="Comment"># while not at start of line, move</span>
<span id="L1619" class="LineNr">1619 </span>  <span class="Delimiter">{</span>
<span id="L1620" class="LineNr">1620 </span>    done?:bool <span class="Special">&lt;-</span> equal col, left
<span id="L1621" class="LineNr">1621 </span>    <span class="muControl">break-if</span> done?
<span id="L1622" class="LineNr">1622 </span>    assert curr, <span class="Constant">[move-to-start-of-line tried to move before start of text]</span>
<span id="L1623" class="LineNr">1623 </span>    curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L32'>prev</a> curr
<span id="L1624" class="LineNr">1624 </span>    col <span class="Special">&lt;-</span> subtract col,<span class="Constant"> 1</span>
<span id="L1625" class="LineNr">1625 </span>   <span class="muControl"> loop</span>
<span id="L1626" class="LineNr">1626 </span>  <span class="Delimiter">}</span>
<span id="L1627" class="LineNr">1627 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, col
<span id="L1628" class="LineNr">1628 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, curr
<span id="L1629" class="LineNr">1629 </span>]
<span id="L1630" class="LineNr">1630 </span>
<span id="L1631" class="LineNr">1631 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-ctrl-a-2 [
<span id="L1632" class="LineNr">1632 </span>  <span class="Constant">local-scope</span>
<span id="L1633" class="LineNr">1633 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1634" class="LineNr">1634 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1635" class="LineNr">1635 </span><span class="Constant">456]</span>
<span id="L1636" class="LineNr">1636 </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="L1637" class="LineNr">1637 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1638" class="LineNr">1638 </span>  $clear-trace
<span id="L1639" class="LineNr">1639 </span>  <span class="Comment"># start on first line (no newline before), press ctrl-a</span>
<span id="L1640" class="LineNr">1640 </span>  assume-console [
<span id="L1641" class="LineNr">1641 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L1642" class="LineNr">1642 </span>    press ctrl-a
<span id="L1643" class="LineNr">1643 </span>  ]
<span id="L1644" class="LineNr">1644 </span>  run [
<span id="L1645" class="LineNr">1645 </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="L1646" class="LineNr">1646 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1647" class="LineNr">1647 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1648" class="LineNr">1648 </span>  ]
<span id="L1649" class="LineNr">1649 </span>  <span class="Comment"># cursor moves to start of line</span>
<span id="L1650" class="LineNr">1650 </span>  memory-should-contain [
<span id="L1651" class="LineNr">1651 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1652" class="LineNr">1652 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1653" class="LineNr">1653 </span>  ]
<span id="L1654" class="LineNr">1654 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1655" class="LineNr">1655 </span>]
<span id="L1656" class="LineNr">1656 </span>
<span id="L1657" class="LineNr">1657 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-home [
<span id="L1658" class="LineNr">1658 </span>  <span class="Constant">local-scope</span>
<span id="L1659" class="LineNr">1659 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1660" class="LineNr">1660 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1661" class="LineNr">1661 </span><span class="Constant">456]</span>
<span id="L1662" class="LineNr">1662 </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="L1663" class="LineNr">1663 </span>  $clear-trace
<span id="L1664" class="LineNr">1664 </span>  <span class="Comment"># start on second line, press 'home'</span>
<span id="L1665" class="LineNr">1665 </span>  assume-console [
<span id="L1666" class="LineNr">1666 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L1667" class="LineNr">1667 </span>    press home
<span id="L1668" class="LineNr">1668 </span>  ]
<span id="L1669" class="LineNr">1669 </span>  run [
<span id="L1670" class="LineNr">1670 </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="L1671" class="LineNr">1671 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1672" class="LineNr">1672 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1673" class="LineNr">1673 </span>  ]
<span id="L1674" class="LineNr">1674 </span>  <span class="Comment"># cursor moves to start of line</span>
<span id="L1675" class="LineNr">1675 </span>  memory-should-contain [
<span id="L1676" class="LineNr">1676 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1677" class="LineNr">1677 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1678" class="LineNr">1678 </span>  ]
<span id="L1679" class="LineNr">1679 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1680" class="LineNr">1680 </span>]
<span id="L1681" class="LineNr">1681 </span>
<span id="L1682" class="LineNr">1682 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-line-with-home-2 [
<span id="L1683" class="LineNr">1683 </span>  <span class="Constant">local-scope</span>
<span id="L1684" class="LineNr">1684 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1685" class="LineNr">1685 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1686" class="LineNr">1686 </span><span class="Constant">456]</span>
<span id="L1687" class="LineNr">1687 </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="L1688" class="LineNr">1688 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1689" class="LineNr">1689 </span>  $clear-trace
<span id="L1690" class="LineNr">1690 </span>  <span class="Comment"># start on first line (no newline before), press 'home'</span>
<span id="L1691" class="LineNr">1691 </span>  assume-console [
<span id="L1692" class="LineNr">1692 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L1693" class="LineNr">1693 </span>    press home
<span id="L1694" class="LineNr">1694 </span>  ]
<span id="L1695" class="LineNr">1695 </span>  run [
<span id="L1696" class="LineNr">1696 </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="L1697" class="LineNr">1697 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1698" class="LineNr">1698 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1699" class="LineNr">1699 </span>  ]
<span id="L1700" class="LineNr">1700 </span>  <span class="Comment"># cursor moves to start of line</span>
<span id="L1701" class="LineNr">1701 </span>  memory-should-contain [
<span id="L1702" class="LineNr">1702 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1703" class="LineNr">1703 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L1704" class="LineNr">1704 </span>  ]
<span id="L1705" class="LineNr">1705 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1706" class="LineNr">1706 </span>]
<span id="L1707" class="LineNr">1707 </span>
<span id="L1708" class="LineNr">1708 </span><span class="muScenario">scenario</span> editor-moves-to-start-of-screen-line-with-ctrl-a [
<span id="L1709" class="LineNr">1709 </span>  <span class="Constant">local-scope</span>
<span id="L1710" class="LineNr">1710 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1711" class="LineNr">1711 </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="L1712" class="LineNr">1712 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1713" class="LineNr">1713 </span>  screen-should-contain [
<span id="L1714" class="LineNr">1714 </span>   <span class="Constant"> .          .</span>
<span id="L1715" class="LineNr">1715 </span>   <span class="Constant"> .1234↩     .</span>
<span id="L1716" class="LineNr">1716 </span>   <span class="Constant"> .56        .</span>
<span id="L1717" class="LineNr">1717 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1718" class="LineNr">1718 </span>   <span class="Constant"> .          .</span>
<span id="L1719" class="LineNr">1719 </span>  ]
<span id="L1720" class="LineNr">1720 </span>  $clear-trace
<span id="L1721" class="LineNr">1721 </span>  <span class="Comment"># start on second line, press ctrl-a then up</span>
<span id="L1722" class="LineNr">1722 </span>  assume-console [
<span id="L1723" class="LineNr">1723 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L1724" class="LineNr">1724 </span>    press ctrl-a
<span id="L1725" class="LineNr">1725 </span>    press up-arrow
<span id="L1726" class="LineNr">1726 </span>  ]
<span id="L1727" class="LineNr">1727 </span>  run [
<span id="L1728" class="LineNr">1728 </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="L1729" class="LineNr">1729 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1730" class="LineNr">1730 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1731" class="LineNr">1731 </span>  ]
<span id="L1732" class="LineNr">1732 </span>  <span class="Comment"># cursor moves to start of first line</span>
<span id="L1733" class="LineNr">1733 </span>  memory-should-contain [
<span id="L1734" class="LineNr">1734 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L1735" class="LineNr">1735 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L1736" class="LineNr">1736 </span>  ]
<span id="L1737" class="LineNr">1737 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1738" class="LineNr">1738 </span>  <span class="Comment"># make sure before-cursor is in sync</span>
<span id="L1739" class="LineNr">1739 </span>  assume-console [
<span id="L1740" class="LineNr">1740 </span>    type <span class="Constant">[a]</span>
<span id="L1741" class="LineNr">1741 </span>  ]
<span id="L1742" class="LineNr">1742 </span>  run [
<span id="L1743" class="LineNr">1743 </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="L1744" class="LineNr">1744 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1745" class="LineNr">1745 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1746" class="LineNr">1746 </span>  ]
<span id="L1747" class="LineNr">1747 </span>  screen-should-contain [
<span id="L1748" class="LineNr">1748 </span>   <span class="Constant"> .          .</span>
<span id="L1749" class="LineNr">1749 </span>   <span class="Constant"> .a123↩     .</span>
<span id="L1750" class="LineNr">1750 </span>   <span class="Constant"> .456       .</span>
<span id="L1751" class="LineNr">1751 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1752" class="LineNr">1752 </span>   <span class="Constant"> .          .</span>
<span id="L1753" class="LineNr">1753 </span>  ]
<span id="L1754" class="LineNr">1754 </span>  memory-should-contain [
<span id="L1755" class="LineNr">1755 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L1756" class="LineNr">1756 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-column</span>
<span id="L1757" class="LineNr">1757 </span>  ]
<span id="L1758" class="LineNr">1758 </span>]
<span id="L1759" class="LineNr">1759 </span>
<span id="L1760" class="LineNr">1760 </span><span class="Comment"># ctrl-e/end - move cursor to end of line</span>
<span id="L1761" class="LineNr">1761 </span>
<span id="L1762" class="LineNr">1762 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-ctrl-e [
<span id="L1763" class="LineNr">1763 </span>  <span class="Constant">local-scope</span>
<span id="L1764" class="LineNr">1764 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1765" class="LineNr">1765 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1766" class="LineNr">1766 </span><span class="Constant">456]</span>
<span id="L1767" class="LineNr">1767 </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="L1768" class="LineNr">1768 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1769" class="LineNr">1769 </span>  $clear-trace
<span id="L1770" class="LineNr">1770 </span>  <span class="Comment"># start on first line, press ctrl-e</span>
<span id="L1771" class="LineNr">1771 </span>  assume-console [
<span id="L1772" class="LineNr">1772 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L1773" class="LineNr">1773 </span>    press ctrl-e
<span id="L1774" class="LineNr">1774 </span>  ]
<span id="L1775" class="LineNr">1775 </span>  run [
<span id="L1776" class="LineNr">1776 </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="L1777" class="LineNr">1777 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1778" class="LineNr">1778 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1779" class="LineNr">1779 </span>  ]
<span id="L1780" class="LineNr">1780 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1781" class="LineNr">1781 </span>  memory-should-contain [
<span id="L1782" class="LineNr">1782 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1783" class="LineNr">1783 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1784" class="LineNr">1784 </span>  ]
<span id="L1785" class="LineNr">1785 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1786" class="LineNr">1786 </span>  <span class="Comment"># editor inserts future characters at cursor</span>
<span id="L1787" class="LineNr">1787 </span>  assume-console [
<span id="L1788" class="LineNr">1788 </span>    type <span class="Constant">[z]</span>
<span id="L1789" class="LineNr">1789 </span>  ]
<span id="L1790" class="LineNr">1790 </span>  run [
<span id="L1791" class="LineNr">1791 </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="L1792" class="LineNr">1792 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1793" class="LineNr">1793 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1794" class="LineNr">1794 </span>  ]
<span id="L1795" class="LineNr">1795 </span>  memory-should-contain [
<span id="L1796" class="LineNr">1796 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1797" class="LineNr">1797 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 4</span>
<span id="L1798" class="LineNr">1798 </span>  ]
<span id="L1799" class="LineNr">1799 </span>  screen-should-contain [
<span id="L1800" class="LineNr">1800 </span>   <span class="Constant"> .          .</span>
<span id="L1801" class="LineNr">1801 </span>   <span class="Constant"> .123z      .</span>
<span id="L1802" class="LineNr">1802 </span>   <span class="Constant"> .456       .</span>
<span id="L1803" class="LineNr">1803 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1804" class="LineNr">1804 </span>   <span class="Constant"> .          .</span>
<span id="L1805" class="LineNr">1805 </span>  ]
<span id="L1806" class="LineNr">1806 </span>  check-trace-count-for-label<span class="Constant"> 1</span>, <span class="Constant">[print-character]</span>
<span id="L1807" class="LineNr">1807 </span>]
<span id="L1808" class="LineNr">1808 </span>
<span id="L1809" class="LineNr">1809 </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="L1810" class="LineNr">1810 </span>  <span class="Delimiter">{</span>
<span id="L1811" class="LineNr">1811 </span>    move-to-end-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">5/ctrl-e</span>
<span id="L1812" class="LineNr">1812 </span>    <span class="muControl">break-unless</span> move-to-end-of-line?
<span id="L1813" class="LineNr">1813 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L1814" class="LineNr">1814 </span>    <a href='003-shortcuts.mu.html#L1833'>move-to-end-of-line</a> editor
<span id="L1815" class="LineNr">1815 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L1816" class="LineNr">1816 </span><span class="Constant">    &lt;end-move-cursor&gt;</span>
<span id="L1817" class="LineNr">1817 </span>   <span class="muControl"> return</span> <span class="Constant">0/don't-render</span>
<span id="L1818" class="LineNr">1818 </span>  <span class="Delimiter">}</span>
<span id="L1819" class="LineNr">1819 </span>]
<span id="L1820" class="LineNr">1820 </span>
<span id="L1821" class="LineNr">1821 </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="L1822" class="LineNr">1822 </span>  <span class="Delimiter">{</span>
<span id="L1823" class="LineNr">1823 </span>    move-to-end-of-line?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65520/end</span>
<span id="L1824" class="LineNr">1824 </span>    <span class="muControl">break-unless</span> move-to-end-of-line?
<span id="L1825" class="LineNr">1825 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L1826" class="LineNr">1826 </span>    <a href='003-shortcuts.mu.html#L1833'>move-to-end-of-line</a> editor
<span id="L1827" class="LineNr">1827 </span>    undo-coalesce-tag:num <span class="Special">&lt;-</span> copy <span class="Constant">0/never</span>
<span id="L1828" class="LineNr">1828 </span><span class="Constant">    &lt;end-move-cursor&gt;</span>
<span id="L1829" class="LineNr">1829 </span>   <span class="muControl"> return</span> <span class="Constant">0/don't-render</span>
<span id="L1830" class="LineNr">1830 </span>  <span class="Delimiter">}</span>
<span id="L1831" class="LineNr">1831 </span>]
<span id="L1832" class="LineNr">1832 </span>
<span id="L1833" class="LineNr">1833 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L1833'>move-to-end-of-line</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>editor:&amp;:editor [
<span id="L1834" class="LineNr">1834 </span>  <span class="Constant">local-scope</span>
<span id="L1835" class="LineNr">1835 </span>  <span class="Constant">load-inputs</span>
<span id="L1836" class="LineNr">1836 </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="L1837" class="LineNr">1837 </span>  cursor-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L1838" class="LineNr">1838 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L1839" class="LineNr">1839 </span>  <span class="Comment"># while not at end of line, move</span>
<span id="L1840" class="LineNr">1840 </span>  <span class="Delimiter">{</span>
<span id="L1841" class="LineNr">1841 </span>    <a href='../065duplex_list.mu.html#L25'>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#L25'>next</a> before-cursor
<span id="L1842" class="LineNr">1842 </span>    <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L25'>next</a>  <span class="Comment"># end of text</span>
<span id="L1843" class="LineNr">1843 </span>    nextc:char <span class="Special">&lt;-</span> get *next, <span class="Constant">value:offset</span>
<span id="L1844" class="LineNr">1844 </span>    at-end-of-line?:bool <span class="Special">&lt;-</span> equal nextc, <span class="Constant">10/newline</span>
<span id="L1845" class="LineNr">1845 </span>    <span class="muControl">break-if</span> at-end-of-line?
<span id="L1846" class="LineNr">1846 </span>    cursor-column <span class="Special">&lt;-</span> add cursor-column,<span class="Constant"> 1</span>
<span id="L1847" class="LineNr">1847 </span>    at-right?:bool <span class="Special">&lt;-</span> equal cursor-column, right
<span id="L1848" class="LineNr">1848 </span>    <span class="muControl">break-if</span> at-right?
<span id="L1849" class="LineNr">1849 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L1850" class="LineNr">1850 </span>    before-cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L1851" class="LineNr">1851 </span>    *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L1852" class="LineNr">1852 </span>   <span class="muControl"> loop</span>
<span id="L1853" class="LineNr">1853 </span>  <span class="Delimiter">}</span>
<span id="L1854" class="LineNr">1854 </span>]
<span id="L1855" class="LineNr">1855 </span>
<span id="L1856" class="LineNr">1856 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-ctrl-e-2 [
<span id="L1857" class="LineNr">1857 </span>  <span class="Constant">local-scope</span>
<span id="L1858" class="LineNr">1858 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1859" class="LineNr">1859 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1860" class="LineNr">1860 </span><span class="Constant">456]</span>
<span id="L1861" class="LineNr">1861 </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="L1862" class="LineNr">1862 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1863" class="LineNr">1863 </span>  $clear-trace
<span id="L1864" class="LineNr">1864 </span>  <span class="Comment"># start on second line (no newline after), press ctrl-e</span>
<span id="L1865" class="LineNr">1865 </span>  assume-console [
<span id="L1866" class="LineNr">1866 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L1867" class="LineNr">1867 </span>    press ctrl-e
<span id="L1868" class="LineNr">1868 </span>  ]
<span id="L1869" class="LineNr">1869 </span>  run [
<span id="L1870" class="LineNr">1870 </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="L1871" class="LineNr">1871 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1872" class="LineNr">1872 </span>    5:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1873" class="LineNr">1873 </span>  ]
<span id="L1874" class="LineNr">1874 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1875" class="LineNr">1875 </span>  memory-should-contain [
<span id="L1876" class="LineNr">1876 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1877" class="LineNr">1877 </span>   <span class="Constant"> 5</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1878" class="LineNr">1878 </span>  ]
<span id="L1879" class="LineNr">1879 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1880" class="LineNr">1880 </span>]
<span id="L1881" class="LineNr">1881 </span>
<span id="L1882" class="LineNr">1882 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-end [
<span id="L1883" class="LineNr">1883 </span>  <span class="Constant">local-scope</span>
<span id="L1884" class="LineNr">1884 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1885" class="LineNr">1885 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1886" class="LineNr">1886 </span><span class="Constant">456]</span>
<span id="L1887" class="LineNr">1887 </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="L1888" class="LineNr">1888 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1889" class="LineNr">1889 </span>  $clear-trace
<span id="L1890" class="LineNr">1890 </span>  <span class="Comment"># start on first line, press 'end'</span>
<span id="L1891" class="LineNr">1891 </span>  assume-console [
<span id="L1892" class="LineNr">1892 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L1893" class="LineNr">1893 </span>    press end
<span id="L1894" class="LineNr">1894 </span>  ]
<span id="L1895" class="LineNr">1895 </span>  run [
<span id="L1896" class="LineNr">1896 </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="L1897" class="LineNr">1897 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1898" class="LineNr">1898 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1899" class="LineNr">1899 </span>  ]
<span id="L1900" class="LineNr">1900 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1901" class="LineNr">1901 </span>  memory-should-contain [
<span id="L1902" class="LineNr">1902 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1903" class="LineNr">1903 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1904" class="LineNr">1904 </span>  ]
<span id="L1905" class="LineNr">1905 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1906" class="LineNr">1906 </span>]
<span id="L1907" class="LineNr">1907 </span>
<span id="L1908" class="LineNr">1908 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-line-with-end-2 [
<span id="L1909" class="LineNr">1909 </span>  <span class="Constant">local-scope</span>
<span id="L1910" class="LineNr">1910 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1911" class="LineNr">1911 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1912" class="LineNr">1912 </span><span class="Constant">456]</span>
<span id="L1913" class="LineNr">1913 </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="L1914" class="LineNr">1914 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1915" class="LineNr">1915 </span>  $clear-trace
<span id="L1916" class="LineNr">1916 </span>  <span class="Comment"># start on second line (no newline after), press 'end'</span>
<span id="L1917" class="LineNr">1917 </span>  assume-console [
<span id="L1918" class="LineNr">1918 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L1919" class="LineNr">1919 </span>    press end
<span id="L1920" class="LineNr">1920 </span>  ]
<span id="L1921" class="LineNr">1921 </span>  run [
<span id="L1922" class="LineNr">1922 </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="L1923" class="LineNr">1923 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1924" class="LineNr">1924 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1925" class="LineNr">1925 </span>  ]
<span id="L1926" class="LineNr">1926 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1927" class="LineNr">1927 </span>  memory-should-contain [
<span id="L1928" class="LineNr">1928 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L1929" class="LineNr">1929 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1930" class="LineNr">1930 </span>  ]
<span id="L1931" class="LineNr">1931 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1932" class="LineNr">1932 </span>]
<span id="L1933" class="LineNr">1933 </span>
<span id="L1934" class="LineNr">1934 </span><span class="muScenario">scenario</span> editor-moves-to-end-of-wrapped-line [
<span id="L1935" class="LineNr">1935 </span>  <span class="Constant">local-scope</span>
<span id="L1936" class="LineNr">1936 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1937" class="LineNr">1937 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123456</span>
<span id="L1938" class="LineNr">1938 </span><span class="Constant">789]</span>
<span id="L1939" class="LineNr">1939 </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="L1940" class="LineNr">1940 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1941" class="LineNr">1941 </span>  $clear-trace
<span id="L1942" class="LineNr">1942 </span>  <span class="Comment"># start on first line, press 'end'</span>
<span id="L1943" class="LineNr">1943 </span>  assume-console [
<span id="L1944" class="LineNr">1944 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L1945" class="LineNr">1945 </span>    press end
<span id="L1946" class="LineNr">1946 </span>  ]
<span id="L1947" class="LineNr">1947 </span>  run [
<span id="L1948" class="LineNr">1948 </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="L1949" class="LineNr">1949 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L1950" class="LineNr">1950 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L1951" class="LineNr">1951 </span>  ]
<span id="L1952" class="LineNr">1952 </span>  <span class="Comment"># cursor moves to end of line</span>
<span id="L1953" class="LineNr">1953 </span>  memory-should-contain [
<span id="L1954" class="LineNr">1954 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L1955" class="LineNr">1955 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L1956" class="LineNr">1956 </span>  ]
<span id="L1957" class="LineNr">1957 </span>  <span class="Comment"># no prints</span>
<span id="L1958" class="LineNr">1958 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L1959" class="LineNr">1959 </span>  <span class="Comment"># before-cursor is also consistent</span>
<span id="L1960" class="LineNr">1960 </span>  assume-console [
<span id="L1961" class="LineNr">1961 </span>    type <span class="Constant">[a]</span>
<span id="L1962" class="LineNr">1962 </span>  ]
<span id="L1963" class="LineNr">1963 </span>  run [
<span id="L1964" class="LineNr">1964 </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="L1965" class="LineNr">1965 </span>  ]
<span id="L1966" class="LineNr">1966 </span>  screen-should-contain [
<span id="L1967" class="LineNr">1967 </span>   <span class="Constant"> .          .</span>
<span id="L1968" class="LineNr">1968 </span>   <span class="Constant"> .123a↩     .</span>
<span id="L1969" class="LineNr">1969 </span>   <span class="Constant"> .456       .</span>
<span id="L1970" class="LineNr">1970 </span>   <span class="Constant"> .789       .</span>
<span id="L1971" class="LineNr">1971 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L1972" class="LineNr">1972 </span>  ]
<span id="L1973" class="LineNr">1973 </span>]
<span id="L1974" class="LineNr">1974 </span>
<span id="L1975" class="LineNr">1975 </span><span class="Comment"># ctrl-u - delete text from start of line until (but not at) cursor</span>
<span id="L1976" class="LineNr">1976 </span>
<span id="L1977" class="LineNr">1977 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u [
<span id="L1978" class="LineNr">1978 </span>  <span class="Constant">local-scope</span>
<span id="L1979" class="LineNr">1979 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L1980" class="LineNr">1980 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L1981" class="LineNr">1981 </span><span class="Constant">456]</span>
<span id="L1982" class="LineNr">1982 </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="L1983" class="LineNr">1983 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L1984" class="LineNr">1984 </span>  $clear-trace
<span id="L1985" class="LineNr">1985 </span>  <span class="Comment"># start on second line, press ctrl-u</span>
<span id="L1986" class="LineNr">1986 </span>  assume-console [
<span id="L1987" class="LineNr">1987 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
<span id="L1988" class="LineNr">1988 </span>    press ctrl-u
<span id="L1989" class="LineNr">1989 </span>  ]
<span id="L1990" class="LineNr">1990 </span>  run [
<span id="L1991" class="LineNr">1991 </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="L1992" class="LineNr">1992 </span>  ]
<span id="L1993" class="LineNr">1993 </span>  <span class="Comment"># cursor deletes to start of line</span>
<span id="L1994" class="LineNr">1994 </span>  screen-should-contain [
<span id="L1995" class="LineNr">1995 </span>   <span class="Constant"> .          .</span>
<span id="L1996" class="LineNr">1996 </span>   <span class="Constant"> .123       .</span>
<span id="L1997" class="LineNr">1997 </span>   <span class="Constant"> .6         .</span>
<span id="L1998" class="LineNr">1998 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L1999" class="LineNr">1999 </span>   <span class="Constant"> .          .</span>
<span id="L2000" class="LineNr">2000 </span>  ]
<span id="L2001" class="LineNr">2001 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L2002" class="LineNr">2002 </span>]
<span id="L2003" class="LineNr">2003 </span>
<span id="L2004" class="LineNr">2004 </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="L2005" class="LineNr">2005 </span>  <span class="Delimiter">{</span>
<span id="L2006" class="LineNr">2006 </span>    delete-to-start-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">21/ctrl-u</span>
<span id="L2007" class="LineNr">2007 </span>    <span class="muControl">break-unless</span> delete-to-start-of-line?
<span id="L2008" class="LineNr">2008 </span><span class="Constant">    <a href='003-shortcuts.mu.html#L2008'>&lt;begin-delete-to-start-of-line&gt;</a></span>
<span id="L2009" class="LineNr">2009 </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#L2051'>delete-to-start-of-line</a> editor
<span id="L2010" class="LineNr">2010 </span><span class="Constant">    <a href='003-shortcuts.mu.html#L2010'>&lt;end-delete-to-start-of-line&gt;</a></span>
<span id="L2011" class="LineNr">2011 </span>    go-render?:bool <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2016'>minimal-render-for-ctrl-u</a> <a href='../081print.mu.html#L16'>screen</a>, editor, deleted-cells
<span id="L2012" class="LineNr">2012 </span>   <span class="muControl"> return</span>
<span id="L2013" class="LineNr">2013 </span>  <span class="Delimiter">}</span>
<span id="L2014" class="LineNr">2014 </span>]
<span id="L2015" class="LineNr">2015 </span>
<span id="L2016" class="LineNr">2016 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2016'>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="L2017" class="LineNr">2017 </span>  <span class="Constant">local-scope</span>
<span id="L2018" class="LineNr">2018 </span>  <span class="Constant">load-inputs</span>
<span id="L2019" class="LineNr">2019 </span>  curr-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L2020" class="LineNr">2020 </span>  <span class="Comment"># accumulate the current line as text and render it</span>
<span id="L2021" class="LineNr">2021 </span>  buf:&amp;:<a href='../061text.mu.html#L120'>buffer</a>:char <span class="Special">&lt;-</span> <a href='../061text.mu.html#L125'>new-buffer</a><span class="Constant"> 30</span>  <span class="Comment"># accumulator for the text we need to render</span>
<span id="L2022" class="LineNr">2022 </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="L2023" class="LineNr">2023 </span>  i:num <span class="Special">&lt;-</span> copy curr-column
<span id="L2024" class="LineNr">2024 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L2025" class="LineNr">2025 </span>  <span class="Delimiter">{</span>
<span id="L2026" class="LineNr">2026 </span>    <span class="Comment"># if we have a wrapped line, give up and render the whole screen</span>
<span id="L2027" class="LineNr">2027 </span>    wrap?:bool <span class="Special">&lt;-</span> greater-or-equal i, right
<span id="L2028" class="LineNr">2028 </span>    <span class="muControl">return-if</span> wrap?, <span class="Constant">1/go-render</span>
<span id="L2029" class="LineNr">2029 </span>    curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> curr
<span id="L2030" class="LineNr">2030 </span>    <span class="muControl">break-unless</span> curr
<span id="L2031" class="LineNr">2031 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L2032" class="LineNr">2032 </span>    b:bool <span class="Special">&lt;-</span> equal c,<span class="Constant"> 10</span>
<span id="L2033" class="LineNr">2033 </span>    <span class="muControl">break-if</span> b
<span id="L2034" class="LineNr">2034 </span>    buf <span class="Special">&lt;-</span> append buf, c
<span id="L2035" class="LineNr">2035 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L2036" class="LineNr">2036 </span>   <span class="muControl"> loop</span>
<span id="L2037" class="LineNr">2037 </span>  <span class="Delimiter">}</span>
<span id="L2038" class="LineNr">2038 </span>  <span class="Comment"># if the line used to be wrapped, give up and render the whole screen</span>
<span id="L2039" class="LineNr">2039 </span>  num-deleted-cells:num <span class="Special">&lt;-</span> length deleted-cells
<span id="L2040" class="LineNr">2040 </span>  old-row-len:num <span class="Special">&lt;-</span> add i, num-deleted-cells
<span id="L2041" class="LineNr">2041 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L2042" class="LineNr">2042 </span>  end:num <span class="Special">&lt;-</span> subtract right, left
<span id="L2043" class="LineNr">2043 </span>  wrap?:bool <span class="Special">&lt;-</span> greater-or-equal old-row-len, end
<span id="L2044" class="LineNr">2044 </span>  <span class="muControl">return-if</span> wrap?, <span class="Constant">1/go-render</span>
<span id="L2045" class="LineNr">2045 </span>  curr-line:text <span class="Special">&lt;-</span> <a href='../061text.mu.html#L338'>buffer-to-array</a> buf
<span id="L2046" class="LineNr">2046 </span>  curr-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L2047" class="LineNr">2047 </span>  <a href='003-shortcuts.mu.html#L2107'>render-code</a> <a href='../081print.mu.html#L16'>screen</a>, curr-line, curr-column, right, curr-row
<span id="L2048" class="LineNr">2048 </span> <span class="muControl"> return</span> <span class="Constant">0/dont-render</span>
<span id="L2049" class="LineNr">2049 </span>]
<span id="L2050" class="LineNr">2050 </span>
<span id="L2051" class="LineNr">2051 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2051'>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="L2052" class="LineNr">2052 </span>  <span class="Constant">local-scope</span>
<span id="L2053" class="LineNr">2053 </span>  <span class="Constant">load-inputs</span>
<span id="L2054" class="LineNr">2054 </span>  <span class="Comment"># compute range to delete</span>
<span id="L2055" class="LineNr">2055 </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="L2056" class="LineNr">2056 </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="L2057" class="LineNr">2057 </span>  update-top-of-screen?:bool <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
<span id="L2058" class="LineNr">2058 </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="L2059" class="LineNr">2059 </span>  start:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy before-cursor
<span id="L2060" class="LineNr">2060 </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#L25'>next</a> before-cursor
<span id="L2061" class="LineNr">2061 </span>  <span class="Delimiter">{</span>
<span id="L2062" class="LineNr">2062 </span>    at-start-of-text?:bool <span class="Special">&lt;-</span> equal start, init
<span id="L2063" class="LineNr">2063 </span>    <span class="muControl">break-if</span> at-start-of-text?
<span id="L2064" class="LineNr">2064 </span>    curr:char <span class="Special">&lt;-</span> get *start, <span class="Constant">value:offset</span>
<span id="L2065" class="LineNr">2065 </span>    at-start-of-line?:bool <span class="Special">&lt;-</span> equal curr, <span class="Constant">10/newline</span>
<span id="L2066" class="LineNr">2066 </span>    <span class="muControl">break-if</span> at-start-of-line?
<span id="L2067" class="LineNr">2067 </span>    <span class="Comment"># if we went past top-of-screen, make a note to update it as well</span>
<span id="L2068" class="LineNr">2068 </span>    at-top-of-screen?:bool <span class="Special">&lt;-</span> equal start, top-of-screen
<span id="L2069" class="LineNr">2069 </span>    update-top-of-screen?:bool <span class="Special">&lt;-</span> or update-top-of-screen?, at-top-of-screen?
<span id="L2070" class="LineNr">2070 </span>    start <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L32'>prev</a> start
<span id="L2071" class="LineNr">2071 </span>    assert start, <span class="Constant">[delete-to-start-of-line tried to move before start of text]</span>
<span id="L2072" class="LineNr">2072 </span>   <span class="muControl"> loop</span>
<span id="L2073" class="LineNr">2073 </span>  <span class="Delimiter">}</span>
<span id="L2074" class="LineNr">2074 </span>  <span class="Comment"># snip it out</span>
<span id="L2075" class="LineNr">2075 </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#L25'>next</a> start
<span id="L2076" class="LineNr">2076 </span>  <a href='../065duplex_list.mu.html#L385'>remove-between</a> start, end
<span id="L2077" class="LineNr">2077 </span>  <span class="Comment"># update top-of-screen if it's just been invalidated</span>
<span id="L2078" class="LineNr">2078 </span>  <span class="Delimiter">{</span>
<span id="L2079" class="LineNr">2079 </span>    <span class="muControl">break-unless</span> update-top-of-screen?
<span id="L2080" class="LineNr">2080 </span>    put *editor, <span class="Constant">top-of-screen:offset</span>, start
<span id="L2081" class="LineNr">2081 </span>  <span class="Delimiter">}</span>
<span id="L2082" class="LineNr">2082 </span>  <span class="Comment"># adjust cursor</span>
<span id="L2083" class="LineNr">2083 </span>  before-cursor <span class="Special">&lt;-</span> copy start
<span id="L2084" class="LineNr">2084 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor
<span id="L2085" class="LineNr">2085 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L2086" class="LineNr">2086 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, left
<span id="L2087" class="LineNr">2087 </span>  <span class="Comment"># if the line wrapped before, we may need to adjust cursor-row as well</span>
<span id="L2088" class="LineNr">2088 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L2089" class="LineNr">2089 </span>  width:num <span class="Special">&lt;-</span> subtract right, left
<span id="L2090" class="LineNr">2090 </span>  num-deleted:num <span class="Special">&lt;-</span> length result
<span id="L2091" class="LineNr">2091 </span>  cursor-row-adjustment:num <span class="Special">&lt;-</span> divide-with-remainder num-deleted, width
<span id="L2092" class="LineNr">2092 </span>  <span class="muControl">return-unless</span> cursor-row-adjustment
<span id="L2093" class="LineNr">2093 </span>  cursor-row:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-row:offset</span>
<span id="L2094" class="LineNr">2094 </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="L2095" class="LineNr">2095 </span>  at-top?:bool <span class="Special">&lt;-</span> lesser-or-equal cursor-row-in-editor, cursor-row-adjustment
<span id="L2096" class="LineNr">2096 </span>  <span class="Delimiter">{</span>
<span id="L2097" class="LineNr">2097 </span>    <span class="muControl">break-unless</span> at-top?
<span id="L2098" class="LineNr">2098 </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="L2099" class="LineNr">2099 </span>  <span class="Delimiter">}</span>
<span id="L2100" class="LineNr">2100 </span>  <span class="Delimiter">{</span>
<span id="L2101" class="LineNr">2101 </span>    <span class="muControl">break-if</span> at-top?
<span id="L2102" class="LineNr">2102 </span>    cursor-row <span class="Special">&lt;-</span> subtract cursor-row, cursor-row-adjustment
<span id="L2103" class="LineNr">2103 </span>  <span class="Delimiter">}</span>
<span id="L2104" class="LineNr">2104 </span>  put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row
<span id="L2105" class="LineNr">2105 </span>]
<span id="L2106" class="LineNr">2106 </span>
<span id="L2107" class="LineNr">2107 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2107'>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="L2108" class="LineNr">2108 </span>  <span class="Constant">local-scope</span>
<span id="L2109" class="LineNr">2109 </span>  <span class="Constant">load-inputs</span>
<span id="L2110" class="LineNr">2110 </span>  <span class="muControl">return-unless</span> s
<span id="L2111" class="LineNr">2111 </span>  color:num <span class="Special">&lt;-</span> copy <span class="Constant">7/white</span>
<span id="L2112" class="LineNr">2112 </span>  column:num <span class="Special">&lt;-</span> copy left
<span id="L2113" class="LineNr">2113 </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="L2114" class="LineNr">2114 </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="L2115" class="LineNr">2115 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L2116" class="LineNr">2116 </span>  len:num <span class="Special">&lt;-</span> length *s
<span id="L2117" class="LineNr">2117 </span>  <span class="Delimiter">{</span>
<span id="L2118" class="LineNr">2118 </span><span class="Constant">    +next-character</span>
<span id="L2119" class="LineNr">2119 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
<span id="L2120" class="LineNr">2120 </span>    <span class="muControl">break-if</span> done?
<span id="L2121" class="LineNr">2121 </span>    done? <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
<span id="L2122" class="LineNr">2122 </span>    <span class="muControl">break-if</span> done?
<span id="L2123" class="LineNr">2123 </span>    c:char <span class="Special">&lt;-</span> index *s, i
<span id="L2124" class="LineNr">2124 </span><span class="Constant">    &lt;character-c-received&gt;</span>
<span id="L2125" class="LineNr">2125 </span>    <span class="Delimiter">{</span>
<span id="L2126" class="LineNr">2126 </span>      <span class="Comment"># newline? move to left rather than 0</span>
<span id="L2127" class="LineNr">2127 </span>      newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L2128" class="LineNr">2128 </span>      <span class="muControl">break-unless</span> newline?
<span id="L2129" class="LineNr">2129 </span>      <span class="Comment"># clear rest of line in this window</span>
<span id="L2130" class="LineNr">2130 </span>      <span class="Delimiter">{</span>
<span id="L2131" class="LineNr">2131 </span>        done?:bool <span class="Special">&lt;-</span> greater-than column, right
<span id="L2132" class="LineNr">2132 </span>        <span class="muControl">break-if</span> done?
<span id="L2133" class="LineNr">2133 </span>        space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
<span id="L2134" class="LineNr">2134 </span>        print <a href='../081print.mu.html#L16'>screen</a>, space
<span id="L2135" class="LineNr">2135 </span>        column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
<span id="L2136" class="LineNr">2136 </span>       <span class="muControl"> loop</span>
<span id="L2137" class="LineNr">2137 </span>      <span class="Delimiter">}</span>
<span id="L2138" class="LineNr">2138 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L2139" class="LineNr">2139 </span>      column <span class="Special">&lt;-</span> copy left
<span id="L2140" class="LineNr">2140 </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="L2141" class="LineNr">2141 </span>      i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L2142" class="LineNr">2142 </span>     <span class="muControl"> loop</span> <span class="Constant">+next-character</span>
<span id="L2143" class="LineNr">2143 </span>    <span class="Delimiter">}</span>
<span id="L2144" class="LineNr">2144 </span>    <span class="Delimiter">{</span>
<span id="L2145" class="LineNr">2145 </span>      <span class="Comment"># at right? wrap.</span>
<span id="L2146" class="LineNr">2146 </span>      at-right?:bool <span class="Special">&lt;-</span> equal column, right
<span id="L2147" class="LineNr">2147 </span>      <span class="muControl">break-unless</span> at-right?
<span id="L2148" class="LineNr">2148 </span>      <span class="Comment"># print wrap icon</span>
<span id="L2149" class="LineNr">2149 </span>      wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
<span id="L2150" class="LineNr">2150 </span>      print <a href='../081print.mu.html#L16'>screen</a>, wrap-icon, <span class="Constant">245/grey</span>
<span id="L2151" class="LineNr">2151 </span>      column <span class="Special">&lt;-</span> copy left
<span id="L2152" class="LineNr">2152 </span>      row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L2153" class="LineNr">2153 </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="L2154" class="LineNr">2154 </span>      <span class="Comment"># don't increment i</span>
<span id="L2155" class="LineNr">2155 </span>     <span class="muControl"> loop</span> <span class="Constant">+next-character</span>
<span id="L2156" class="LineNr">2156 </span>    <span class="Delimiter">}</span>
<span id="L2157" class="LineNr">2157 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L2158" class="LineNr">2158 </span>    print <a href='../081print.mu.html#L16'>screen</a>, c, color
<span id="L2159" class="LineNr">2159 </span>    column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
<span id="L2160" class="LineNr">2160 </span>   <span class="muControl"> loop</span>
<span id="L2161" class="LineNr">2161 </span>  <span class="Delimiter">}</span>
<span id="L2162" class="LineNr">2162 </span>  was-at-left?:bool <span class="Special">&lt;-</span> equal column, left
<span id="L2163" class="LineNr">2163 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right
<span id="L2164" class="LineNr">2164 </span>  <span class="Delimiter">{</span>
<span id="L2165" class="LineNr">2165 </span>    <span class="muControl">break-if</span> was-at-left?
<span id="L2166" class="LineNr">2166 </span>    row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
<span id="L2167" class="LineNr">2167 </span>  <span class="Delimiter">}</span>
<span id="L2168" class="LineNr">2168 </span>  move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, left
<span id="L2169" class="LineNr">2169 </span>]
<span id="L2170" class="LineNr">2170 </span>
<span id="L2171" class="LineNr">2171 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u-2 [
<span id="L2172" class="LineNr">2172 </span>  <span class="Constant">local-scope</span>
<span id="L2173" class="LineNr">2173 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2174" class="LineNr">2174 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2175" class="LineNr">2175 </span><span class="Constant">456]</span>
<span id="L2176" class="LineNr">2176 </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="L2177" class="LineNr">2177 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2178" class="LineNr">2178 </span>  $clear-trace
<span id="L2179" class="LineNr">2179 </span>  <span class="Comment"># start on first line (no newline before), press ctrl-u</span>
<span id="L2180" class="LineNr">2180 </span>  assume-console [
<span id="L2181" class="LineNr">2181 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
<span id="L2182" class="LineNr">2182 </span>    press ctrl-u
<span id="L2183" class="LineNr">2183 </span>  ]
<span id="L2184" class="LineNr">2184 </span>  run [
<span id="L2185" class="LineNr">2185 </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="L2186" class="LineNr">2186 </span>  ]
<span id="L2187" class="LineNr">2187 </span>  <span class="Comment"># cursor deletes to start of line</span>
<span id="L2188" class="LineNr">2188 </span>  screen-should-contain [
<span id="L2189" class="LineNr">2189 </span>   <span class="Constant"> .          .</span>
<span id="L2190" class="LineNr">2190 </span>   <span class="Constant"> .3         .</span>
<span id="L2191" class="LineNr">2191 </span>   <span class="Constant"> .456       .</span>
<span id="L2192" class="LineNr">2192 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2193" class="LineNr">2193 </span>   <span class="Constant"> .          .</span>
<span id="L2194" class="LineNr">2194 </span>  ]
<span id="L2195" class="LineNr">2195 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L2196" class="LineNr">2196 </span>]
<span id="L2197" class="LineNr">2197 </span>
<span id="L2198" class="LineNr">2198 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-line-with-ctrl-u-3 [
<span id="L2199" class="LineNr">2199 </span>  <span class="Constant">local-scope</span>
<span id="L2200" class="LineNr">2200 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2201" class="LineNr">2201 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2202" class="LineNr">2202 </span><span class="Constant">456]</span>
<span id="L2203" class="LineNr">2203 </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="L2204" class="LineNr">2204 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2205" class="LineNr">2205 </span>  $clear-trace
<span id="L2206" class="LineNr">2206 </span>  <span class="Comment"># start past end of line, press ctrl-u</span>
<span id="L2207" class="LineNr">2207 </span>  assume-console [
<span id="L2208" class="LineNr">2208 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L2209" class="LineNr">2209 </span>    press ctrl-u
<span id="L2210" class="LineNr">2210 </span>  ]
<span id="L2211" class="LineNr">2211 </span>  run [
<span id="L2212" class="LineNr">2212 </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="L2213" class="LineNr">2213 </span>  ]
<span id="L2214" class="LineNr">2214 </span>  <span class="Comment"># cursor deletes to start of line</span>
<span id="L2215" class="LineNr">2215 </span>  screen-should-contain [
<span id="L2216" class="LineNr">2216 </span>   <span class="Constant"> .          .</span>
<span id="L2217" class="LineNr">2217 </span>   <span class="Constant"> .          .</span>
<span id="L2218" class="LineNr">2218 </span>   <span class="Constant"> .456       .</span>
<span id="L2219" class="LineNr">2219 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2220" class="LineNr">2220 </span>   <span class="Constant"> .          .</span>
<span id="L2221" class="LineNr">2221 </span>  ]
<span id="L2222" class="LineNr">2222 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L2223" class="LineNr">2223 </span>]
<span id="L2224" class="LineNr">2224 </span>
<span id="L2225" class="LineNr">2225 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-final-line-with-ctrl-u [
<span id="L2226" class="LineNr">2226 </span>  <span class="Constant">local-scope</span>
<span id="L2227" class="LineNr">2227 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2228" class="LineNr">2228 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2229" class="LineNr">2229 </span><span class="Constant">456]</span>
<span id="L2230" class="LineNr">2230 </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="L2231" class="LineNr">2231 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2232" class="LineNr">2232 </span>  $clear-trace
<span id="L2233" class="LineNr">2233 </span>  <span class="Comment"># start past end of final line, press ctrl-u</span>
<span id="L2234" class="LineNr">2234 </span>  assume-console [
<span id="L2235" class="LineNr">2235 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L2236" class="LineNr">2236 </span>    press ctrl-u
<span id="L2237" class="LineNr">2237 </span>  ]
<span id="L2238" class="LineNr">2238 </span>  run [
<span id="L2239" class="LineNr">2239 </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="L2240" class="LineNr">2240 </span>  ]
<span id="L2241" class="LineNr">2241 </span>  <span class="Comment"># cursor deletes to start of line</span>
<span id="L2242" class="LineNr">2242 </span>  screen-should-contain [
<span id="L2243" class="LineNr">2243 </span>   <span class="Constant"> .          .</span>
<span id="L2244" class="LineNr">2244 </span>   <span class="Constant"> .123       .</span>
<span id="L2245" class="LineNr">2245 </span>   <span class="Constant"> .          .</span>
<span id="L2246" class="LineNr">2246 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2247" class="LineNr">2247 </span>   <span class="Constant"> .          .</span>
<span id="L2248" class="LineNr">2248 </span>  ]
<span id="L2249" class="LineNr">2249 </span>  check-trace-count-for-label<span class="Constant"> 10</span>, <span class="Constant">[print-character]</span>
<span id="L2250" class="LineNr">2250 </span>]
<span id="L2251" class="LineNr">2251 </span>
<span id="L2252" class="LineNr">2252 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u [
<span id="L2253" class="LineNr">2253 </span>  <span class="Constant">local-scope</span>
<span id="L2254" class="LineNr">2254 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2255" class="LineNr">2255 </span>  <span class="Comment"># first line starts out wrapping</span>
<span id="L2256" class="LineNr">2256 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123456</span>
<span id="L2257" class="LineNr">2257 </span><span class="Constant">789]</span>
<span id="L2258" class="LineNr">2258 </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="L2259" class="LineNr">2259 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2260" class="LineNr">2260 </span>  screen-should-contain [
<span id="L2261" class="LineNr">2261 </span>   <span class="Constant"> .          .</span>
<span id="L2262" class="LineNr">2262 </span>   <span class="Constant"> .1234↩     .</span>
<span id="L2263" class="LineNr">2263 </span>   <span class="Constant"> .56        .</span>
<span id="L2264" class="LineNr">2264 </span>   <span class="Constant"> .789       .</span>
<span id="L2265" class="LineNr">2265 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2266" class="LineNr">2266 </span>   <span class="Constant"> .          .</span>
<span id="L2267" class="LineNr">2267 </span>  ]
<span id="L2268" class="LineNr">2268 </span>  $clear-trace
<span id="L2269" class="LineNr">2269 </span>  <span class="Comment"># ctrl-u enough of the first line that it's no longer wrapping</span>
<span id="L2270" class="LineNr">2270 </span>  assume-console [
<span id="L2271" class="LineNr">2271 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L2272" class="LineNr">2272 </span>    press ctrl-u
<span id="L2273" class="LineNr">2273 </span>  ]
<span id="L2274" class="LineNr">2274 </span>  run [
<span id="L2275" class="LineNr">2275 </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="L2276" class="LineNr">2276 </span>  ]
<span id="L2277" class="LineNr">2277 </span>  <span class="Comment"># entire screen needs to be refreshed</span>
<span id="L2278" class="LineNr">2278 </span>  screen-should-contain [
<span id="L2279" class="LineNr">2279 </span>   <span class="Constant"> .          .</span>
<span id="L2280" class="LineNr">2280 </span>   <span class="Constant"> .456       .</span>
<span id="L2281" class="LineNr">2281 </span>   <span class="Constant"> .789       .</span>
<span id="L2282" class="LineNr">2282 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2283" class="LineNr">2283 </span>   <span class="Constant"> .          .</span>
<span id="L2284" class="LineNr">2284 </span>  ]
<span id="L2285" class="LineNr">2285 </span>  check-trace-count-for-label<span class="Constant"> 45</span>, <span class="Constant">[print-character]</span>
<span id="L2286" class="LineNr">2286 </span>]
<span id="L2287" class="LineNr">2287 </span>
<span id="L2288" class="LineNr">2288 </span><span class="Comment"># sometimes hitting ctrl-u needs to adjust the cursor row</span>
<span id="L2289" class="LineNr">2289 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-2 [
<span id="L2290" class="LineNr">2290 </span>  <span class="Constant">local-scope</span>
<span id="L2291" class="LineNr">2291 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2292" class="LineNr">2292 </span>  <span class="Comment"># third line starts out wrapping</span>
<span id="L2293" class="LineNr">2293 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1</span>
<span id="L2294" class="LineNr">2294 </span><span class="Constant">2</span>
<span id="L2295" class="LineNr">2295 </span><span class="Constant">345678</span>
<span id="L2296" class="LineNr">2296 </span><span class="Constant">9]</span>
<span id="L2297" class="LineNr">2297 </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="L2298" class="LineNr">2298 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2299" class="LineNr">2299 </span>  screen-should-contain [
<span id="L2300" class="LineNr">2300 </span>   <span class="Constant"> .          .</span>
<span id="L2301" class="LineNr">2301 </span>   <span class="Constant"> .1         .</span>
<span id="L2302" class="LineNr">2302 </span>   <span class="Constant"> .2         .</span>
<span id="L2303" class="LineNr">2303 </span>   <span class="Constant"> .3456↩     .</span>
<span id="L2304" class="LineNr">2304 </span>   <span class="Constant"> .78        .</span>
<span id="L2305" class="LineNr">2305 </span>   <span class="Constant"> .9         .</span>
<span id="L2306" class="LineNr">2306 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2307" class="LineNr">2307 </span>   <span class="Constant"> .          .</span>
<span id="L2308" class="LineNr">2308 </span>  ]
<span id="L2309" class="LineNr">2309 </span>  <span class="Comment"># position cursor on screen line after the wrap and hit ctrl-u</span>
<span id="L2310" class="LineNr">2310 </span>  assume-console [
<span id="L2311" class="LineNr">2311 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 1</span>  <span class="Comment"># on '8'</span>
<span id="L2312" class="LineNr">2312 </span>    press ctrl-u
<span id="L2313" class="LineNr">2313 </span>  ]
<span id="L2314" class="LineNr">2314 </span>  run [
<span id="L2315" class="LineNr">2315 </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="L2316" class="LineNr">2316 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2317" class="LineNr">2317 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2318" class="LineNr">2318 </span>  ]
<span id="L2319" class="LineNr">2319 </span>  screen-should-contain [
<span id="L2320" class="LineNr">2320 </span>   <span class="Constant"> .          .</span>
<span id="L2321" class="LineNr">2321 </span>   <span class="Constant"> .1         .</span>
<span id="L2322" class="LineNr">2322 </span>   <span class="Constant"> .2         .</span>
<span id="L2323" class="LineNr">2323 </span>   <span class="Constant"> .8         .</span>
<span id="L2324" class="LineNr">2324 </span>   <span class="Constant"> .9         .</span>
<span id="L2325" class="LineNr">2325 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2326" class="LineNr">2326 </span>   <span class="Constant"> .          .</span>
<span id="L2327" class="LineNr">2327 </span>  ]
<span id="L2328" class="LineNr">2328 </span>  <span class="Comment"># cursor moves up one screen line</span>
<span id="L2329" class="LineNr">2329 </span>  memory-should-contain [
<span id="L2330" class="LineNr">2330 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor-row</span>
<span id="L2331" class="LineNr">2331 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2332" class="LineNr">2332 </span>  ]
<span id="L2333" class="LineNr">2333 </span>]
<span id="L2334" class="LineNr">2334 </span>
<span id="L2335" class="LineNr">2335 </span><span class="Comment"># line wrapping twice (taking up 3 screen lines)</span>
<span id="L2336" class="LineNr">2336 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-3 [
<span id="L2337" class="LineNr">2337 </span>  <span class="Constant">local-scope</span>
<span id="L2338" class="LineNr">2338 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2339" class="LineNr">2339 </span>  <span class="Comment"># third line starts out wrapping</span>
<span id="L2340" class="LineNr">2340 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1</span>
<span id="L2341" class="LineNr">2341 </span><span class="Constant">2</span>
<span id="L2342" class="LineNr">2342 </span><span class="Constant">3456789abcd</span>
<span id="L2343" class="LineNr">2343 </span><span class="Constant">e]</span>
<span id="L2344" class="LineNr">2344 </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="L2345" class="LineNr">2345 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2346" class="LineNr">2346 </span>  assume-console [
<span id="L2347" class="LineNr">2347 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 1</span>  <span class="Comment"># on '8'</span>
<span id="L2348" class="LineNr">2348 </span>  ]
<span id="L2349" class="LineNr">2349 </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="L2350" class="LineNr">2350 </span>  screen-should-contain [
<span id="L2351" class="LineNr">2351 </span>   <span class="Constant"> .          .</span>
<span id="L2352" class="LineNr">2352 </span>   <span class="Constant"> .1         .</span>
<span id="L2353" class="LineNr">2353 </span>   <span class="Constant"> .2         .</span>
<span id="L2354" class="LineNr">2354 </span>   <span class="Constant"> .3456↩     .</span>
<span id="L2355" class="LineNr">2355 </span>   <span class="Constant"> .789a↩     .</span>
<span id="L2356" class="LineNr">2356 </span>   <span class="Constant"> .bcd       .</span>
<span id="L2357" class="LineNr">2357 </span>   <span class="Constant"> .e         .</span>
<span id="L2358" class="LineNr">2358 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2359" class="LineNr">2359 </span>   <span class="Constant"> .          .</span>
<span id="L2360" class="LineNr">2360 </span>  ]
<span id="L2361" class="LineNr">2361 </span>  assume-console [
<span id="L2362" class="LineNr">2362 </span>    left-click<span class="Constant"> 5</span>,<span class="Constant"> 1</span>
<span id="L2363" class="LineNr">2363 </span>    press ctrl-u
<span id="L2364" class="LineNr">2364 </span>  ]
<span id="L2365" class="LineNr">2365 </span>  run [
<span id="L2366" class="LineNr">2366 </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="L2367" class="LineNr">2367 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2368" class="LineNr">2368 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2369" class="LineNr">2369 </span>  ]
<span id="L2370" class="LineNr">2370 </span>  screen-should-contain [
<span id="L2371" class="LineNr">2371 </span>   <span class="Constant"> .          .</span>
<span id="L2372" class="LineNr">2372 </span>   <span class="Constant"> .1         .</span>
<span id="L2373" class="LineNr">2373 </span>   <span class="Constant"> .2         .</span>
<span id="L2374" class="LineNr">2374 </span>   <span class="Constant"> .cd        .</span>
<span id="L2375" class="LineNr">2375 </span>   <span class="Constant"> .e         .</span>
<span id="L2376" class="LineNr">2376 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2377" class="LineNr">2377 </span>   <span class="Constant"> .          .</span>
<span id="L2378" class="LineNr">2378 </span>  ]
<span id="L2379" class="LineNr">2379 </span>  <span class="Comment"># make sure we adjusted cursor-row</span>
<span id="L2380" class="LineNr">2380 </span>  memory-should-contain [
<span id="L2381" class="LineNr">2381 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>  <span class="Comment"># cursor-row</span>
<span id="L2382" class="LineNr">2382 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2383" class="LineNr">2383 </span>  ]
<span id="L2384" class="LineNr">2384 </span>]
<span id="L2385" class="LineNr">2385 </span>
<span id="L2386" class="LineNr">2386 </span><span class="Comment"># adjusting cursor row at the top of the screen</span>
<span id="L2387" class="LineNr">2387 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-4 [
<span id="L2388" class="LineNr">2388 </span>  <span class="Constant">local-scope</span>
<span id="L2389" class="LineNr">2389 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2390" class="LineNr">2390 </span>  <span class="Comment"># first line starts out wrapping</span>
<span id="L2391" class="LineNr">2391 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1234567</span>
<span id="L2392" class="LineNr">2392 </span><span class="Constant">89]</span>
<span id="L2393" class="LineNr">2393 </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="L2394" class="LineNr">2394 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2395" class="LineNr">2395 </span>  screen-should-contain [
<span id="L2396" class="LineNr">2396 </span>   <span class="Constant"> .          .</span>
<span id="L2397" class="LineNr">2397 </span>   <span class="Constant"> .1234↩     .</span>
<span id="L2398" class="LineNr">2398 </span>   <span class="Constant"> .567       .</span>
<span id="L2399" class="LineNr">2399 </span>   <span class="Constant"> .89        .</span>
<span id="L2400" class="LineNr">2400 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2401" class="LineNr">2401 </span>   <span class="Constant"> .          .</span>
<span id="L2402" class="LineNr">2402 </span>  ]
<span id="L2403" class="LineNr">2403 </span>  <span class="Comment"># position cursor on second screen line (after the wrap) and hit ctrl-u</span>
<span id="L2404" class="LineNr">2404 </span>  assume-console [
<span id="L2405" class="LineNr">2405 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L2406" class="LineNr">2406 </span>    press ctrl-u
<span id="L2407" class="LineNr">2407 </span>  ]
<span id="L2408" class="LineNr">2408 </span>  run [
<span id="L2409" class="LineNr">2409 </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="L2410" class="LineNr">2410 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2411" class="LineNr">2411 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2412" class="LineNr">2412 </span>  ]
<span id="L2413" class="LineNr">2413 </span>  screen-should-contain [
<span id="L2414" class="LineNr">2414 </span>   <span class="Constant"> .          .</span>
<span id="L2415" class="LineNr">2415 </span>   <span class="Constant"> .67        .</span>
<span id="L2416" class="LineNr">2416 </span>   <span class="Constant"> .89        .</span>
<span id="L2417" class="LineNr">2417 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2418" class="LineNr">2418 </span>   <span class="Constant"> .          .</span>
<span id="L2419" class="LineNr">2419 </span>  ]
<span id="L2420" class="LineNr">2420 </span>  <span class="Comment"># cursor moves up to screen line 1</span>
<span id="L2421" class="LineNr">2421 </span>  memory-should-contain [
<span id="L2422" class="LineNr">2422 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L2423" class="LineNr">2423 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2424" class="LineNr">2424 </span>  ]
<span id="L2425" class="LineNr">2425 </span>]
<span id="L2426" class="LineNr">2426 </span>
<span id="L2427" class="LineNr">2427 </span><span class="Comment"># screen begins part-way through a wrapping line</span>
<span id="L2428" class="LineNr">2428 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-5 [
<span id="L2429" class="LineNr">2429 </span>  <span class="Constant">local-scope</span>
<span id="L2430" class="LineNr">2430 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2431" class="LineNr">2431 </span>  <span class="Comment"># third line starts out wrapping</span>
<span id="L2432" class="LineNr">2432 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1</span>
<span id="L2433" class="LineNr">2433 </span><span class="Constant">2</span>
<span id="L2434" class="LineNr">2434 </span><span class="Constant">345678</span>
<span id="L2435" class="LineNr">2435 </span><span class="Constant">9]</span>
<span id="L2436" class="LineNr">2436 </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="L2437" class="LineNr">2437 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2438" class="LineNr">2438 </span>  <span class="Comment"># position the '78' line at the top of the screen</span>
<span id="L2439" class="LineNr">2439 </span>  assume-console [
<span id="L2440" class="LineNr">2440 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 1</span>  <span class="Comment"># on '8'</span>
<span id="L2441" class="LineNr">2441 </span>    press ctrl-t
<span id="L2442" class="LineNr">2442 </span>  ]
<span id="L2443" class="LineNr">2443 </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="L2444" class="LineNr">2444 </span>  screen-should-contain [
<span id="L2445" class="LineNr">2445 </span>   <span class="Constant"> .          .</span>
<span id="L2446" class="LineNr">2446 </span>   <span class="Constant"> .78        .</span>
<span id="L2447" class="LineNr">2447 </span>   <span class="Constant"> .9         .</span>
<span id="L2448" class="LineNr">2448 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2449" class="LineNr">2449 </span>   <span class="Constant"> .          .</span>
<span id="L2450" class="LineNr">2450 </span>  ]
<span id="L2451" class="LineNr">2451 </span>  assume-console [
<span id="L2452" class="LineNr">2452 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L2453" class="LineNr">2453 </span>    press ctrl-u
<span id="L2454" class="LineNr">2454 </span>  ]
<span id="L2455" class="LineNr">2455 </span>  run [
<span id="L2456" class="LineNr">2456 </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="L2457" class="LineNr">2457 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2458" class="LineNr">2458 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2459" class="LineNr">2459 </span>  ]
<span id="L2460" class="LineNr">2460 </span>  <span class="Comment"># make sure we updated top-of-screen correctly</span>
<span id="L2461" class="LineNr">2461 </span>  screen-should-contain [
<span id="L2462" class="LineNr">2462 </span>   <span class="Constant"> .          .</span>
<span id="L2463" class="LineNr">2463 </span>   <span class="Constant"> .8         .</span>
<span id="L2464" class="LineNr">2464 </span>   <span class="Constant"> .9         .</span>
<span id="L2465" class="LineNr">2465 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2466" class="LineNr">2466 </span>   <span class="Constant"> .          .</span>
<span id="L2467" class="LineNr">2467 </span>  ]
<span id="L2468" class="LineNr">2468 </span>  memory-should-contain [
<span id="L2469" class="LineNr">2469 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L2470" class="LineNr">2470 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2471" class="LineNr">2471 </span>  ]
<span id="L2472" class="LineNr">2472 </span>  <span class="Comment"># the entire line is deleted, even the part not shown on screen</span>
<span id="L2473" class="LineNr">2473 </span>  assume-console [
<span id="L2474" class="LineNr">2474 </span>    press up-arrow
<span id="L2475" class="LineNr">2475 </span>  ]
<span id="L2476" class="LineNr">2476 </span>  run [
<span id="L2477" class="LineNr">2477 </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="L2478" class="LineNr">2478 </span>  ]
<span id="L2479" class="LineNr">2479 </span>  screen-should-contain [
<span id="L2480" class="LineNr">2480 </span>   <span class="Constant"> .          .</span>
<span id="L2481" class="LineNr">2481 </span>   <span class="Constant"> .2         .</span>
<span id="L2482" class="LineNr">2482 </span>   <span class="Constant"> .8         .</span>
<span id="L2483" class="LineNr">2483 </span>   <span class="Constant"> .9         .</span>
<span id="L2484" class="LineNr">2484 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2485" class="LineNr">2485 </span>   <span class="Constant"> .          .</span>
<span id="L2486" class="LineNr">2486 </span>  ]
<span id="L2487" class="LineNr">2487 </span>]
<span id="L2488" class="LineNr">2488 </span>
<span id="L2489" class="LineNr">2489 </span><span class="Comment"># screen begins part-way through a line wrapping twice (taking up 3 screen lines)</span>
<span id="L2490" class="LineNr">2490 </span><span class="muScenario">scenario</span> editor-deletes-to-start-of-wrapped-line-with-ctrl-u-6 [
<span id="L2491" class="LineNr">2491 </span>  <span class="Constant">local-scope</span>
<span id="L2492" class="LineNr">2492 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">10/height</span>
<span id="L2493" class="LineNr">2493 </span>  <span class="Comment"># third line starts out wrapping</span>
<span id="L2494" class="LineNr">2494 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1</span>
<span id="L2495" class="LineNr">2495 </span><span class="Constant">2</span>
<span id="L2496" class="LineNr">2496 </span><span class="Constant">3456789abcd</span>
<span id="L2497" class="LineNr">2497 </span><span class="Constant">e]</span>
<span id="L2498" class="LineNr">2498 </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="L2499" class="LineNr">2499 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2500" class="LineNr">2500 </span>  <span class="Comment"># position the 'bcd' line at the top of the screen</span>
<span id="L2501" class="LineNr">2501 </span>  assume-console [
<span id="L2502" class="LineNr">2502 </span>    left-click<span class="Constant"> 4</span>,<span class="Constant"> 1</span>  <span class="Comment"># on '8'</span>
<span id="L2503" class="LineNr">2503 </span>    press ctrl-t
<span id="L2504" class="LineNr">2504 </span>    press ctrl-s  <span class="Comment"># now on 'c'</span>
<span id="L2505" class="LineNr">2505 </span>  ]
<span id="L2506" class="LineNr">2506 </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="L2507" class="LineNr">2507 </span>  screen-should-contain [
<span id="L2508" class="LineNr">2508 </span>   <span class="Constant"> .          .</span>
<span id="L2509" class="LineNr">2509 </span>   <span class="Constant"> .bcd       .</span>
<span id="L2510" class="LineNr">2510 </span>   <span class="Constant"> .e         .</span>
<span id="L2511" class="LineNr">2511 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2512" class="LineNr">2512 </span>   <span class="Constant"> .          .</span>
<span id="L2513" class="LineNr">2513 </span>  ]
<span id="L2514" class="LineNr">2514 </span>  assume-console [
<span id="L2515" class="LineNr">2515 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L2516" class="LineNr">2516 </span>    press ctrl-u
<span id="L2517" class="LineNr">2517 </span>  ]
<span id="L2518" class="LineNr">2518 </span>  run [
<span id="L2519" class="LineNr">2519 </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="L2520" class="LineNr">2520 </span>    10:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2521" class="LineNr">2521 </span>    11:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2522" class="LineNr">2522 </span>  ]
<span id="L2523" class="LineNr">2523 </span>  <span class="Comment"># make sure we updated top-of-screen correctly</span>
<span id="L2524" class="LineNr">2524 </span>  screen-should-contain [
<span id="L2525" class="LineNr">2525 </span>   <span class="Constant"> .          .</span>
<span id="L2526" class="LineNr">2526 </span>   <span class="Constant"> .cd        .</span>
<span id="L2527" class="LineNr">2527 </span>   <span class="Constant"> .e         .</span>
<span id="L2528" class="LineNr">2528 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2529" class="LineNr">2529 </span>   <span class="Constant"> .          .</span>
<span id="L2530" class="LineNr">2530 </span>  ]
<span id="L2531" class="LineNr">2531 </span>  memory-should-contain [
<span id="L2532" class="LineNr">2532 </span>   <span class="Constant"> 10</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>  <span class="Comment"># cursor-row</span>
<span id="L2533" class="LineNr">2533 </span>   <span class="Constant"> 11</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>  <span class="Comment"># cursor-column</span>
<span id="L2534" class="LineNr">2534 </span>  ]
<span id="L2535" class="LineNr">2535 </span>  <span class="Comment"># the entire line is deleted, even the part not shown on screen</span>
<span id="L2536" class="LineNr">2536 </span>  assume-console [
<span id="L2537" class="LineNr">2537 </span>    press up-arrow
<span id="L2538" class="LineNr">2538 </span>  ]
<span id="L2539" class="LineNr">2539 </span>  run [
<span id="L2540" class="LineNr">2540 </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="L2541" class="LineNr">2541 </span>  ]
<span id="L2542" class="LineNr">2542 </span>  screen-should-contain [
<span id="L2543" class="LineNr">2543 </span>   <span class="Constant"> .          .</span>
<span id="L2544" class="LineNr">2544 </span>   <span class="Constant"> .2         .</span>
<span id="L2545" class="LineNr">2545 </span>   <span class="Constant"> .cd        .</span>
<span id="L2546" class="LineNr">2546 </span>   <span class="Constant"> .e         .</span>
<span id="L2547" class="LineNr">2547 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L2548" class="LineNr">2548 </span>   <span class="Constant"> .          .</span>
<span id="L2549" class="LineNr">2549 </span>  ]
<span id="L2550" class="LineNr">2550 </span>]
<span id="L2551" class="LineNr">2551 </span>
<span id="L2552" class="LineNr">2552 </span><span class="Comment"># ctrl-k - delete text from cursor to end of line (but not the newline)</span>
<span id="L2553" class="LineNr">2553 </span>
<span id="L2554" class="LineNr">2554 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k [
<span id="L2555" class="LineNr">2555 </span>  <span class="Constant">local-scope</span>
<span id="L2556" class="LineNr">2556 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2557" class="LineNr">2557 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2558" class="LineNr">2558 </span><span class="Constant">456]</span>
<span id="L2559" class="LineNr">2559 </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="L2560" class="LineNr">2560 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2561" class="LineNr">2561 </span>  $clear-trace
<span id="L2562" class="LineNr">2562 </span>  <span class="Comment"># start on first line, press ctrl-k</span>
<span id="L2563" class="LineNr">2563 </span>  assume-console [
<span id="L2564" class="LineNr">2564 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span>
<span id="L2565" class="LineNr">2565 </span>    press ctrl-k
<span id="L2566" class="LineNr">2566 </span>  ]
<span id="L2567" class="LineNr">2567 </span>  run [
<span id="L2568" class="LineNr">2568 </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="L2569" class="LineNr">2569 </span>  ]
<span id="L2570" class="LineNr">2570 </span>  <span class="Comment"># cursor deletes to end of line</span>
<span id="L2571" class="LineNr">2571 </span>  screen-should-contain [
<span id="L2572" class="LineNr">2572 </span>   <span class="Constant"> .          .</span>
<span id="L2573" class="LineNr">2573 </span>   <span class="Constant"> .1         .</span>
<span id="L2574" class="LineNr">2574 </span>   <span class="Constant"> .456       .</span>
<span id="L2575" class="LineNr">2575 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2576" class="LineNr">2576 </span>   <span class="Constant"> .          .</span>
<span id="L2577" class="LineNr">2577 </span>  ]
<span id="L2578" class="LineNr">2578 </span>  check-trace-count-for-label<span class="Constant"> 9</span>, <span class="Constant">[print-character]</span>
<span id="L2579" class="LineNr">2579 </span>]
<span id="L2580" class="LineNr">2580 </span>
<span id="L2581" class="LineNr">2581 </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="L2582" class="LineNr">2582 </span>  <span class="Delimiter">{</span>
<span id="L2583" class="LineNr">2583 </span>    delete-to-end-of-line?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">11/ctrl-k</span>
<span id="L2584" class="LineNr">2584 </span>    <span class="muControl">break-unless</span> delete-to-end-of-line?
<span id="L2585" class="LineNr">2585 </span><span class="Constant">    <a href='003-shortcuts.mu.html#L2585'>&lt;begin-delete-to-end-of-line&gt;</a></span>
<span id="L2586" class="LineNr">2586 </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#L2612'>delete-to-end-of-line</a> editor
<span id="L2587" class="LineNr">2587 </span><span class="Constant">    <a href='003-shortcuts.mu.html#L2587'>&lt;end-delete-to-end-of-line&gt;</a></span>
<span id="L2588" class="LineNr">2588 </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="L2589" class="LineNr">2589 </span>    go-render?:bool <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2594'>minimal-render-for-ctrl-k</a> <a href='../081print.mu.html#L16'>screen</a>, editor, deleted-cells
<span id="L2590" class="LineNr">2590 </span>   <span class="muControl"> return</span>
<span id="L2591" class="LineNr">2591 </span>  <span class="Delimiter">}</span>
<span id="L2592" class="LineNr">2592 </span>]
<span id="L2593" class="LineNr">2593 </span>
<span id="L2594" class="LineNr">2594 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2594'>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="L2595" class="LineNr">2595 </span>  <span class="Constant">local-scope</span>
<span id="L2596" class="LineNr">2596 </span>  <span class="Constant">load-inputs</span>
<span id="L2597" class="LineNr">2597 </span>  <span class="Comment"># if we deleted nothing, there's nothing to render</span>
<span id="L2598" class="LineNr">2598 </span>  <span class="muControl">return-unless</span> deleted-cells, <span class="Constant">0/dont-render</span>
<span id="L2599" class="LineNr">2599 </span>  <span class="Comment"># if the line used to wrap before, give up and render the whole screen</span>
<span id="L2600" class="LineNr">2600 </span>  curr-column:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">cursor-column:offset</span>
<span id="L2601" class="LineNr">2601 </span>  num-deleted-cells:num <span class="Special">&lt;-</span> length deleted-cells
<span id="L2602" class="LineNr">2602 </span>  old-row-len:num <span class="Special">&lt;-</span> add curr-column, num-deleted-cells
<span id="L2603" class="LineNr">2603 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L2604" class="LineNr">2604 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L2605" class="LineNr">2605 </span>  end:num <span class="Special">&lt;-</span> subtract right, left
<span id="L2606" class="LineNr">2606 </span>  wrap?:bool <span class="Special">&lt;-</span> greater-or-equal old-row-len, end
<span id="L2607" class="LineNr">2607 </span>  <span class="muControl">return-if</span> wrap?, <span class="Constant">1/go-render</span>
<span id="L2608" class="LineNr">2608 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right
<span id="L2609" class="LineNr">2609 </span> <span class="muControl"> return</span> <span class="Constant">0/dont-render</span>
<span id="L2610" class="LineNr">2610 </span>]
<span id="L2611" class="LineNr">2611 </span>
<span id="L2612" class="LineNr">2612 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2612'>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="L2613" class="LineNr">2613 </span>  <span class="Constant">local-scope</span>
<span id="L2614" class="LineNr">2614 </span>  <span class="Constant">load-inputs</span>
<span id="L2615" class="LineNr">2615 </span>  <span class="Comment"># compute range to delete</span>
<span id="L2616" class="LineNr">2616 </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="L2617" class="LineNr">2617 </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#L25'>next</a> start
<span id="L2618" class="LineNr">2618 </span>  <span class="Delimiter">{</span>
<span id="L2619" class="LineNr">2619 </span>    at-end-of-text?:bool <span class="Special">&lt;-</span> equal end, <span class="Constant">0/null</span>
<span id="L2620" class="LineNr">2620 </span>    <span class="muControl">break-if</span> at-end-of-text?
<span id="L2621" class="LineNr">2621 </span>    curr:char <span class="Special">&lt;-</span> get *end, <span class="Constant">value:offset</span>
<span id="L2622" class="LineNr">2622 </span>    at-end-of-line?:bool <span class="Special">&lt;-</span> equal curr, <span class="Constant">10/newline</span>
<span id="L2623" class="LineNr">2623 </span>    <span class="muControl">break-if</span> at-end-of-line?
<span id="L2624" class="LineNr">2624 </span>    end <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> end
<span id="L2625" class="LineNr">2625 </span>   <span class="muControl"> loop</span>
<span id="L2626" class="LineNr">2626 </span>  <span class="Delimiter">}</span>
<span id="L2627" class="LineNr">2627 </span>  <span class="Comment"># snip it out</span>
<span id="L2628" class="LineNr">2628 </span>  result <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> start
<span id="L2629" class="LineNr">2629 </span>  <a href='../065duplex_list.mu.html#L385'>remove-between</a> start, end
<span id="L2630" class="LineNr">2630 </span>]
<span id="L2631" class="LineNr">2631 </span>
<span id="L2632" class="LineNr">2632 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-2 [
<span id="L2633" class="LineNr">2633 </span>  <span class="Constant">local-scope</span>
<span id="L2634" class="LineNr">2634 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2635" class="LineNr">2635 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2636" class="LineNr">2636 </span><span class="Constant">456]</span>
<span id="L2637" class="LineNr">2637 </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="L2638" class="LineNr">2638 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2639" class="LineNr">2639 </span>  $clear-trace
<span id="L2640" class="LineNr">2640 </span>  <span class="Comment"># start on second line (no newline after), press ctrl-k</span>
<span id="L2641" class="LineNr">2641 </span>  assume-console [
<span id="L2642" class="LineNr">2642 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span>
<span id="L2643" class="LineNr">2643 </span>    press ctrl-k
<span id="L2644" class="LineNr">2644 </span>  ]
<span id="L2645" class="LineNr">2645 </span>  run [
<span id="L2646" class="LineNr">2646 </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="L2647" class="LineNr">2647 </span>  ]
<span id="L2648" class="LineNr">2648 </span>  <span class="Comment"># cursor deletes to end of line</span>
<span id="L2649" class="LineNr">2649 </span>  screen-should-contain [
<span id="L2650" class="LineNr">2650 </span>   <span class="Constant"> .          .</span>
<span id="L2651" class="LineNr">2651 </span>   <span class="Constant"> .123       .</span>
<span id="L2652" class="LineNr">2652 </span>   <span class="Constant"> .4         .</span>
<span id="L2653" class="LineNr">2653 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2654" class="LineNr">2654 </span>   <span class="Constant"> .          .</span>
<span id="L2655" class="LineNr">2655 </span>  ]
<span id="L2656" class="LineNr">2656 </span>  check-trace-count-for-label<span class="Constant"> 9</span>, <span class="Constant">[print-character]</span>
<span id="L2657" class="LineNr">2657 </span>]
<span id="L2658" class="LineNr">2658 </span>
<span id="L2659" class="LineNr">2659 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-3 [
<span id="L2660" class="LineNr">2660 </span>  <span class="Constant">local-scope</span>
<span id="L2661" class="LineNr">2661 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2662" class="LineNr">2662 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2663" class="LineNr">2663 </span><span class="Constant">456]</span>
<span id="L2664" class="LineNr">2664 </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="L2665" class="LineNr">2665 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2666" class="LineNr">2666 </span>  $clear-trace
<span id="L2667" class="LineNr">2667 </span>  <span class="Comment"># start at end of line</span>
<span id="L2668" class="LineNr">2668 </span>  assume-console [
<span id="L2669" class="LineNr">2669 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
<span id="L2670" class="LineNr">2670 </span>    press ctrl-k
<span id="L2671" class="LineNr">2671 </span>  ]
<span id="L2672" class="LineNr">2672 </span>  run [
<span id="L2673" class="LineNr">2673 </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="L2674" class="LineNr">2674 </span>  ]
<span id="L2675" class="LineNr">2675 </span>  <span class="Comment"># cursor deletes just last character</span>
<span id="L2676" class="LineNr">2676 </span>  screen-should-contain [
<span id="L2677" class="LineNr">2677 </span>   <span class="Constant"> .          .</span>
<span id="L2678" class="LineNr">2678 </span>   <span class="Constant"> .12        .</span>
<span id="L2679" class="LineNr">2679 </span>   <span class="Constant"> .456       .</span>
<span id="L2680" class="LineNr">2680 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2681" class="LineNr">2681 </span>   <span class="Constant"> .          .</span>
<span id="L2682" class="LineNr">2682 </span>  ]
<span id="L2683" class="LineNr">2683 </span>  check-trace-count-for-label<span class="Constant"> 8</span>, <span class="Constant">[print-character]</span>
<span id="L2684" class="LineNr">2684 </span>]
<span id="L2685" class="LineNr">2685 </span>
<span id="L2686" class="LineNr">2686 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-4 [
<span id="L2687" class="LineNr">2687 </span>  <span class="Constant">local-scope</span>
<span id="L2688" class="LineNr">2688 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2689" class="LineNr">2689 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2690" class="LineNr">2690 </span><span class="Constant">456]</span>
<span id="L2691" class="LineNr">2691 </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="L2692" class="LineNr">2692 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2693" class="LineNr">2693 </span>  $clear-trace
<span id="L2694" class="LineNr">2694 </span>  <span class="Comment"># start past end of line</span>
<span id="L2695" class="LineNr">2695 </span>  assume-console [
<span id="L2696" class="LineNr">2696 </span>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span>
<span id="L2697" class="LineNr">2697 </span>    press ctrl-k
<span id="L2698" class="LineNr">2698 </span>  ]
<span id="L2699" class="LineNr">2699 </span>  run [
<span id="L2700" class="LineNr">2700 </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="L2701" class="LineNr">2701 </span>  ]
<span id="L2702" class="LineNr">2702 </span>  <span class="Comment"># cursor deletes nothing</span>
<span id="L2703" class="LineNr">2703 </span>  screen-should-contain [
<span id="L2704" class="LineNr">2704 </span>   <span class="Constant"> .          .</span>
<span id="L2705" class="LineNr">2705 </span>   <span class="Constant"> .123       .</span>
<span id="L2706" class="LineNr">2706 </span>   <span class="Constant"> .456       .</span>
<span id="L2707" class="LineNr">2707 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2708" class="LineNr">2708 </span>   <span class="Constant"> .          .</span>
<span id="L2709" class="LineNr">2709 </span>  ]
<span id="L2710" class="LineNr">2710 </span>  check-trace-count-for-label<span class="Constant"> 7</span>, <span class="Constant">[print-character]</span>
<span id="L2711" class="LineNr">2711 </span>]
<span id="L2712" class="LineNr">2712 </span>
<span id="L2713" class="LineNr">2713 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-5 [
<span id="L2714" class="LineNr">2714 </span>  <span class="Constant">local-scope</span>
<span id="L2715" class="LineNr">2715 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2716" class="LineNr">2716 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2717" class="LineNr">2717 </span><span class="Constant">456]</span>
<span id="L2718" class="LineNr">2718 </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="L2719" class="LineNr">2719 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2720" class="LineNr">2720 </span>  $clear-trace
<span id="L2721" class="LineNr">2721 </span>  <span class="Comment"># start at end of text</span>
<span id="L2722" class="LineNr">2722 </span>  assume-console [
<span id="L2723" class="LineNr">2723 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 2</span>
<span id="L2724" class="LineNr">2724 </span>    press ctrl-k
<span id="L2725" class="LineNr">2725 </span>  ]
<span id="L2726" class="LineNr">2726 </span>  run [
<span id="L2727" class="LineNr">2727 </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="L2728" class="LineNr">2728 </span>  ]
<span id="L2729" class="LineNr">2729 </span>  <span class="Comment"># cursor deletes just the final character</span>
<span id="L2730" class="LineNr">2730 </span>  screen-should-contain [
<span id="L2731" class="LineNr">2731 </span>   <span class="Constant"> .          .</span>
<span id="L2732" class="LineNr">2732 </span>   <span class="Constant"> .123       .</span>
<span id="L2733" class="LineNr">2733 </span>   <span class="Constant"> .45        .</span>
<span id="L2734" class="LineNr">2734 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2735" class="LineNr">2735 </span>   <span class="Constant"> .          .</span>
<span id="L2736" class="LineNr">2736 </span>  ]
<span id="L2737" class="LineNr">2737 </span>  check-trace-count-for-label<span class="Constant"> 8</span>, <span class="Constant">[print-character]</span>
<span id="L2738" class="LineNr">2738 </span>]
<span id="L2739" class="LineNr">2739 </span>
<span id="L2740" class="LineNr">2740 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-6 [
<span id="L2741" class="LineNr">2741 </span>  <span class="Constant">local-scope</span>
<span id="L2742" class="LineNr">2742 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2743" class="LineNr">2743 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[123</span>
<span id="L2744" class="LineNr">2744 </span><span class="Constant">456]</span>
<span id="L2745" class="LineNr">2745 </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="L2746" class="LineNr">2746 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2747" class="LineNr">2747 </span>  $clear-trace
<span id="L2748" class="LineNr">2748 </span>  <span class="Comment"># start past end of text</span>
<span id="L2749" class="LineNr">2749 </span>  assume-console [
<span id="L2750" class="LineNr">2750 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span>
<span id="L2751" class="LineNr">2751 </span>    press ctrl-k
<span id="L2752" class="LineNr">2752 </span>  ]
<span id="L2753" class="LineNr">2753 </span>  run [
<span id="L2754" class="LineNr">2754 </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="L2755" class="LineNr">2755 </span>  ]
<span id="L2756" class="LineNr">2756 </span>  <span class="Comment"># cursor deletes nothing</span>
<span id="L2757" class="LineNr">2757 </span>  screen-should-contain [
<span id="L2758" class="LineNr">2758 </span>   <span class="Constant"> .          .</span>
<span id="L2759" class="LineNr">2759 </span>   <span class="Constant"> .123       .</span>
<span id="L2760" class="LineNr">2760 </span>   <span class="Constant"> .456       .</span>
<span id="L2761" class="LineNr">2761 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2762" class="LineNr">2762 </span>   <span class="Constant"> .          .</span>
<span id="L2763" class="LineNr">2763 </span>  ]
<span id="L2764" class="LineNr">2764 </span>  <span class="Comment"># no prints necessary</span>
<span id="L2765" class="LineNr">2765 </span>  check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span>
<span id="L2766" class="LineNr">2766 </span>]
<span id="L2767" class="LineNr">2767 </span>
<span id="L2768" class="LineNr">2768 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-wrapped-line-with-ctrl-k [
<span id="L2769" class="LineNr">2769 </span>  <span class="Constant">local-scope</span>
<span id="L2770" class="LineNr">2770 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L2771" class="LineNr">2771 </span>  <span class="Comment"># create an editor with the first line wrapping to a second screen row</span>
<span id="L2772" class="LineNr">2772 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[1234</span>
<span id="L2773" class="LineNr">2773 </span><span class="Constant">567]</span>
<span id="L2774" class="LineNr">2774 </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="L2775" class="LineNr">2775 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2776" class="LineNr">2776 </span>  $clear-trace
<span id="L2777" class="LineNr">2777 </span>  <span class="Comment"># delete all of the first wrapped line</span>
<span id="L2778" class="LineNr">2778 </span>  assume-console [
<span id="L2779" class="LineNr">2779 </span>    press ctrl-k
<span id="L2780" class="LineNr">2780 </span>  ]
<span id="L2781" class="LineNr">2781 </span>  run [
<span id="L2782" class="LineNr">2782 </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="L2783" class="LineNr">2783 </span>  ]
<span id="L2784" class="LineNr">2784 </span>  <span class="Comment"># screen shows an empty unwrapped first line</span>
<span id="L2785" class="LineNr">2785 </span>  screen-should-contain [
<span id="L2786" class="LineNr">2786 </span>   <span class="Constant"> .          .</span>
<span id="L2787" class="LineNr">2787 </span>   <span class="Constant"> .          .</span>
<span id="L2788" class="LineNr">2788 </span>   <span class="Constant"> .567       .</span>
<span id="L2789" class="LineNr">2789 </span>   <span class="Constant"> .╌╌╌╌      .</span>
<span id="L2790" class="LineNr">2790 </span>   <span class="Constant"> .          .</span>
<span id="L2791" class="LineNr">2791 </span>  ]
<span id="L2792" class="LineNr">2792 </span>  <span class="Comment"># entire screen is refreshed</span>
<span id="L2793" class="LineNr">2793 </span>  check-trace-count-for-label<span class="Constant"> 16</span>, <span class="Constant">[print-character]</span>
<span id="L2794" class="LineNr">2794 </span>]
<span id="L2795" class="LineNr">2795 </span>
<span id="L2796" class="LineNr">2796 </span><span class="Comment"># scroll down if necessary</span>
<span id="L2797" class="LineNr">2797 </span>
<span id="L2798" class="LineNr">2798 </span><span class="muScenario">scenario</span> editor-can-scroll-down-using-arrow-keys [
<span id="L2799" class="LineNr">2799 </span>  <span class="Constant">local-scope</span>
<span id="L2800" class="LineNr">2800 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2801" class="LineNr">2801 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L2802" class="LineNr">2802 </span>  <span class="Comment"># initialize editor with &gt;3 lines</span>
<span id="L2803" class="LineNr">2803 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L2804" class="LineNr">2804 </span><span class="Constant">b</span>
<span id="L2805" class="LineNr">2805 </span><span class="Constant">c</span>
<span id="L2806" class="LineNr">2806 </span><span class="Constant">d]</span>
<span id="L2807" class="LineNr">2807 </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="L2808" class="LineNr">2808 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2809" class="LineNr">2809 </span>  screen-should-contain [
<span id="L2810" class="LineNr">2810 </span>   <span class="Constant"> .          .</span>
<span id="L2811" class="LineNr">2811 </span>   <span class="Constant"> .a         .</span>
<span id="L2812" class="LineNr">2812 </span>   <span class="Constant"> .b         .</span>
<span id="L2813" class="LineNr">2813 </span>   <span class="Constant"> .c         .</span>
<span id="L2814" class="LineNr">2814 </span>  ]
<span id="L2815" class="LineNr">2815 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
<span id="L2816" class="LineNr">2816 </span>  assume-console [
<span id="L2817" class="LineNr">2817 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L2818" class="LineNr">2818 </span>    press down-arrow
<span id="L2819" class="LineNr">2819 </span>  ]
<span id="L2820" class="LineNr">2820 </span>  run [
<span id="L2821" class="LineNr">2821 </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="L2822" class="LineNr">2822 </span>  ]
<span id="L2823" class="LineNr">2823 </span>  <span class="Comment"># screen slides by one line</span>
<span id="L2824" class="LineNr">2824 </span>  screen-should-contain [
<span id="L2825" class="LineNr">2825 </span>   <span class="Constant"> .          .</span>
<span id="L2826" class="LineNr">2826 </span>   <span class="Constant"> .b         .</span>
<span id="L2827" class="LineNr">2827 </span>   <span class="Constant"> .c         .</span>
<span id="L2828" class="LineNr">2828 </span>   <span class="Constant"> .d         .</span>
<span id="L2829" class="LineNr">2829 </span>  ]
<span id="L2830" class="LineNr">2830 </span>]
<span id="L2831" class="LineNr">2831 </span>
<span id="L2832" class="LineNr">2832 </span><span class="muRecipe">after</span> <span class="Constant">&lt;scroll-down&gt;</span> [
<span id="L2833" class="LineNr">2833 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[scroll down]</span>
<span id="L2834" class="LineNr">2834 </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="L2835" class="LineNr">2835 </span>  left:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">left:offset</span>
<span id="L2836" class="LineNr">2836 </span>  right:num <span class="Special">&lt;-</span> get *editor, <span class="Constant">right:offset</span>
<span id="L2837" class="LineNr">2837 </span>  max:num <span class="Special">&lt;-</span> subtract right, left
<span id="L2838" class="LineNr">2838 </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="L2839" class="LineNr">2839 </span>  top-of-screen <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2849'>before-start-of-next-line</a> top-of-screen, max
<span id="L2840" class="LineNr">2840 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
<span id="L2841" class="LineNr">2841 </span>  no-movement?:bool <span class="Special">&lt;-</span> equal old-top, top-of-screen
<span id="L2842" class="LineNr">2842 </span>  <span class="muControl">return-if</span> no-movement?, <span class="Constant">0/don't-render</span>
<span id="L2843" class="LineNr">2843 </span>]
<span id="L2844" class="LineNr">2844 </span>
<span id="L2845" class="LineNr">2845 </span><span class="Comment"># Takes a pointer into the doubly-linked list, scans ahead at most 'max'</span>
<span id="L2846" class="LineNr">2846 </span><span class="Comment"># positions until the next newline.</span>
<span id="L2847" class="LineNr">2847 </span><span class="Comment"># Returns original if no next newline.</span>
<span id="L2848" class="LineNr">2848 </span><span class="Comment"># Beware: never return null pointer.</span>
<span id="L2849" class="LineNr">2849 </span><span class="muRecipe">def</span> <a href='003-shortcuts.mu.html#L2849'>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="L2850" class="LineNr">2850 </span>  <span class="Constant">local-scope</span>
<span id="L2851" class="LineNr">2851 </span>  <span class="Constant">load-inputs</span>
<span id="L2852" class="LineNr">2852 </span>  count:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
<span id="L2853" class="LineNr">2853 </span>  curr:&amp;:<a href='../065duplex_list.mu.html#L3'>duplex-list</a>:char <span class="Special">&lt;-</span> copy original
<span id="L2854" class="LineNr">2854 </span>  <span class="Comment"># skip the initial newline if it exists</span>
<span id="L2855" class="LineNr">2855 </span>  <span class="Delimiter">{</span>
<span id="L2856" class="LineNr">2856 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L2857" class="LineNr">2857 </span>    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L2858" class="LineNr">2858 </span>    <span class="muControl">break-unless</span> at-newline?
<span id="L2859" class="LineNr">2859 </span>    curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> curr
<span id="L2860" class="LineNr">2860 </span>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
<span id="L2861" class="LineNr">2861 </span>  <span class="Delimiter">}</span>
<span id="L2862" class="LineNr">2862 </span>  <span class="Delimiter">{</span>
<span id="L2863" class="LineNr">2863 </span>    <span class="muControl">return-unless</span> curr, original
<span id="L2864" class="LineNr">2864 </span>    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
<span id="L2865" class="LineNr">2865 </span>    <span class="muControl">break-if</span> done?
<span id="L2866" class="LineNr">2866 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L2867" class="LineNr">2867 </span>    at-newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
<span id="L2868" class="LineNr">2868 </span>    <span class="muControl">break-if</span> at-newline?
<span id="L2869" class="LineNr">2869 </span>    curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> curr
<span id="L2870" class="LineNr">2870 </span>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
<span id="L2871" class="LineNr">2871 </span>   <span class="muControl"> loop</span>
<span id="L2872" class="LineNr">2872 </span>  <span class="Delimiter">}</span>
<span id="L2873" class="LineNr">2873 </span>  <span class="muControl">return-unless</span> curr, original
<span id="L2874" class="LineNr">2874 </span> <span class="muControl"> return</span> curr
<span id="L2875" class="LineNr">2875 </span>]
<span id="L2876" class="LineNr">2876 </span>
<span id="L2877" class="LineNr">2877 </span><span class="muScenario">scenario</span> editor-scrolls-down-past-wrapped-line-using-arrow-keys [
<span id="L2878" class="LineNr">2878 </span>  <span class="Constant">local-scope</span>
<span id="L2879" class="LineNr">2879 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2880" class="LineNr">2880 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L2881" class="LineNr">2881 </span>  <span class="Comment"># initialize editor with a long, wrapped line and more than a screen of</span>
<span id="L2882" class="LineNr">2882 </span>  <span class="Comment"># other lines</span>
<span id="L2883" class="LineNr">2883 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdef</span>
<span id="L2884" class="LineNr">2884 </span><span class="Constant">g</span>
<span id="L2885" class="LineNr">2885 </span><span class="Constant">h</span>
<span id="L2886" class="LineNr">2886 </span><span class="Constant">i]</span>
<span id="L2887" class="LineNr">2887 </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="L2888" class="LineNr">2888 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2889" class="LineNr">2889 </span>  screen-should-contain [
<span id="L2890" class="LineNr">2890 </span>   <span class="Constant"> .          .</span>
<span id="L2891" class="LineNr">2891 </span>   <span class="Constant"> .abcd↩     .</span>
<span id="L2892" class="LineNr">2892 </span>   <span class="Constant"> .ef        .</span>
<span id="L2893" class="LineNr">2893 </span>   <span class="Constant"> .g         .</span>
<span id="L2894" class="LineNr">2894 </span>  ]
<span id="L2895" class="LineNr">2895 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
<span id="L2896" class="LineNr">2896 </span>  assume-console [
<span id="L2897" class="LineNr">2897 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L2898" class="LineNr">2898 </span>    press down-arrow
<span id="L2899" class="LineNr">2899 </span>  ]
<span id="L2900" class="LineNr">2900 </span>  run [
<span id="L2901" class="LineNr">2901 </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="L2902" class="LineNr">2902 </span>  ]
<span id="L2903" class="LineNr">2903 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L2904" class="LineNr">2904 </span>  screen-should-contain [
<span id="L2905" class="LineNr">2905 </span>   <span class="Constant"> .          .</span>
<span id="L2906" class="LineNr">2906 </span>   <span class="Constant"> .ef        .</span>
<span id="L2907" class="LineNr">2907 </span>   <span class="Constant"> .g         .</span>
<span id="L2908" class="LineNr">2908 </span>   <span class="Constant"> .h         .</span>
<span id="L2909" class="LineNr">2909 </span>  ]
<span id="L2910" class="LineNr">2910 </span>]
<span id="L2911" class="LineNr">2911 </span>
<span id="L2912" class="LineNr">2912 </span><span class="muScenario">scenario</span> editor-scrolls-down-past-wrapped-line-using-arrow-keys-2 [
<span id="L2913" class="LineNr">2913 </span>  <span class="Constant">local-scope</span>
<span id="L2914" class="LineNr">2914 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2915" class="LineNr">2915 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L2916" class="LineNr">2916 </span>  <span class="Comment"># editor starts with a long line wrapping twice</span>
<span id="L2917" class="LineNr">2917 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abcdefghij</span>
<span id="L2918" class="LineNr">2918 </span><span class="Constant">k</span>
<span id="L2919" class="LineNr">2919 </span><span class="Constant">l</span>
<span id="L2920" class="LineNr">2920 </span><span class="Constant">m]</span>
<span id="L2921" class="LineNr">2921 </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="L2922" class="LineNr">2922 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
<span id="L2923" class="LineNr">2923 </span>  assume-console [
<span id="L2924" class="LineNr">2924 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L2925" class="LineNr">2925 </span>    press down-arrow
<span id="L2926" class="LineNr">2926 </span>  ]
<span id="L2927" class="LineNr">2927 </span>  run [
<span id="L2928" class="LineNr">2928 </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="L2929" class="LineNr">2929 </span>  ]
<span id="L2930" class="LineNr">2930 </span>  <span class="Comment"># screen shows partial wrapped line containing a wrap icon</span>
<span id="L2931" class="LineNr">2931 </span>  screen-should-contain [
<span id="L2932" class="LineNr">2932 </span>   <span class="Constant"> .          .</span>
<span id="L2933" class="LineNr">2933 </span>   <span class="Constant"> .efgh↩     .</span>
<span id="L2934" class="LineNr">2934 </span>   <span class="Constant"> .ij        .</span>
<span id="L2935" class="LineNr">2935 </span>   <span class="Constant"> .k         .</span>
<span id="L2936" class="LineNr">2936 </span>  ]
<span id="L2937" class="LineNr">2937 </span>  <span class="Comment"># scroll down again</span>
<span id="L2938" class="LineNr">2938 </span>  assume-console [
<span id="L2939" class="LineNr">2939 </span>    press down-arrow
<span id="L2940" class="LineNr">2940 </span>  ]
<span id="L2941" class="LineNr">2941 </span>  run [
<span id="L2942" class="LineNr">2942 </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="L2943" class="LineNr">2943 </span>  ]
<span id="L2944" class="LineNr">2944 </span>  <span class="Comment"># screen shows partial wrapped line</span>
<span id="L2945" class="LineNr">2945 </span>  screen-should-contain [
<span id="L2946" class="LineNr">2946 </span>   <span class="Constant"> .          .</span>
<span id="L2947" class="LineNr">2947 </span>   <span class="Constant"> .ij        .</span>
<span id="L2948" class="LineNr">2948 </span>   <span class="Constant"> .k         .</span>
<span id="L2949" class="LineNr">2949 </span>   <span class="Constant"> .l         .</span>
<span id="L2950" class="LineNr">2950 </span>  ]
<span id="L2951" class="LineNr">2951 </span>]
<span id="L2952" class="LineNr">2952 </span>
<span id="L2953" class="LineNr">2953 </span><span class="muScenario">scenario</span> editor-scrolls-down-when-line-wraps [
<span id="L2954" class="LineNr">2954 </span>  <span class="Constant">local-scope</span>
<span id="L2955" class="LineNr">2955 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2956" class="LineNr">2956 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L2957" class="LineNr">2957 </span>  <span class="Comment"># editor contains a long line in the third line</span>
<span id="L2958" class="LineNr">2958 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L2959" class="LineNr">2959 </span><span class="Constant">b</span>
<span id="L2960" class="LineNr">2960 </span><span class="Constant">cdef]</span>
<span id="L2961" class="LineNr">2961 </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="L2962" class="LineNr">2962 </span>  <span class="Comment"># position cursor at end, type a character</span>
<span id="L2963" class="LineNr">2963 </span>  assume-console [
<span id="L2964" class="LineNr">2964 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 4</span>
<span id="L2965" class="LineNr">2965 </span>    type <span class="Constant">[g]</span>
<span id="L2966" class="LineNr">2966 </span>  ]
<span id="L2967" class="LineNr">2967 </span>  run [
<span id="L2968" class="LineNr">2968 </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="L2969" class="LineNr">2969 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L2970" class="LineNr">2970 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L2971" class="LineNr">2971 </span>  ]
<span id="L2972" class="LineNr">2972 </span>  <span class="Comment"># screen scrolls</span>
<span id="L2973" class="LineNr">2973 </span>  screen-should-contain [
<span id="L2974" class="LineNr">2974 </span>   <span class="Constant"> .     .</span>
<span id="L2975" class="LineNr">2975 </span>   <span class="Constant"> .b    .</span>
<span id="L2976" class="LineNr">2976 </span><span class="Constant">    .cdef↩.</span>
<span id="L2977" class="LineNr">2977 </span>   <span class="Constant"> .g    .</span>
<span id="L2978" class="LineNr">2978 </span>  ]
<span id="L2979" class="LineNr">2979 </span>  memory-should-contain [
<span id="L2980" class="LineNr">2980 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L2981" class="LineNr">2981 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L2982" class="LineNr">2982 </span>  ]
<span id="L2983" class="LineNr">2983 </span>]
<span id="L2984" class="LineNr">2984 </span>
<span id="L2985" class="LineNr">2985 </span><span class="muScenario">scenario</span> editor-stops-scrolling-once-bottom-is-visible [
<span id="L2986" class="LineNr">2986 </span>  <span class="Constant">local-scope</span>
<span id="L2987" class="LineNr">2987 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L2988" class="LineNr">2988 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L2989" class="LineNr">2989 </span>  <span class="Comment"># initialize editor with 2 lines</span>
<span id="L2990" class="LineNr">2990 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L2991" class="LineNr">2991 </span><span class="Constant">b]</span>
<span id="L2992" class="LineNr">2992 </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="L2993" class="LineNr">2993 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L2994" class="LineNr">2994 </span>  screen-should-contain [
<span id="L2995" class="LineNr">2995 </span>   <span class="Constant"> .          .</span>
<span id="L2996" class="LineNr">2996 </span>   <span class="Constant"> .a         .</span>
<span id="L2997" class="LineNr">2997 </span>   <span class="Constant"> .b         .</span>
<span id="L2998" class="LineNr">2998 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L2999" class="LineNr">2999 </span>  ]
<span id="L3000" class="LineNr">3000 </span>  <span class="Comment"># position cursor at last line, then try to move further down</span>
<span id="L3001" class="LineNr">3001 </span>  assume-console [
<span id="L3002" class="LineNr">3002 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L3003" class="LineNr">3003 </span>    press down-arrow
<span id="L3004" class="LineNr">3004 </span>  ]
<span id="L3005" class="LineNr">3005 </span>  run [
<span id="L3006" class="LineNr">3006 </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="L3007" class="LineNr">3007 </span>  ]
<span id="L3008" class="LineNr">3008 </span>  <span class="Comment"># no change since the bottom border was already visible</span>
<span id="L3009" class="LineNr">3009 </span>  screen-should-contain [
<span id="L3010" class="LineNr">3010 </span>   <span class="Constant"> .          .</span>
<span id="L3011" class="LineNr">3011 </span>   <span class="Constant"> .a         .</span>
<span id="L3012" class="LineNr">3012 </span>   <span class="Constant"> .b         .</span>
<span id="L3013" class="LineNr">3013 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L3014" class="LineNr">3014 </span>  ]
<span id="L3015" class="LineNr">3015 </span>]
<span id="L3016" class="LineNr">3016 </span>
<span id="L3017" class="LineNr">3017 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-newline [
<span id="L3018" class="LineNr">3018 </span>  <span class="Constant">local-scope</span>
<span id="L3019" class="LineNr">3019 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L3020" class="LineNr">3020 </span>  <span class="Comment"># position cursor after last line and type newline</span>
<span id="L3021" class="LineNr">3021 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3022" class="LineNr">3022 </span><span class="Constant">b</span>
<span id="L3023" class="LineNr">3023 </span><span class="Constant">c]</span>
<span id="L3024" class="LineNr">3024 </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="L3025" class="LineNr">3025 </span>  assume-console [
<span id="L3026" class="LineNr">3026 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 4</span>
<span id="L3027" class="LineNr">3027 </span>    type [
<span id="L3028" class="LineNr">3028 </span>]
<span id="L3029" class="LineNr">3029 </span>  ]
<span id="L3030" class="LineNr">3030 </span>  run [
<span id="L3031" class="LineNr">3031 </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="L3032" class="LineNr">3032 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L3033" class="LineNr">3033 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L3034" class="LineNr">3034 </span>  ]
<span id="L3035" class="LineNr">3035 </span>  <span class="Comment"># screen scrolls</span>
<span id="L3036" class="LineNr">3036 </span>  screen-should-contain [
<span id="L3037" class="LineNr">3037 </span>   <span class="Constant"> .     .</span>
<span id="L3038" class="LineNr">3038 </span>   <span class="Constant"> .b    .</span>
<span id="L3039" class="LineNr">3039 </span>   <span class="Constant"> .c    .</span>
<span id="L3040" class="LineNr">3040 </span>   <span class="Constant"> .     .</span>
<span id="L3041" class="LineNr">3041 </span>  ]
<span id="L3042" class="LineNr">3042 </span>  memory-should-contain [
<span id="L3043" class="LineNr">3043 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L3044" class="LineNr">3044 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L3045" class="LineNr">3045 </span>  ]
<span id="L3046" class="LineNr">3046 </span>]
<span id="L3047" class="LineNr">3047 </span>
<span id="L3048" class="LineNr">3048 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-right-arrow [
<span id="L3049" class="LineNr">3049 </span>  <span class="Constant">local-scope</span>
<span id="L3050" class="LineNr">3050 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3051" class="LineNr">3051 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L3052" class="LineNr">3052 </span>  <span class="Comment"># editor contains a wrapped line</span>
<span id="L3053" class="LineNr">3053 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3054" class="LineNr">3054 </span><span class="Constant">b</span>
<span id="L3055" class="LineNr">3055 </span><span class="Constant">cdefgh]</span>
<span id="L3056" class="LineNr">3056 </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="L3057" class="LineNr">3057 </span>  <span class="Comment"># position cursor at end of screen and try to move right</span>
<span id="L3058" class="LineNr">3058 </span>  assume-console [
<span id="L3059" class="LineNr">3059 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
<span id="L3060" class="LineNr">3060 </span>    press right-arrow
<span id="L3061" class="LineNr">3061 </span>  ]
<span id="L3062" class="LineNr">3062 </span>  run [
<span id="L3063" class="LineNr">3063 </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="L3064" class="LineNr">3064 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L3065" class="LineNr">3065 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L3066" class="LineNr">3066 </span>  ]
<span id="L3067" class="LineNr">3067 </span>  <span class="Comment"># screen scrolls</span>
<span id="L3068" class="LineNr">3068 </span>  screen-should-contain [
<span id="L3069" class="LineNr">3069 </span>   <span class="Constant"> .     .</span>
<span id="L3070" class="LineNr">3070 </span>   <span class="Constant"> .b    .</span>
<span id="L3071" class="LineNr">3071 </span><span class="Constant">    .cdef↩.</span>
<span id="L3072" class="LineNr">3072 </span>   <span class="Constant"> .gh   .</span>
<span id="L3073" class="LineNr">3073 </span>  ]
<span id="L3074" class="LineNr">3074 </span>  memory-should-contain [
<span id="L3075" class="LineNr">3075 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L3076" class="LineNr">3076 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L3077" class="LineNr">3077 </span>  ]
<span id="L3078" class="LineNr">3078 </span>]
<span id="L3079" class="LineNr">3079 </span>
<span id="L3080" class="LineNr">3080 </span><span class="muScenario">scenario</span> editor-scrolls-down-on-right-arrow-2 [
<span id="L3081" class="LineNr">3081 </span>  <span class="Constant">local-scope</span>
<span id="L3082" class="LineNr">3082 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3083" class="LineNr">3083 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">4/height</span>
<span id="L3084" class="LineNr">3084 </span>  <span class="Comment"># editor contains more lines than can fit on screen</span>
<span id="L3085" class="LineNr">3085 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3086" class="LineNr">3086 </span><span class="Constant">b</span>
<span id="L3087" class="LineNr">3087 </span><span class="Constant">c</span>
<span id="L3088" class="LineNr">3088 </span><span class="Constant">d]</span>
<span id="L3089" class="LineNr">3089 </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="L3090" class="LineNr">3090 </span>  <span class="Comment"># position cursor at end of screen and try to move right</span>
<span id="L3091" class="LineNr">3091 </span>  assume-console [
<span id="L3092" class="LineNr">3092 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span>
<span id="L3093" class="LineNr">3093 </span>    press right-arrow
<span id="L3094" class="LineNr">3094 </span>  ]
<span id="L3095" class="LineNr">3095 </span>  run [
<span id="L3096" class="LineNr">3096 </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="L3097" class="LineNr">3097 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L3098" class="LineNr">3098 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L3099" class="LineNr">3099 </span>  ]
<span id="L3100" class="LineNr">3100 </span>  <span class="Comment"># screen scrolls</span>
<span id="L3101" class="LineNr">3101 </span>  screen-should-contain [
<span id="L3102" class="LineNr">3102 </span>   <span class="Constant"> .     .</span>
<span id="L3103" class="LineNr">3103 </span>   <span class="Constant"> .b    .</span>
<span id="L3104" class="LineNr">3104 </span>   <span class="Constant"> .c    .</span>
<span id="L3105" class="LineNr">3105 </span>   <span class="Constant"> .d    .</span>
<span id="L3106" class="LineNr">3106 </span>  ]
<span id="L3107" class="LineNr">3107 </span>  memory-should-contain [
<span id="L3108" class="LineNr">3108 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 3</span>
<span id="L3109" class="LineNr">3109 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L3110" class="LineNr">3110 </span>  ]
<span id="L3111" class="LineNr">3111 </span>]
<span id="L3112" class="LineNr">3112 </span>
<span id="L3113" class="LineNr">3113 </span><span class="muScenario">scenario</span> editor-scrolls-at-end-on-down-arrow [
<span id="L3114" class="LineNr">3114 </span>  <span class="Constant">local-scope</span>
<span id="L3115" class="LineNr">3115 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
<span id="L3116" class="LineNr">3116 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[abc</span>
<span id="L3117" class="LineNr">3117 </span><span class="Constant">de]</span>
<span id="L3118" class="LineNr">3118 </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="L3119" class="LineNr">3119 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3120" class="LineNr">3120 </span>  $clear-trace
<span id="L3121" class="LineNr">3121 </span>  <span class="Comment"># try to move down past end of text</span>
<span id="L3122" class="LineNr">3122 </span>  assume-console [
<span id="L3123" class="LineNr">3123 </span>    left-click<span class="Constant"> 2</span>,<span class="Constant"> 0</span>
<span id="L3124" class="LineNr">3124 </span>    press down-arrow
<span id="L3125" class="LineNr">3125 </span>  ]
<span id="L3126" class="LineNr">3126 </span>  run [
<span id="L3127" class="LineNr">3127 </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="L3128" class="LineNr">3128 </span>    3:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-row:offset</span>
<span id="L3129" class="LineNr">3129 </span>    4:num/<span class="Special">raw</span> <span class="Special">&lt;-</span> get *e, <span class="Constant">cursor-column:offset</span>
<span id="L3130" class="LineNr">3130 </span>  ]
<span id="L3131" class="LineNr">3131 </span>  <span class="Comment"># no change</span>
<span id="L3132" class="LineNr">3132 </span>  memory-should-contain [
<span id="L3133" class="LineNr">3133 </span>   <span class="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 2</span>
<span id="L3134" class="LineNr">3134 </span>   <span class="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 0</span>
<span id="L3135" class="LineNr">3135 </span>  ]
<span id="L3136" class="LineNr">3136 </span>]
<span id="L3137" class="LineNr">3137 </span>
<span id="L3138" class="LineNr">3138 </span><span class="muScenario">scenario</span> editor-combines-page-and-line-scroll [
<span id="L3139" class="LineNr">3139 </span>  <span class="Constant">local-scope</span>
<span id="L3140" class="LineNr">3140 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3141" class="LineNr">3141 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3142" class="LineNr">3142 </span>  <span class="Comment"># initialize editor with a few pages of lines</span>
<span id="L3143" class="LineNr">3143 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3144" class="LineNr">3144 </span><span class="Constant">b</span>
<span id="L3145" class="LineNr">3145 </span><span class="Constant">c</span>
<span id="L3146" class="LineNr">3146 </span><span class="Constant">d</span>
<span id="L3147" class="LineNr">3147 </span><span class="Constant">e</span>
<span id="L3148" class="LineNr">3148 </span><span class="Constant">f</span>
<span id="L3149" class="LineNr">3149 </span><span class="Constant">g]</span>
<span id="L3150" class="LineNr">3150 </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="L3151" class="LineNr">3151 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3152" class="LineNr">3152 </span>  <span class="Comment"># scroll down one page and one line</span>
<span id="L3153" class="LineNr">3153 </span>  assume-console [
<span id="L3154" class="LineNr">3154 </span>    press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3155" class="LineNr">3155 </span>    left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span>
<span id="L3156" class="LineNr">3156 </span>    press down-arrow
<span id="L3157" class="LineNr">3157 </span>  ]
<span id="L3158" class="LineNr">3158 </span>  run [
<span id="L3159" class="LineNr">3159 </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="L3160" class="LineNr">3160 </span>  ]
<span id="L3161" class="LineNr">3161 </span>  <span class="Comment"># screen scrolls down 3 lines</span>
<span id="L3162" class="LineNr">3162 </span>  screen-should-contain [
<span id="L3163" class="LineNr">3163 </span>   <span class="Constant"> .          .</span>
<span id="L3164" class="LineNr">3164 </span>   <span class="Constant"> .d         .</span>
<span id="L3165" class="LineNr">3165 </span>   <span class="Constant"> .e         .</span>
<span id="L3166" class="LineNr">3166 </span>   <span class="Constant"> .f         .</span>
<span id="L3167" class="LineNr">3167 </span>  ]
<span id="L3168" class="LineNr">3168 </span>]
<span id="L3169" class="LineNr">3169 </span>
<span id="L3170" class="LineNr">3170 </span><span class="Comment"># scroll up if necessary</span>
<span id="L3171" class="LineNr">3171 </span>
<span id="L3172" class="LineNr">3172 </span><span class="muScenario">scenario</span> editor-can-scroll-up-using-arrow-keys [
<span id="L3173" class="LineNr">3173 </span>  <span class="Constant">local-scope</span>
<span id="L3174" class="LineNr">3174 </span>  <span class="Comment"># screen has 1 line for menu + 3 lines</span>
<span id="L3175" class="LineNr">3175 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">4/height</span>
<span id="L3176" class="LineNr">3176 </span>  <span class="Comment"># initialize editor with &gt;3 lines</span>
<span id="L3177" class="LineNr">3177 </span>  s:text <span class="Special">&lt;-</span> new <span class="Constant">[a</span>
<span id="L3178" class="LineNr">3178 </span><span class="Constant">b</span>
<span id="L3179" class="LineNr">3179 </span><span class="Constant">c</span>
<span id="L3180" class="LineNr">3180 </span><span class="Constant">d]</span>
<span id="L3181" class="LineNr">3181 </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="L3182" class="LineNr">3182 </span>  <a href='002-typing.mu.html#L265'>editor-render</a> <a href='../081print.mu.html#L16'>screen</a>, e
<span id="L3183" class="LineNr">3183 </span>  screen-should-contain [
<span id="L3184" class="LineNr">3184 </span>   <span class="Constant"> .          .</span>
<span id="L3185" class="LineNr">3185 </span>   <span class="Constant"> .a         .</span>
<span id="L3186" class="LineNr">3186 </span>   <span class="Constant"> .b         .</span>
<span id="L3187" class="LineNr">3187 </span>   <span class="Constant"> .c         .</span>
<span id="L3188" class="LineNr">3188 </span>  ]
<span id="L3189" class="LineNr">3189 </span>  <span class="Comment"># position cursor at top of second page, then try to move up</span>
<span id="L3190" class="LineNr">3190 </span>  assume-console [
<span id="L3191" class="LineNr">3191 </span>    press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3192" class="LineNr">3192 </span>    press up-arrow
<span id="L3193" class="LineNr">3193 </span>  ]
<span id="L3194" class="LineNr">3194 </span>  run [
<span id="L3195" class="LineNr">3195 </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="L3196" class="LineNr">3196 </span>  ]
<span id="L3197" class="LineNr">3197 </span>  <span class="Comment"># screen slides by one line</span>
<span id="L3198" class="LineNr">3198 </span>  screen-should-contain [
<span id="L3199" class="LineNr">3199 </span>   <span class="Constant"> .          .</span>
<span id="L3200" class="LineNr">3200 </span>   <span class="Constant"> .b         .</span>
<span id="L3201" class="LineNr">3201 </span>   <span class="Constant"> .c         .</span>
<span id="L3202" class="LineNr">3202 </span>   <span class="Constant"> .d         .</span>
<span id="L3203" class="LineNr">3203 </span>  ]
<span id="L3204" class="LineNr">3204 </span>]
<span id="L3205" class="LineNr">3205 </span>
<span id="L3206" class="LineNr">3206 </span><span class="muRecipe">after</span> <span class="Constant">&lt;scroll-up&gt;</span> [
<span id="L3207" class="LineNr">3207 </span>  trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[scroll up]</span>
<span id="L3208" class="LineNr">3208 </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="L3209" class="LineNr">3209 </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="L3210" class="LineNr">3210 </span>  top-of-screen <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L1067'>before-previous-screen-line</a> top-of-screen, editor
<span id="L3211" class="LineNr">3211 </span>  *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen
<span id="L3212" class="LineNr">3212 </span>  no-movement?:bool <span class="Special">&lt;-</span> equal old-top, top-of-screen
<span id="L3213" class="LineNr">3213 </span>  <span class="muControl">return-if</span> no-movement?, <span class="Constant">0/don't-render</span>
<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="Constant"> .          .</span>
<span id="L3230" class="LineNr">3230 </span>   <span class="Constant"> .abcd↩     .</span>
<span id="L3231" class="LineNr">3231 </span>   <span class="Constant"> .ef        .</span>
<span id="L3232" class="LineNr">3232 </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>    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>    <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="Constant"> .          .</span>
<span id="L3243" class="LineNr">3243 </span>   <span class="Constant"> .g         .</span>
<span id="L3244" class="LineNr">3244 </span>   <span class="Constant"> .h         .</span>
<span id="L3245" class="LineNr">3245 </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>    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>    <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="Constant"> .          .</span>
<span id="L3257" class="LineNr">3257 </span>   <span class="Constant"> .ef        .</span>
<span id="L3258" class="LineNr">3258 </span>   <span class="Constant"> .g         .</span>
<span id="L3259" class="LineNr">3259 </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>    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>    <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="Constant"> .          .</span>
<span id="L3283" class="LineNr">3283 </span>   <span class="Constant"> .k         .</span>
<span id="L3284" class="LineNr">3284 </span>   <span class="Constant"> .l         .</span>
<span id="L3285" class="LineNr">3285 </span>   <span class="Constant"> .m         .</span>
<span id="L3286" class="LineNr">3286 </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>    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>    <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="Constant"> .          .</span>
<span id="L3298" class="LineNr">3298 </span>   <span class="Constant"> .ij        .</span>
<span id="L3299" class="LineNr">3299 </span>   <span class="Constant"> .k         .</span>
<span id="L3300" class="LineNr">3300 </span>   <span class="Constant"> .l         .</span>
<span id="L3301" class="LineNr">3301 </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>    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>    <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="Constant"> .          .</span>
<span id="L3313" class="LineNr">3313 </span>   <span class="Constant"> .efgh↩     .</span>
<span id="L3314" class="LineNr">3314 </span>   <span class="Constant"> .ij        .</span>
<span id="L3315" class="LineNr">3315 </span>   <span class="Constant"> .k         .</span>
<span id="L3316" class="LineNr">3316 </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>    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>    <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="Constant"> .          .</span>
<span id="L3328" class="LineNr">3328 </span>   <span class="Constant"> .abcd↩     .</span>
<span id="L3329" class="LineNr">3329 </span>   <span class="Constant"> .efgh↩     .</span>
<span id="L3330" class="LineNr">3330 </span>   <span class="Constant"> .ij        .</span>
<span id="L3331" class="LineNr">3331 </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="Constant"> .          .</span>
<span id="L3351" class="LineNr">3351 </span>   <span class="Constant"> .abcde↩    .</span>
<span id="L3352" class="LineNr">3352 </span>   <span class="Constant"> .f         .</span>
<span id="L3353" class="LineNr">3353 </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>    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>    <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="Constant"> .          .</span>
<span id="L3364" class="LineNr">3364 </span>   <span class="Constant"> .g         .</span>
<span id="L3365" class="LineNr">3365 </span>   <span class="Constant"> .h         .</span>
<span id="L3366" class="LineNr">3366 </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>    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>    <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="Constant"> .          .</span>
<span id="L3378" class="LineNr">3378 </span>   <span class="Constant"> .f         .</span>
<span id="L3379" class="LineNr">3379 </span>   <span class="Constant"> .g         .</span>
<span id="L3380" class="LineNr">3380 </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>    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>    <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="Constant"> .          .</span>
<span id="L3405" class="LineNr">3405 </span>   <span class="Constant"> .          .</span>
<span id="L3406" class="LineNr">3406 </span>   <span class="Constant"> .c         .</span>
<span id="L3407" class="LineNr">3407 </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>    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>    <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="Constant"> .          .</span>
<span id="L3417" class="LineNr">3417 </span>   <span class="Constant"> .d         .</span>
<span id="L3418" class="LineNr">3418 </span>   <span class="Constant"> .e         .</span>
<span id="L3419" class="LineNr">3419 </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>    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>    <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="Constant"> .          .</span>
<span id="L3429" class="LineNr">3429 </span>   <span class="Constant"> .          .</span>
<span id="L3430" class="LineNr">3430 </span>   <span class="Constant"> .c         .</span>
<span id="L3431" class="LineNr">3431 </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>    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>    <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="Constant"> .     .</span>
<span id="L3456" class="LineNr">3456 </span>   <span class="Constant"> .c    .</span>
<span id="L3457" class="LineNr">3457 </span>   <span class="Constant"> .d    .</span>
<span id="L3458" class="LineNr">3458 </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>    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>    <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>    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>    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="Constant"> .     .</span>
<span id="L3472" class="LineNr">3472 </span>   <span class="Constant"> .b    .</span>
<span id="L3473" class="LineNr">3473 </span>   <span class="Constant"> .c    .</span>
<span id="L3474" class="LineNr">3474 </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="Constant"> 3</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L3478" class="LineNr">3478 </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="Constant"> .          .</span>
<span id="L3495" class="LineNr">3495 </span>   <span class="Constant"> .a         .</span>
<span id="L3496" class="LineNr">3496 </span>   <span class="Constant"> .b         .</span>
<span id="L3497" class="LineNr">3497 </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>    press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3503" class="LineNr">3503 </span>    press up-arrow
<span id="L3504" class="LineNr">3504 </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>    <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="Constant"> .          .</span>
<span id="L3512" class="LineNr">3512 </span>   <span class="Constant"> .a         .</span>
<span id="L3513" class="LineNr">3513 </span>   <span class="Constant"> .b         .</span>
<span id="L3514" class="LineNr">3514 </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>    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>    <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="Constant"> .          .</span>
<span id="L3526" class="LineNr">3526 </span>   <span class="Constant"> .a         .</span>
<span id="L3527" class="LineNr">3527 </span>   <span class="Constant"> .b         .</span>
<span id="L3528" class="LineNr">3528 </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="Constant"> .          .</span>
<span id="L3545" class="LineNr">3545 </span>   <span class="Constant"> .a         .</span>
<span id="L3546" class="LineNr">3546 </span>   <span class="Constant"> .b         .</span>
<span id="L3547" class="LineNr">3547 </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>    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>    <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="Constant"> .          .</span>
<span id="L3559" class="LineNr">3559 </span>   <span class="Constant"> .c         .</span>
<span id="L3560" class="LineNr">3560 </span>   <span class="Constant"> .d         .</span>
<span id="L3561" class="LineNr">3561 </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>    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="muControl">break-unless</span> page-down?
<span id="L3569" class="LineNr">3569 </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">    &lt;begin-move-cursor&gt;</span>
<span id="L3571" class="LineNr">3571 </span>    <a href='003-shortcuts.mu.html#L3597'>page-down</a> editor
<span id="L3572" class="LineNr">3572 </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">    &lt;end-move-cursor&gt;</span>
<span id="L3574" class="LineNr">3574 </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>    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
<span id="L3576" class="LineNr">3576 </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>    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="muControl">break-unless</span> page-down?
<span id="L3584" class="LineNr">3584 </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">    &lt;begin-move-cursor&gt;</span>
<span id="L3586" class="LineNr">3586 </span>    <a href='003-shortcuts.mu.html#L3597'>page-down</a> editor
<span id="L3587" class="LineNr">3587 </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">    &lt;end-move-cursor&gt;</span>
<span id="L3589" class="LineNr">3589 </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>    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
<span id="L3591" class="LineNr">3591 </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-inputs</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#L32'>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>    <a href='../065duplex_list.mu.html#L572'>last</a>:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
<span id="L3610" class="LineNr">3610 </span>    newline?:bool <span class="Special">&lt;-</span> equal <a href='../065duplex_list.mu.html#L572'>last</a>, <span class="Constant">10/newline</span>
<span id="L3611" class="LineNr">3611 </span>    <span class="muControl">break-unless</span> newline?:bool
<span id="L3612" class="LineNr">3612 </span>    before-cursor <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L32'>prev</a> before-cursor
<span id="L3613" class="LineNr">3613 </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-inputs</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>    at-start-of-text?:bool <span class="Special">&lt;-</span> equal before-cursor, init
<span id="L3635" class="LineNr">3635 </span>    <span class="muControl">break-if</span> at-start-of-text?
<span id="L3636" class="LineNr">3636 </span>    <a href='../065duplex_list.mu.html#L32'>prev</a>:char <span class="Special">&lt;-</span> get *before-cursor, <span class="Constant">value:offset</span>
<span id="L3637" class="LineNr">3637 </span>    at-start-of-line?:bool <span class="Special">&lt;-</span> equal <a href='../065duplex_list.mu.html#L32'>prev</a>, <span class="Constant">10/newline</span>
<span id="L3638" class="LineNr">3638 </span>    <span class="muControl">break-if</span> at-start-of-line?
<span id="L3639" class="LineNr">3639 </span>    before-cursor <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L32'>prev</a> before-cursor
<span id="L3640" class="LineNr">3640 </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>    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="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="Constant"> .          .</span>
<span id="L3655" class="LineNr">3655 </span>   <span class="Constant"> .a         .</span>
<span id="L3656" class="LineNr">3656 </span>   <span class="Constant"> .b         .</span>
<span id="L3657" class="LineNr">3657 </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>    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>    <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="Constant"> .          .</span>
<span id="L3669" class="LineNr">3669 </span>   <span class="Constant"> .a         .</span>
<span id="L3670" class="LineNr">3670 </span>   <span class="Constant"> .b         .</span>
<span id="L3671" class="LineNr">3671 </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="Constant"> .          .</span>
<span id="L3689" class="LineNr">3689 </span>   <span class="Constant"> .a         .</span>
<span id="L3690" class="LineNr">3690 </span>   <span class="Constant"> .b         .</span>
<span id="L3691" class="LineNr">3691 </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>    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>    <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="Constant"> .          .</span>
<span id="L3703" class="LineNr">3703 </span>   <span class="Constant"> .cde↩      .</span>
<span id="L3704" class="LineNr">3704 </span>   <span class="Constant"> .fgh       .</span>
<span id="L3705" class="LineNr">3705 </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="Constant"> .          .</span>
<span id="L3722" class="LineNr">3722 </span>   <span class="Constant"> .a         .</span>
<span id="L3723" class="LineNr">3723 </span>   <span class="Constant"> .bcd↩      .</span>
<span id="L3724" class="LineNr">3724 </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>    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>    <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="Constant"> .          .</span>
<span id="L3736" class="LineNr">3736 </span>   <span class="Constant"> .bcd↩      .</span>
<span id="L3737" class="LineNr">3737 </span>   <span class="Constant"> .efg↩      .</span>
<span id="L3738" class="LineNr">3738 </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="Constant"> .          .</span>
<span id="L3755" class="LineNr">3755 </span>   <span class="Constant"> .a         .</span>
<span id="L3756" class="LineNr">3756 </span>   <span class="Constant"> .b         .</span>
<span id="L3757" class="LineNr">3757 </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>    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>    <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="Constant"> .          .</span>
<span id="L3769" class="LineNr">3769 </span>   <span class="Constant"> .c         .</span>
<span id="L3770" class="LineNr">3770 </span>   <span class="Constant"> .d         .</span>
<span id="L3771" class="LineNr">3771 </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>    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>    <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="Constant"> .          .</span>
<span id="L3783" class="LineNr">3783 </span>   <span class="Constant"> .a         .</span>
<span id="L3784" class="LineNr">3784 </span>   <span class="Constant"> .b         .</span>
<span id="L3785" class="LineNr">3785 </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>    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="muControl">break-unless</span> page-up?
<span id="L3793" class="LineNr">3793 </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">    &lt;begin-move-cursor&gt;</span>
<span id="L3795" class="LineNr">3795 </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>    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">    &lt;end-move-cursor&gt;</span>
<span id="L3798" class="LineNr">3798 </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>    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
<span id="L3800" class="LineNr">3800 </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>    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="muControl">break-unless</span> page-up?
<span id="L3808" class="LineNr">3808 </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">    &lt;begin-move-cursor&gt;</span>
<span id="L3810" class="LineNr">3810 </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>    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">    &lt;end-move-cursor&gt;</span>
<span id="L3813" class="LineNr">3813 </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>    movement?:bool <span class="Special">&lt;-</span> not-equal top-of-screen, old-top
<span id="L3815" class="LineNr">3815 </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="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-inputs</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>    done?:bool <span class="Special">&lt;-</span> greater-or-equal count, max
<span id="L3828" class="LineNr">3828 </span>    <span class="muControl">break-if</span> done?
<span id="L3829" class="LineNr">3829 </span>    <a href='../065duplex_list.mu.html#L32'>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#L1067'>before-previous-screen-line</a> top-of-screen, editor
<span id="L3830" class="LineNr">3830 </span>    <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L32'>prev</a>
<span id="L3831" class="LineNr">3831 </span>    top-of-screen <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L32'>prev</a>
<span id="L3832" class="LineNr">3832 </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>    count <span class="Special">&lt;-</span> add count,<span class="Constant"> 1</span>
<span id="L3834" class="LineNr">3834 </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="Constant"> .          .</span>
<span id="L3855" class="LineNr">3855 </span>   <span class="Constant"> .a         .</span>
<span id="L3856" class="LineNr">3856 </span>   <span class="Constant"> .b         .</span>
<span id="L3857" class="LineNr">3857 </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>    press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3862" class="LineNr">3862 </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>    <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="Constant"> .          .</span>
<span id="L3870" class="LineNr">3870 </span>   <span class="Constant"> .e         .</span>
<span id="L3871" class="LineNr">3871 </span>   <span class="Constant"> .f         .</span>
<span id="L3872" class="LineNr">3872 </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>    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>    <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="Constant"> .          .</span>
<span id="L3884" class="LineNr">3884 </span>   <span class="Constant"> .c         .</span>
<span id="L3885" class="LineNr">3885 </span>   <span class="Constant"> .d         .</span>
<span id="L3886" class="LineNr">3886 </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>    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>    <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="Constant"> .          .</span>
<span id="L3898" class="LineNr">3898 </span>   <span class="Constant"> .a         .</span>
<span id="L3899" class="LineNr">3899 </span>   <span class="Constant"> .b         .</span>
<span id="L3900" class="LineNr">3900 </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="Constant"> .          .</span>
<span id="L3925" class="LineNr">3925 </span>   <span class="Constant"> .a         .</span>
<span id="L3926" class="LineNr">3926 </span>   <span class="Constant"> .b         .</span>
<span id="L3927" class="LineNr">3927 </span>   <span class="Constant"> .cde↩      .</span>
<span id="L3928" class="LineNr">3928 </span>   <span class="Constant"> .fgh       .</span>
<span id="L3929" class="LineNr">3929 </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>    press <a href='003-shortcuts.mu.html#L3597'>page-down</a>
<span id="L3934" class="LineNr">3934 </span>    left-click<span class="Constant"> 5</span>,<span class="Constant"> 0</span>
<span id="L3935" class="LineNr">3935 </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>    <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="Constant"> .          .</span>
<span id="L3943" class="LineNr">3943 </span>   <span class="Constant"> .j         .</span>
<span id="L3944" class="LineNr">3944 </span>   <span class="Constant"> .k         .</span>
<span id="L3945" class="LineNr">3945 </span>   <span class="Constant"> .l         .</span>
<span id="L3946" class="LineNr">3946 </span>   <span class="Constant"> .m         .</span>
<span id="L3947" class="LineNr">3947 </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>    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>    <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="Constant"> .          .</span>
<span id="L3959" class="LineNr">3959 </span>   <span class="Constant"> .b         .</span>
<span id="L3960" class="LineNr">3960 </span>   <span class="Constant"> .cde↩      .</span>
<span id="L3961" class="LineNr">3961 </span>   <span class="Constant"> .fgh       .</span>
<span id="L3962" class="LineNr">3962 </span>   <span class="Constant"> .i         .</span>
<span id="L3963" class="LineNr">3963 </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="Constant"> .          .</span>
<span id="L3980" class="LineNr">3980 </span>   <span class="Constant"> .a         .</span>
<span id="L3981" class="LineNr">3981 </span>   <span class="Constant"> .bcd↩      .</span>
<span id="L3982" class="LineNr">3982 </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>    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>    <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="Constant"> .          .</span>
<span id="L3994" class="LineNr">3994 </span>   <span class="Constant"> .bcd↩      .</span>
<span id="L3995" class="LineNr">3995 </span>   <span class="Constant"> .efg↩      .</span>
<span id="L3996" class="LineNr">3996 </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>    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>    <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="Constant"> .          .</span>
<span id="L4008" class="LineNr">4008 </span>   <span class="Constant"> .a         .</span>
<span id="L4009" class="LineNr">4009 </span>   <span class="Constant"> .bcd↩      .</span>
<span id="L4010" class="LineNr">4010 </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="Constant"> .          .</span>
<span id="L4031" class="LineNr">4031 </span>   <span class="Constant"> .axx       .</span>
<span id="L4032" class="LineNr">4032 </span>   <span class="Constant"> .bxx       .</span>
<span id="L4033" class="LineNr">4033 </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>    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>    <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="Constant"> .          .</span>
<span id="L4043" class="LineNr">4043 </span>   <span class="Constant"> .cxx       .</span>
<span id="L4044" class="LineNr">4044 </span>   <span class="Constant"> .dxx       .</span>
<span id="L4045" class="LineNr">4045 </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>    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>    <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="Constant"> .          .</span>
<span id="L4055" class="LineNr">4055 </span>   <span class="Constant"> .exx       .</span>
<span id="L4056" class="LineNr">4056 </span>   <span class="Constant"> .fxx       .</span>
<span id="L4057" class="LineNr">4057 </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>    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>    <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="Constant"> .          .</span>
<span id="L4068" class="LineNr">4068 </span>   <span class="Constant"> .cxx       .</span>
<span id="L4069" class="LineNr">4069 </span>   <span class="Constant"> .dxx       .</span>
<span id="L4070" class="LineNr">4070 </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="Constant"> .          .</span>
<span id="L4091" class="LineNr">4091 </span>   <span class="Constant"> .axy       .</span>
<span id="L4092" class="LineNr">4092 </span>   <span class="Constant"> .bxy       .</span>
<span id="L4093" class="LineNr">4093 </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>    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>    <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="Constant"> .          .</span>
<span id="L4103" class="LineNr">4103 </span>   <span class="Constant"> .cxy       .</span>
<span id="L4104" class="LineNr">4104 </span>   <span class="Constant"> .          .</span>
<span id="L4105" class="LineNr">4105 </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>    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>    <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="Constant"> .          .</span>
<span id="L4115" class="LineNr">4115 </span>   <span class="Constant"> .dxy       .</span>
<span id="L4116" class="LineNr">4116 </span>   <span class="Constant"> .exy       .</span>
<span id="L4117" class="LineNr">4117 </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>    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>    <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="Constant"> .          .</span>
<span id="L4128" class="LineNr">4128 </span>   <span class="Constant"> .cxy       .</span>
<span id="L4129" class="LineNr">4129 </span>   <span class="Constant"> .          .</span>
<span id="L4130" class="LineNr">4130 </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>    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="muControl">break-unless</span> scroll-up?
<span id="L4141" class="LineNr">4141 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L4142" class="LineNr">4142 </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>    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">    &lt;end-move-cursor&gt;</span>
<span id="L4145" class="LineNr">4145 </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-inputs</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#L2849'>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="muControl">break-unless</span> movement?
<span id="L4160" class="LineNr">4160 </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>    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="muControl">break-unless</span> scroll-down?
<span id="L4172" class="LineNr">4172 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L4173" class="LineNr">4173 </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>    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">    &lt;end-move-cursor&gt;</span>
<span id="L4176" class="LineNr">4176 </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-inputs</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#L1067'>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="muControl">break-unless</span> movement?
<span id="L4188" class="LineNr">4188 </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>    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="muControl">break-unless</span> scroll-down?
<span id="L4200" class="LineNr">4200 </span><span class="Constant">    &lt;begin-move-cursor&gt;</span>
<span id="L4201" class="LineNr">4201 </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>    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>    cursor <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> cursor
<span id="L4204" class="LineNr">4204 </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#L1067'>before-previous-screen-line</a> cursor, editor
<span id="L4205" class="LineNr">4205 </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>    *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>    go-render?:bool <span class="Special">&lt;-</span> not-equal new-top, old-top
<span id="L4208" class="LineNr">4208 </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">    &lt;end-move-cursor&gt;</span>
<span id="L4210" class="LineNr">4210 </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>    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="muControl">break-unless</span> comment-toggle?
<span id="L4220" class="LineNr">4220 </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>    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">    &lt;begin-insert-character&gt;</span>
<span id="L4223" class="LineNr">4223 </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>    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#L25'>next</a> before-line-start
<span id="L4225" class="LineNr">4225 </span>    commented-out?:bool <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L585'>match</a> line-start, <span class="Constant">[#? ]</span>  <span class="Comment"># comment prefix</span>
<span id="L4226" class="LineNr">4226 </span>    <span class="Delimiter">{</span>
<span id="L4227" class="LineNr">4227 </span>      <span class="muControl">break-unless</span> commented-out?
<span id="L4228" class="LineNr">4228 </span>      <span class="Comment"># uncomment</span>
<span id="L4229" class="LineNr">4229 </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>      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>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L4232" class="LineNr">4232 </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="Delimiter">}</span>
<span id="L4234" class="LineNr">4234 </span>    <span class="Delimiter">{</span>
<span id="L4235" class="LineNr">4235 </span>      <span class="muControl">break-if</span> commented-out?
<span id="L4236" class="LineNr">4236 </span>      <span class="Comment"># comment</span>
<span id="L4237" class="LineNr">4237 </span>      insert before-line-start, <span class="Constant">[#? ]</span>
<span id="L4238" class="LineNr">4238 </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>      *editor <span class="Special">&lt;-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column
<span id="L4240" class="LineNr">4240 </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="Delimiter">}</span>
<span id="L4242" class="LineNr">4242 </span><span class="Constant">    &lt;end-insert-character&gt;</span>
<span id="L4243" class="LineNr">4243 </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-inputs</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#L25'>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>    render-all?:bool <span class="Special">&lt;-</span> greater-or-equal i, end
<span id="L4265" class="LineNr">4265 </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="muControl">break-unless</span> curr
<span id="L4267" class="LineNr">4267 </span>    c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
<span id="L4268" class="LineNr">4268 </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="muControl">break-if</span> newline?
<span id="L4270" class="LineNr">4270 </span>    color <span class="Special">&lt;-</span> <a href='001-editor.mu.html#L398'>get-color</a> color, c
<span id="L4271" class="LineNr">4271 </span>    print <a href='../081print.mu.html#L16'>screen</a>, c, color
<span id="L4272" class="LineNr">4272 </span>    curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L25'>next</a> curr
<span id="L4273" class="LineNr">4273 </span>    i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
<span id="L4274" class="LineNr">4274 </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-inputs</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>    <a href='../065duplex_list.mu.html#L25'>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#L25'>next</a> cursor
<span id="L4286" class="LineNr">4286 </span>    <span class="muControl">break-unless</span> <a href='../065duplex_list.mu.html#L25'>next</a>
<span id="L4287" class="LineNr">4287 </span>    cursor <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L25'>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#L1067'>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>    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>    <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>    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>    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="Constant"> .          .</span>
<span id="L4308" class="LineNr">4308 </span>   <span class="Constant"> .#?        .</span>
<span id="L4309" class="LineNr">4309 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4310" class="LineNr">4310 </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="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L4314" class="LineNr">4314 </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>    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>    <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>    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>    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="Constant"> .          .</span>
<span id="L4335" class="LineNr">4335 </span>   <span class="Constant"> .#? ab     .</span>
<span id="L4336" class="LineNr">4336 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L4337" class="LineNr">4337 </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="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L4341" class="LineNr">4341 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>
<span id="L4354" class="LineNr">4354 </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>    <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>    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>    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="Constant"> .          .</span>
<span id="L4363" class="LineNr">4363 </span>   <span class="Constant"> .#? ab     .</span>
<span id="L4364" class="LineNr">4364 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L4365" class="LineNr">4365 </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="Constant"> 4</span> <span class="Special">&lt;-</span><span class="Constant"> 1</span>
<span id="L4369" class="LineNr">4369 </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>    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>    <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>    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>    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="Constant"> .          .</span>
<span id="L4384" class="LineNr">4384 </span>   <span class="Constant"> .ab        .</span>
<span id="L4385" class="LineNr">4385 </span><span class="Constant">    .╌╌╌╌╌╌╌╌╌╌.</span>
<span id="L4386" class="LineNr">4386 </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="Constant"> .          .</span>
<span id="L4399" class="LineNr">4399 </span>   <span class="Constant"> .abcd      .</span>
<span id="L4400" class="LineNr">4400 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4401" class="LineNr">4401 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>
<span id="L4407" class="LineNr">4407 </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>    <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="Constant"> .          .</span>
<span id="L4414" class="LineNr">4414 </span>   <span class="Constant"> .#? a↩     .</span>
<span id="L4415" class="LineNr">4415 </span>   <span class="Constant"> .bcd       .</span>
<span id="L4416" class="LineNr">4416 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4417" class="LineNr">4417 </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="Constant"> .          .</span>
<span id="L4429" class="LineNr">4429 </span>   <span class="Constant"> .#? a↩     .</span>
<span id="L4430" class="LineNr">4430 </span>   <span class="Constant"> .b         .</span>
<span id="L4431" class="LineNr">4431 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4432" class="LineNr">4432 </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>    left-click<span class="Constant"> 1</span>,<span class="Constant"> 7</span>
<span id="L4438" class="LineNr">4438 </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>    <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="Constant"> .          .</span>
<span id="L4445" class="LineNr">4445 </span>   <span class="Constant"> .ab        .</span>
<span id="L4446" class="LineNr">4446 </span>   <span class="Constant"> .╌╌╌╌╌     .</span>
<span id="L4447" class="LineNr">4447 </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 : -->