about summary refs log tree commit diff stats
path: root/edit/003-shortcuts.mu
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2018-06-17 00:05:38 -0700
committerKartik Agaram <vc@akkartik.com>2018-06-17 00:29:22 -0700
commitdd66068298b0a11f2a1f195376cba98e0c8570b5 (patch)
tree06696728fd65cdf38a2ac571943e130e9d60c333 /edit/003-shortcuts.mu
parentb89b822439f47a490a1b764e14a1ed1b73059cba (diff)
downloadmu-dd66068298b0a11f2a1f195376cba98e0c8570b5.tar.gz
4261 - start using literals for 'true' and 'false'
They uncovered one bug: in edit/003-shortcuts.mu
  <scroll-down> was returning 0 for an address in one place where I
  thought it was returning 0 for a boolean.

Now we've eliminated this bad interaction between tangling and punning
literals.
Diffstat (limited to 'edit/003-shortcuts.mu')
-rw-r--r--edit/003-shortcuts.mu91
1 files changed, 52 insertions, 39 deletions
diff --git a/edit/003-shortcuts.mu b/edit/003-shortcuts.mu
index 02ea77d0..b8f49731 100644
--- a/edit/003-shortcuts.mu
+++ b/edit/003-shortcuts.mu
@@ -113,7 +113,7 @@ def delete-before-cursor editor:&:editor, screen:&:screen -> go-render?:bool, ba
   data:&:duplex-list:char <- get *editor, data:offset
   # if at start of text (before-cursor at § sentinel), return
   prev:&:duplex-list:char <- prev before-cursor
-  return-unless prev, 0/no-more-render, 0/nothing-deleted
+  return-unless prev, false/no-more-render, 0/nothing-deleted
   trace 10, [app], [delete-before-cursor]
   original-row:num <- get *editor, cursor-row:offset
   scroll?:bool <- move-cursor-coordinates-left editor
@@ -121,13 +121,13 @@ def delete-before-cursor editor:&:editor, screen:&:screen -> go-render?:bool, ba
   data <- remove before-cursor, data  # will also neatly trim next/prev pointers in backspaced-cell/before-cursor
   before-cursor <- copy prev
   *editor <- put *editor, before-cursor:offset, before-cursor
-  return-if scroll?, 1/go-render
+  return-if scroll?, true/go-render
   screen-width:num <- screen-width screen
   cursor-row:num <- get *editor, cursor-row:offset
   cursor-column:num <- get *editor, cursor-column:offset
   # did we just backspace over a newline?
   same-row?:bool <- equal cursor-row, original-row
-  return-unless same-row?, 1/go-render
+  return-unless same-row?, true/go-render
   left:num <- get *editor, left:offset
   right:num <- get *editor, right:offset
   curr:&:duplex-list:char <- next before-cursor
@@ -136,7 +136,7 @@ def delete-before-cursor editor:&:editor, screen:&:screen -> go-render?:bool, ba
   {
     # hit right margin? give up and let caller render
     at-right?:bool <- greater-or-equal curr-column, right
-    return-if at-right?, 1/go-render
+    return-if at-right?, true/go-render
     break-unless curr
     # newline? done.
     currc:char <- get *curr, value:offset
@@ -150,13 +150,13 @@ def delete-before-cursor editor:&:editor, screen:&:screen -> go-render?:bool, ba
   # we're guaranteed not to be at the right margin
   space:char <- copy 32/space
   screen <- print screen, space
-  go-render? <- copy 0/false
+  go-render? <- copy false
 ]
 
 def move-cursor-coordinates-left editor:&:editor -> go-render?:bool, editor:&:editor [
   local-scope
   load-inputs
-  go-render?:bool <- copy 0/false
+  go-render?:bool <- copy false
   before-cursor:&:duplex-list:char <- get *editor, before-cursor:offset
   cursor-row:num <- get *editor, cursor-row:offset
   cursor-column:num <- get *editor, cursor-column:offset
@@ -180,7 +180,7 @@ def move-cursor-coordinates-left editor:&:editor -> go-render?:bool, editor:&:ed
   {
     break-unless top-of-screen?
     <scroll-up>
-    go-render? <- copy 1/true
+    go-render? <- copy true
   }
   {
     # case 1: if previous character was newline, figure out how long the previous line is
@@ -376,11 +376,11 @@ def delete-at-cursor editor:&:editor, screen:&:screen -> go-render?:bool, delete
   before-cursor:&:duplex-list:char <- get *editor, before-cursor:offset
   data:&:duplex-list:char <- get *editor, data:offset
   deleted-cell:&:duplex-list:char <- next before-cursor
-  return-unless deleted-cell, 0/don't-render
+  return-unless deleted-cell, false/don't-render
   currc:char <- get *deleted-cell, value:offset
   data <- remove deleted-cell, data
   deleted-newline?:bool <- equal currc, 10/newline
-  return-if deleted-newline?, 1/go-render
+  return-if deleted-newline?, true/go-render
   # wasn't a newline? render rest of line
   curr:&:duplex-list:char <- next before-cursor  # refresh after remove above
   cursor-row:num <- get *editor, cursor-row:offset
@@ -391,7 +391,7 @@ def delete-at-cursor editor:&:editor, screen:&:screen -> go-render?:bool, delete
   {
     # hit right margin? give up and let caller render
     at-right?:bool <- greater-or-equal curr-column, screen-width
-    return-if at-right?, 1/go-render
+    return-if at-right?, true/go-render
     break-unless curr
     currc:char <- get *curr, value:offset
     at-newline?:bool <- equal currc, 10/newline
@@ -404,7 +404,7 @@ def delete-at-cursor editor:&:editor, screen:&:screen -> go-render?:bool, delete
   # we're guaranteed not to be at the right margin
   space:char <- copy 32/space
   screen <- print screen, space
-  go-render? <- copy 0/false
+  go-render? <- copy false
 ]
 
 # right arrow
@@ -468,11 +468,11 @@ def move-cursor-coordinates-right editor:&:editor, screen-height:num -> go-rende
     cursor-column <- copy left
     *editor <- put *editor, cursor-column:offset, cursor-column
     below-screen?:bool <- greater-or-equal cursor-row, screen-height  # must be equal
-    return-unless below-screen?, 0/don't-render
+    return-unless below-screen?, false/don't-render
     <scroll-down>
     cursor-row <- subtract cursor-row, 1  # bring back into screen range
     *editor <- put *editor, cursor-row:offset, cursor-row
-    return 1/go-render
+    return true/go-render
   }
   # if the line wraps, move cursor to start of next row
   {
@@ -491,16 +491,16 @@ def move-cursor-coordinates-right editor:&:editor, screen-height:num -> go-rende
     cursor-column <- copy left
     *editor <- put *editor, cursor-column:offset, cursor-column
     below-screen?:bool <- greater-or-equal cursor-row, screen-height  # must be equal
-    return-unless below-screen?, 0/no-more-render
+    return-unless below-screen?, false/no-more-render
     <scroll-down>
     cursor-row <- subtract cursor-row, 1  # bring back into screen range
     *editor <- put *editor, cursor-row:offset, cursor-row
-    return 1/go-render
+    return true/go-render
   }
   # otherwise move cursor one character right
   cursor-column <- add cursor-column, 1
   *editor <- put *editor, cursor-column:offset, cursor-column
-  go-render? <- copy 0/false
+  go-render? <- copy false
 ]
 
 scenario editor-moves-cursor-to-next-line-with-right-arrow [
@@ -722,7 +722,7 @@ after <handle-special-key> [
     trace 10, [app], [left arrow]
     # if not at start of text (before-cursor at § sentinel)
     prev:&:duplex-list:char <- prev before-cursor
-    return-unless prev, 0/don't-render
+    return-unless prev, false/don't-render
     <begin-move-cursor>
     go-render? <- move-cursor-coordinates-left editor
     before-cursor <- copy prev
@@ -1000,7 +1000,7 @@ after <handle-special-key> [
 def move-to-previous-line editor:&:editor -> go-render?:bool, editor:&:editor [
   local-scope
   load-inputs
-  go-render?:bool <- copy 0/false
+  go-render?:bool <- copy false
   cursor-row:num <- get *editor, cursor-row:offset
   cursor-column:num <- get *editor, cursor-column:offset
   before-cursor:&:duplex-list:char <- get *editor, before-cursor:offset
@@ -1056,7 +1056,7 @@ def move-to-previous-line editor:&:editor -> go-render?:bool, editor:&:editor [
     # if cursor already at top, scroll up
     break-unless already-at-top?
     <scroll-up>
-    return 1/go-render
+    return true/go-render
   }
 ]
 
@@ -1411,7 +1411,7 @@ def move-to-next-line editor:&:editor, screen-height:num -> go-render?:bool, edi
     break-if before-cursor
     {
       break-if at-bottom-of-screen?
-      return 0/don't-render
+      return false/don't-render
     }
     {
       break-unless at-bottom-of-screen?
@@ -1423,7 +1423,7 @@ def move-to-next-line editor:&:editor, screen-height:num -> go-render?:bool, edi
     break-if next
     {
       break-if at-bottom-of-screen?
-      return 0/don't-render
+      return false/don't-render
     }
     {
       break-unless at-bottom-of-screen?
@@ -1452,7 +1452,7 @@ def move-to-next-line editor:&:editor, screen-height:num -> go-render?:bool, edi
       break-if next
       {
         break-if at-bottom-of-screen?
-        return 0/don't-render
+        return false/don't-render
       }
       {
         break-unless at-bottom-of-screen?
@@ -1476,11 +1476,11 @@ def move-to-next-line editor:&:editor, screen-height:num -> go-render?:bool, edi
     *editor <- put *editor, before-cursor:offset, before-cursor
     *editor <- put *editor, cursor-column:offset, cursor-column
     *editor <- put *editor, cursor-row:offset, cursor-row
-    return 0/don't-render
+    return false/don't-render
   }
   +try-to-scroll
   <scroll-down>
-  go-render? <- copy 1/true
+  go-render? <- copy true
 ]
 
 scenario editor-adjusts-column-at-next-line [
@@ -1589,7 +1589,7 @@ after <handle-special-character> [
     move-to-start-of-screen-line editor
     undo-coalesce-tag:num <- copy 0/never
     <end-move-cursor>
-    return 0/don't-render
+    return false/don't-render
   }
 ]
 
@@ -1601,7 +1601,7 @@ after <handle-special-key> [
     move-to-start-of-screen-line editor
     undo-coalesce-tag:num <- copy 0/never
     <end-move-cursor>
-    return 0/don't-render
+    return false/don't-render
   }
 ]
 
@@ -1814,7 +1814,7 @@ after <handle-special-character> [
     move-to-end-of-line editor
     undo-coalesce-tag:num <- copy 0/never
     <end-move-cursor>
-    return 0/don't-render
+    return false/don't-render
   }
 ]
 
@@ -1826,7 +1826,7 @@ after <handle-special-key> [
     move-to-end-of-line editor
     undo-coalesce-tag:num <- copy 0/never
     <end-move-cursor>
-    return 0/don't-render
+    return false/don't-render
   }
 ]
 
@@ -2025,7 +2025,7 @@ def minimal-render-for-ctrl-u screen:&:screen, editor:&:editor, deleted-cells:&:
   {
     # if we have a wrapped line, give up and render the whole screen
     wrap?:bool <- greater-or-equal i, right
-    return-if wrap?, 1/go-render
+    return-if wrap?, true/go-render
     curr <- next curr
     break-unless curr
     c:char <- get *curr, value:offset
@@ -2041,11 +2041,11 @@ def minimal-render-for-ctrl-u screen:&:screen, editor:&:editor, deleted-cells:&:
   left:num <- get *editor, left:offset
   end:num <- subtract right, left
   wrap?:bool <- greater-or-equal old-row-len, end
-  return-if wrap?, 1/go-render
+  return-if wrap?, true/go-render
   curr-line:text <- buffer-to-array buf
   curr-row:num <- get *editor, cursor-row:offset
   render-code screen, curr-line, curr-column, right, curr-row
-  return 0/dont-render
+  return false/dont-render
 ]
 
 def delete-to-start-of-line editor:&:editor -> result:&:duplex-list:char, editor:&:editor [
@@ -2054,7 +2054,7 @@ def delete-to-start-of-line editor:&:editor -> result:&:duplex-list:char, editor
   # compute range to delete
   init:&:duplex-list:char <- get *editor, data:offset
   top-of-screen:&:duplex-list:char <- get *editor, top-of-screen:offset
-  update-top-of-screen?:bool <- copy 0/false
+  update-top-of-screen?:bool <- copy false
   before-cursor:&:duplex-list:char <- get *editor, before-cursor:offset
   start:&:duplex-list:char <- copy before-cursor
   end:&:duplex-list:char <- next before-cursor
@@ -2595,7 +2595,7 @@ def minimal-render-for-ctrl-k screen:&:screen, editor:&:editor, deleted-cells:&:
   local-scope
   load-inputs
   # if we deleted nothing, there's nothing to render
-  return-unless deleted-cells, 0/dont-render
+  return-unless deleted-cells, false/dont-render
   # if the line used to wrap before, give up and render the whole screen
   curr-column:num <- get *editor, cursor-column:offset
   num-deleted-cells:num <- length deleted-cells
@@ -2604,9 +2604,9 @@ def minimal-render-for-ctrl-k screen:&:screen, editor:&:editor, deleted-cells:&:
   right:num <- get *editor, right:offset
   end:num <- subtract right, left
   wrap?:bool <- greater-or-equal old-row-len, end
-  return-if wrap?, 1/go-render
+  return-if wrap?, true/go-render
   clear-line-until screen, right
-  return 0/dont-render
+  return false/dont-render
 ]
 
 def delete-to-end-of-line editor:&:editor -> result:&:duplex-list:char, editor:&:editor [
@@ -2839,7 +2839,20 @@ after <scroll-down> [
   top-of-screen <- before-start-of-next-line top-of-screen, max
   *editor <- put *editor, top-of-screen:offset, top-of-screen
   no-movement?:bool <- equal old-top, top-of-screen
-  return-if no-movement?, 0/don't-render
+  return-if no-movement?, false/don't-render
+]
+
+after <scroll-down2> [
+  trace 10, [app], [scroll down]
+  top-of-screen:&:duplex-list:char <- get *editor, top-of-screen:offset
+  left:num <- get *editor, left:offset
+  right:num <- get *editor, right:offset
+  max:num <- subtract right, left
+  old-top:&:duplex-list:char <- copy top-of-screen
+  top-of-screen <- before-start-of-next-line top-of-screen, max
+  *editor <- put *editor, top-of-screen:offset, top-of-screen
+  no-movement?:bool <- equal old-top, top-of-screen
+  return-if no-movement?
 ]
 
 # Takes a pointer into the doubly-linked list, scans ahead at most 'max'
@@ -3210,7 +3223,7 @@ after <scroll-up> [
   top-of-screen <- before-previous-screen-line top-of-screen, editor
   *editor <- put *editor, top-of-screen:offset, top-of-screen
   no-movement?:bool <- equal old-top, top-of-screen
-  return-if no-movement?, 0/don't-render
+  return-if no-movement?, false/don't-render
 ]
 
 scenario editor-scrolls-up-past-wrapped-line-using-arrow-keys [
@@ -4262,7 +4275,7 @@ def render-line-from-start screen:&:screen, editor:&:editor, right-margin:num ->
   curr:&:duplex-list:char <- copy line-start
   {
     render-all?:bool <- greater-or-equal i, end
-    return-if render-all?, 1/go-render
+    return-if render-all?, true/go-render
     break-unless curr
     c:char <- get *curr, value:offset
     newline?:bool <- equal c, 10/newline
@@ -4274,7 +4287,7 @@ def render-line-from-start screen:&:screen, editor:&:editor, right-margin:num ->
     loop
   }
   clear-line-until screen, right
-  return 0/dont-render
+  return false/dont-render
 ]
 
 def before-start-of-screen-line editor:&:editor -> result:&:duplex-list:char [