about summary refs log tree commit diff stats
path: root/html
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2017-06-25 10:49:03 -0700
committerKartik K. Agaram <vc@akkartik.com>2017-06-25 11:02:15 -0700
commitdc5f112c3ea8aff1a389513fa6c33d88fab07420 (patch)
tree5e887029c973d8a5b292fd9993c5ad81cf8c4c61 /html
parentd2f0704962eb0e43f3db8b461dd6d48ee9297f73 (diff)
downloadmu-dc5f112c3ea8aff1a389513fa6c33d88fab07420.tar.gz
3958
Improvement on fix 3957: rather than put a band-aid over a slow
operation, eliminate the slowdown entirely.

In this case it turns out we're unnecessarily saving files to disk when
they could never be modified. Are we doing this on F4 as well?!
Diffstat (limited to 'html')
-rw-r--r--html/edit/005-sandbox.mu.html1882
-rw-r--r--html/edit/006-sandbox-copy.mu.html4
-rw-r--r--html/edit/007-sandbox-delete.mu.html2
-rw-r--r--html/edit/008-sandbox-edit.mu.html2
-rw-r--r--html/edit/009-sandbox-test.mu.html76
-rw-r--r--html/edit/010-sandbox-trace.mu.html4
-rw-r--r--html/edit/011-errors.mu.html6
7 files changed, 991 insertions, 985 deletions
diff --git a/html/edit/005-sandbox.mu.html b/html/edit/005-sandbox.mu.html
index 3adf365a..b68c4873 100644
--- a/html/edit/005-sandbox.mu.html
+++ b/html/edit/005-sandbox.mu.html
@@ -75,7 +75,7 @@ if ('onhashchange' in window) {
 <span id="L12" class="LineNr">  12 </span>  open-console
 <span id="L13" class="LineNr">  13 </span>  <a href='../081print.mu.html#L46'>clear-screen</a> <span class="Constant">0/screen</span>  <span class="Comment"># non-scrolling app</span>
 <span id="L14" class="LineNr">  14 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <span class="Constant">0/filesystem</span>, <span class="Constant">0/screen</span>
-<span id="L15" class="LineNr">  15 </span>  env <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L470'>restore-sandboxes</a> env, <span class="Constant">0/filesystem</span>
+<span id="L15" class="LineNr">  15 </span>  env <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L476'>restore-sandboxes</a> env, <span class="Constant">0/filesystem</span>
 <span id="L16" class="LineNr">  16 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <span class="Constant">0/screen</span>, env, <a href='001-editor.mu.html#L107'>render</a>
 <span id="L17" class="LineNr">  17 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <span class="Constant">0/screen</span>, <span class="Constant">0/console</span>, env, <span class="Constant">0/filesystem</span>
 <span id="L18" class="LineNr">  18 </span>]
@@ -218,7 +218,7 @@ if ('onhashchange' in window) {
 <span id="L155" class="LineNr"> 155 </span><span class="Constant">  <a href='005-sandbox.mu.html#L155'>&lt;run-sandboxes-begin&gt;</a></span>
 <span id="L156" class="LineNr"> 156 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
 <span id="L157" class="LineNr"> 157 </span>  <span class="Delimiter">{</span>
-<span id="L158" class="LineNr"> 158 </span>  <span class="Conceal">¦</span> sandbox-contents:text <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L669'>editor-contents</a> current-sandbox
+<span id="L158" class="LineNr"> 158 </span>  <span class="Conceal">¦</span> sandbox-contents:text <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L675'>editor-contents</a> current-sandbox
 <span id="L159" class="LineNr"> 159 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-contents
 <span id="L160" class="LineNr"> 160 </span>  <span class="Conceal">¦</span> <span class="Comment"># if contents exist, first save them</span>
 <span id="L161" class="LineNr"> 161 </span>  <span class="Conceal">¦</span> <span class="Comment"># run them and turn them into a new sandbox</span>
@@ -263,7 +263,7 @@ if ('onhashchange' in window) {
 <span id="L200" class="LineNr"> 200 </span>  <span class="Constant">local-scope</span>
 <span id="L201" class="LineNr"> 201 </span>  <span class="Constant">load-ingredients</span>
 <span id="L202" class="LineNr"> 202 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-<span id="L203" class="LineNr"> 203 </span>  in:text <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L669'>editor-contents</a> recipes
+<span id="L203" class="LineNr"> 203 </span>  in:text <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L675'>editor-contents</a> recipes
 <span id="L204" class="LineNr"> 204 </span>  <a href='../088file.mu.html#L11'>resources</a> <span class="Special">&lt;-</span> <a href='../088file.mu.html#L127'>dump</a> <a href='../088file.mu.html#L11'>resources</a>, <span class="Constant">[lesson/recipes.mu]</span>, in
 <span id="L205" class="LineNr"> 205 </span>  reload in
 <span id="L206" class="LineNr"> 206 </span>  errors-found? <span class="Special">&lt;-</span> copy <span class="Constant">0/false</span>
@@ -296,952 +296,958 @@ if ('onhashchange' in window) {
 <span id="L233" class="LineNr"> 233 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
 <span id="L234" class="LineNr"> 234 </span>  <span class="Delimiter">{</span>
 <span id="L235" class="LineNr"> 235 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
-<span id="L236" class="LineNr"> 236 </span>  <span class="Conceal">¦</span> data:text <span class="Special">&lt;-</span> get *curr, <span class="Constant">data:offset</span>
-<span id="L237" class="LineNr"> 237 </span>  <span class="Conceal">¦</span> filename:text <span class="Special">&lt;-</span> append <span class="Constant">[lesson/]</span>, idx
-<span id="L238" class="LineNr"> 238 </span>  <span class="Conceal">¦</span> <a href='../088file.mu.html#L11'>resources</a> <span class="Special">&lt;-</span> <a href='../088file.mu.html#L127'>dump</a> <a href='../088file.mu.html#L11'>resources</a>, filename, data
-<span id="L239" class="LineNr"> 239 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L239'>&lt;end-save-sandbox&gt;</a></span>
-<span id="L240" class="LineNr"> 240 </span>  <span class="Conceal">¦</span> idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-<span id="L241" class="LineNr"> 241 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
-<span id="L242" class="LineNr"> 242 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L243" class="LineNr"> 243 </span>  <span class="Delimiter">}</span>
-<span id="L244" class="LineNr"> 244 </span>]
-<span id="L245" class="LineNr"> 245 </span>
-<span id="L246" class="LineNr"> 246 </span><span class="muRecipe">def!</span> render-sandbox-side <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, env:&amp;:environment, render-editor:<a href='004-programming-environment.mu.html#L400'>render-recipe</a><span class="muRecipe"> -&gt; </span><a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, env:&amp;:environment [
-<span id="L247" class="LineNr"> 247 </span>  <span class="Constant">local-scope</span>
-<span id="L248" class="LineNr"> 248 </span>  <span class="Constant">load-ingredients</span>
-<span id="L249" class="LineNr"> 249 </span>  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render sandbox side]</span>
-<span id="L250" class="LineNr"> 250 </span>  old-top-idx:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L509'>save-top-idx</a> <a href='../081print.mu.html#L16'>screen</a>
-<span id="L251" class="LineNr"> 251 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
-<span id="L252" class="LineNr"> 252 </span>  row:num, column:num <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
-<span id="L253" class="LineNr"> 253 </span>  left:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
-<span id="L254" class="LineNr"> 254 </span>  right:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">right:offset</span>
-<span id="L255" class="LineNr"> 255 </span>  <span class="Comment"># render sandbox editor</span>
-<span id="L256" class="LineNr"> 256 </span>  render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-<span id="L257" class="LineNr"> 257 </span>  <span class="Delimiter">{</span>
-<span id="L258" class="LineNr"> 258 </span>  <span class="Conceal">¦</span> render-current-sandbox?:bool <span class="Special">&lt;-</span> equal render-from,<span class="Constant"> -1</span>
-<span id="L259" class="LineNr"> 259 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> render-current-sandbox?
-<span id="L260" class="LineNr"> 260 </span>  <span class="Conceal">¦</span> row, column, <a href='../081print.mu.html#L16'>screen</a>, current-sandbox <span class="Special">&lt;-</span> call render-editor, <a href='../081print.mu.html#L16'>screen</a>, current-sandbox
-<span id="L261" class="LineNr"> 261 </span>  <span class="Conceal">¦</span> <a href='001-editor.mu.html#L207'>clear-screen-from</a> <a href='../081print.mu.html#L16'>screen</a>, row, column, left, right
-<span id="L262" class="LineNr"> 262 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-<span id="L263" class="LineNr"> 263 </span>  <span class="Delimiter">}</span>
-<span id="L264" class="LineNr"> 264 </span>  <span class="Comment"># render sandboxes</span>
-<span id="L265" class="LineNr"> 265 </span>  <a href='002-typing.mu.html#L1116'>draw-horizontal</a> <a href='../081print.mu.html#L16'>screen</a>, row, left, right
-<span id="L266" class="LineNr"> 266 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-<span id="L267" class="LineNr"> 267 </span>  row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L273'>render-sandboxes</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox, left, right, row, render-from
-<span id="L268" class="LineNr"> 268 </span>  <a href='001-editor.mu.html#L223'>clear-rest-of-screen</a> <a href='../081print.mu.html#L16'>screen</a>, row, left, right
-<span id="L269" class="LineNr"> 269 </span>  <span class="Comment">#</span>
-<span id="L270" class="LineNr"> 270 </span>  <a href='../081print.mu.html#L515'>assert-no-scroll</a> <a href='../081print.mu.html#L16'>screen</a>, old-top-idx
-<span id="L271" class="LineNr"> 271 </span>]
-<span id="L272" class="LineNr"> 272 </span>
-<span id="L273" class="LineNr"> 273 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L273'>render-sandboxes</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, sandbox:&amp;:sandbox, left:num, right:num, row:num, render-from:num, idx: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>, sandbox:&amp;:sandbox [
-<span id="L274" class="LineNr"> 274 </span>  <span class="Constant">local-scope</span>
-<span id="L275" class="LineNr"> 275 </span>  <span class="Constant">load-ingredients</span>
-<span id="L276" class="LineNr"> 276 </span>  <span class="muControl">return-unless</span> sandbox
-<span id="L277" class="LineNr"> 277 </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="L278" class="LineNr"> 278 </span>  hidden?:bool <span class="Special">&lt;-</span> lesser-than idx, render-from
-<span id="L279" class="LineNr"> 279 </span>  <span class="Delimiter">{</span>
-<span id="L280" class="LineNr"> 280 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> hidden?
-<span id="L281" class="LineNr"> 281 </span>  <span class="Conceal">¦</span> <span class="Comment"># render sandbox menu</span>
-<span id="L282" class="LineNr"> 282 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-<span id="L283" class="LineNr"> 283 </span>  <span class="Conceal">¦</span> at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
-<span id="L284" class="LineNr"> 284 </span>  <span class="Conceal">¦</span> <span class="muControl">return-if</span> at-bottom?
-<span id="L285" class="LineNr"> 285 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, left
-<span id="L286" class="LineNr"> 286 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L328'>render-sandbox-menu</a> <a href='../081print.mu.html#L16'>screen</a>, idx, left, right
-<span id="L287" class="LineNr"> 287 </span>  <span class="Conceal">¦</span> <span class="Comment"># save menu row so we can detect clicks to it later</span>
-<span id="L288" class="LineNr"> 288 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>, row
-<span id="L289" class="LineNr"> 289 </span>  <span class="Conceal">¦</span> <span class="Comment"># render sandbox contents</span>
-<span id="L290" class="LineNr"> 290 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L236" class="LineNr"> 236 </span>  <span class="Conceal">¦</span> <a href='../088file.mu.html#L11'>resources</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L243'>save-sandbox</a> <a href='../088file.mu.html#L11'>resources</a>, curr, idx
+<span id="L237" class="LineNr"> 237 </span>  <span class="Conceal">¦</span> idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<span id="L238" class="LineNr"> 238 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
+<span id="L239" class="LineNr"> 239 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
+<span id="L240" class="LineNr"> 240 </span>  <span class="Delimiter">}</span>
+<span id="L241" class="LineNr"> 241 </span>]
+<span id="L242" class="LineNr"> 242 </span>
+<span id="L243" class="LineNr"> 243 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L243'>save-sandbox</a> <a href='../088file.mu.html#L11'>resources</a>:&amp;:<a href='../088file.mu.html#L11'>resources</a>, sandbox:&amp;:sandbox, sandbox-index:num<span class="muRecipe"> -&gt; </span><a href='../088file.mu.html#L11'>resources</a>:&amp;:<a href='../088file.mu.html#L11'>resources</a> [
+<span id="L244" class="LineNr"> 244 </span>  <span class="Constant">local-scope</span>
+<span id="L245" class="LineNr"> 245 </span>  <span class="Constant">load-ingredients</span>
+<span id="L246" class="LineNr"> 246 </span>  data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
+<span id="L247" class="LineNr"> 247 </span>  filename:text <span class="Special">&lt;-</span> append <span class="Constant">[lesson/]</span>, sandbox-index
+<span id="L248" class="LineNr"> 248 </span>  <a href='../088file.mu.html#L11'>resources</a> <span class="Special">&lt;-</span> <a href='../088file.mu.html#L127'>dump</a> <a href='../088file.mu.html#L11'>resources</a>, filename, data
+<span id="L249" class="LineNr"> 249 </span><span class="Constant">  <a href='005-sandbox.mu.html#L249'>&lt;end-save-sandbox&gt;</a></span>
+<span id="L250" class="LineNr"> 250 </span>]
+<span id="L251" class="LineNr"> 251 </span>
+<span id="L252" class="LineNr"> 252 </span><span class="muRecipe">def!</span> render-sandbox-side <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, env:&amp;:environment, render-editor:<a href='004-programming-environment.mu.html#L400'>render-recipe</a><span class="muRecipe"> -&gt; </span><a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, env:&amp;:environment [
+<span id="L253" class="LineNr"> 253 </span>  <span class="Constant">local-scope</span>
+<span id="L254" class="LineNr"> 254 </span>  <span class="Constant">load-ingredients</span>
+<span id="L255" class="LineNr"> 255 </span>  trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render sandbox side]</span>
+<span id="L256" class="LineNr"> 256 </span>  old-top-idx:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L509'>save-top-idx</a> <a href='../081print.mu.html#L16'>screen</a>
+<span id="L257" class="LineNr"> 257 </span>  current-sandbox:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">current-sandbox:offset</span>
+<span id="L258" class="LineNr"> 258 </span>  row:num, column:num <span class="Special">&lt;-</span> copy<span class="Constant"> 1</span>,<span class="Constant"> 0</span>
+<span id="L259" class="LineNr"> 259 </span>  left:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
+<span id="L260" class="LineNr"> 260 </span>  right:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">right:offset</span>
+<span id="L261" class="LineNr"> 261 </span>  <span class="Comment"># render sandbox editor</span>
+<span id="L262" class="LineNr"> 262 </span>  render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<span id="L263" class="LineNr"> 263 </span>  <span class="Delimiter">{</span>
+<span id="L264" class="LineNr"> 264 </span>  <span class="Conceal">¦</span> render-current-sandbox?:bool <span class="Special">&lt;-</span> equal render-from,<span class="Constant"> -1</span>
+<span id="L265" class="LineNr"> 265 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> render-current-sandbox?
+<span id="L266" class="LineNr"> 266 </span>  <span class="Conceal">¦</span> row, column, <a href='../081print.mu.html#L16'>screen</a>, current-sandbox <span class="Special">&lt;-</span> call render-editor, <a href='../081print.mu.html#L16'>screen</a>, current-sandbox
+<span id="L267" class="LineNr"> 267 </span>  <span class="Conceal">¦</span> <a href='001-editor.mu.html#L207'>clear-screen-from</a> <a href='../081print.mu.html#L16'>screen</a>, row, column, left, right
+<span id="L268" class="LineNr"> 268 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L269" class="LineNr"> 269 </span>  <span class="Delimiter">}</span>
+<span id="L270" class="LineNr"> 270 </span>  <span class="Comment"># render sandboxes</span>
+<span id="L271" class="LineNr"> 271 </span>  <a href='002-typing.mu.html#L1116'>draw-horizontal</a> <a href='../081print.mu.html#L16'>screen</a>, row, left, right
+<span id="L272" class="LineNr"> 272 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<span id="L273" class="LineNr"> 273 </span>  row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L279'>render-sandboxes</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox, left, right, row, render-from
+<span id="L274" class="LineNr"> 274 </span>  <a href='001-editor.mu.html#L223'>clear-rest-of-screen</a> <a href='../081print.mu.html#L16'>screen</a>, row, left, right
+<span id="L275" class="LineNr"> 275 </span>  <span class="Comment">#</span>
+<span id="L276" class="LineNr"> 276 </span>  <a href='../081print.mu.html#L515'>assert-no-scroll</a> <a href='../081print.mu.html#L16'>screen</a>, old-top-idx
+<span id="L277" class="LineNr"> 277 </span>]
+<span id="L278" class="LineNr"> 278 </span>
+<span id="L279" class="LineNr"> 279 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L279'>render-sandboxes</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, sandbox:&amp;:sandbox, left:num, right:num, row:num, render-from:num, idx: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>, sandbox:&amp;:sandbox [
+<span id="L280" class="LineNr"> 280 </span>  <span class="Constant">local-scope</span>
+<span id="L281" class="LineNr"> 281 </span>  <span class="Constant">load-ingredients</span>
+<span id="L282" class="LineNr"> 282 </span>  <span class="muControl">return-unless</span> sandbox
+<span id="L283" class="LineNr"> 283 </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="L284" class="LineNr"> 284 </span>  hidden?:bool <span class="Special">&lt;-</span> lesser-than idx, render-from
+<span id="L285" class="LineNr"> 285 </span>  <span class="Delimiter">{</span>
+<span id="L286" class="LineNr"> 286 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> hidden?
+<span id="L287" class="LineNr"> 287 </span>  <span class="Conceal">¦</span> <span class="Comment"># render sandbox menu</span>
+<span id="L288" class="LineNr"> 288 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L289" class="LineNr"> 289 </span>  <span class="Conceal">¦</span> at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
+<span id="L290" class="LineNr"> 290 </span>  <span class="Conceal">¦</span> <span class="muControl">return-if</span> at-bottom?
 <span id="L291" class="LineNr"> 291 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, left
-<span id="L292" class="LineNr"> 292 </span>  <span class="Conceal">¦</span> sandbox-data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
-<span id="L293" class="LineNr"> 293 </span>  <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2055'>render-code</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-data, left, right, row
-<span id="L294" class="LineNr"> 294 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>, row
-<span id="L295" class="LineNr"> 295 </span>  <span class="Conceal">¦</span> <span class="Comment"># render sandbox warnings, screen or response, in that order</span>
-<span id="L296" class="LineNr"> 296 </span>  <span class="Conceal">¦</span> sandbox-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response:offset</span>
-<span id="L297" class="LineNr"> 297 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L297'>&lt;render-sandbox-results&gt;</a></span>
-<span id="L298" class="LineNr"> 298 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L299" class="LineNr"> 299 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> sandbox-screen:&amp;:<a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> get *sandbox, <span class="Constant"><a href='../081print.mu.html#L16'>screen</a>:offset</span>
-<span id="L300" class="LineNr"> 300 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> empty-screen?:bool <span class="Special">&lt;-</span> <a href='../081print.mu.html#L74'>fake-screen-is-empty?</a> sandbox-screen
-<span id="L301" class="LineNr"> 301 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> empty-screen?
-<span id="L302" class="LineNr"> 302 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L504'>render-screen</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-screen, left, right, row
-<span id="L303" class="LineNr"> 303 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L292" class="LineNr"> 292 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L334'>render-sandbox-menu</a> <a href='../081print.mu.html#L16'>screen</a>, idx, left, right
+<span id="L293" class="LineNr"> 293 </span>  <span class="Conceal">¦</span> <span class="Comment"># save menu row so we can detect clicks to it later</span>
+<span id="L294" class="LineNr"> 294 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>, row
+<span id="L295" class="LineNr"> 295 </span>  <span class="Conceal">¦</span> <span class="Comment"># render sandbox contents</span>
+<span id="L296" class="LineNr"> 296 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L297" class="LineNr"> 297 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, left
+<span id="L298" class="LineNr"> 298 </span>  <span class="Conceal">¦</span> sandbox-data:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">data:offset</span>
+<span id="L299" class="LineNr"> 299 </span>  <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='003-shortcuts.mu.html#L2055'>render-code</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-data, left, right, row
+<span id="L300" class="LineNr"> 300 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>, row
+<span id="L301" class="LineNr"> 301 </span>  <span class="Conceal">¦</span> <span class="Comment"># render sandbox warnings, screen or response, in that order</span>
+<span id="L302" class="LineNr"> 302 </span>  <span class="Conceal">¦</span> sandbox-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response:offset</span>
+<span id="L303" class="LineNr"> 303 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L303'>&lt;render-sandbox-results&gt;</a></span>
 <span id="L304" class="LineNr"> 304 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L305" class="LineNr"> 305 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> empty-screen?
-<span id="L306" class="LineNr"> 306 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L306'>&lt;render-sandbox-response&gt;</a></span>
-<span id="L307" class="LineNr"> 307 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-response, left, right, <span class="Constant">245/grey</span>, row
-<span id="L308" class="LineNr"> 308 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L309" class="LineNr"> 309 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> +render-sandbox-end</span>
-<span id="L310" class="LineNr"> 310 </span>  <span class="Conceal">¦</span> at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
-<span id="L311" class="LineNr"> 311 </span>  <span class="Conceal">¦</span> <span class="muControl">return-if</span> at-bottom?
-<span id="L312" class="LineNr"> 312 </span>  <span class="Conceal">¦</span> <span class="Comment"># draw solid line after sandbox</span>
-<span id="L313" class="LineNr"> 313 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L1116'>draw-horizontal</a> <a href='../081print.mu.html#L16'>screen</a>, row, left, right
-<span id="L314" class="LineNr"> 314 </span>  <span class="Delimiter">}</span>
-<span id="L315" class="LineNr"> 315 </span>  <span class="Comment"># if hidden, reset row attributes</span>
-<span id="L316" class="LineNr"> 316 </span>  <span class="Delimiter">{</span>
-<span id="L317" class="LineNr"> 317 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> hidden?
-<span id="L318" class="LineNr"> 318 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>
-<span id="L319" class="LineNr"> 319 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>,<span class="Constant"> 0</span>
-<span id="L320" class="LineNr"> 320 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L320'>&lt;end-render-sandbox-reset-hidden&gt;</a></span>
-<span id="L321" class="LineNr"> 321 </span>  <span class="Delimiter">}</span>
-<span id="L322" class="LineNr"> 322 </span>  <span class="Comment"># draw next sandbox</span>
-<span id="L323" class="LineNr"> 323 </span>  next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
-<span id="L324" class="LineNr"> 324 </span>  next-idx:num <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-<span id="L325" class="LineNr"> 325 </span>  row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L273'>render-sandboxes</a> <a href='../081print.mu.html#L16'>screen</a>, next-sandbox, left, right, row, render-from, next-idx
-<span id="L326" class="LineNr"> 326 </span>]
-<span id="L327" class="LineNr"> 327 </span>
-<span id="L328" class="LineNr"> 328 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L328'>render-sandbox-menu</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, sandbox-index:num, left:num, right:num<span class="muRecipe"> -&gt; </span><a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a> [
-<span id="L329" class="LineNr"> 329 </span>  <span class="Constant">local-scope</span>
-<span id="L330" class="LineNr"> 330 </span>  <span class="Constant">load-ingredients</span>
-<span id="L331" class="LineNr"> 331 </span>  <a href='../081print.mu.html#L760'>move-cursor-to-column</a> <a href='../081print.mu.html#L16'>screen</a>, left
-<span id="L332" class="LineNr"> 332 </span>  edit-button-left:num, edit-button-right:num, copy-button-left:num, copy-button-right:num, recipe-button-left:num, recipe-button-right:num, delete-button-left:num <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L373'>sandbox-menu-columns</a> left, right
-<span id="L333" class="LineNr"> 333 </span>  print <a href='../081print.mu.html#L16'>screen</a>, sandbox-index, <span class="Constant">232/dark-grey</span>, <span class="Constant">245/grey</span>
-<span id="L334" class="LineNr"> 334 </span>  start-buttons:num <span class="Special">&lt;-</span> subtract edit-button-left,<span class="Constant"> 1</span>
-<span id="L335" class="LineNr"> 335 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, start-buttons, <span class="Constant">245/grey</span>
-<span id="L336" class="LineNr"> 336 </span>  print <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[edit]</span>, <span class="Constant">232/black</span>, <span class="Constant">25/background-blue</span>
-<span id="L337" class="LineNr"> 337 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, edit-button-right, <span class="Constant">25/background-blue</span>
-<span id="L338" class="LineNr"> 338 </span>  print <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[copy]</span>, <span class="Constant">232/black</span>, <span class="Constant">58/background-green</span>
-<span id="L339" class="LineNr"> 339 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, copy-button-right, <span class="Constant">58/background-green</span>
-<span id="L340" class="LineNr"> 340 </span>  print <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[to recipe]</span>, <span class="Constant">232/black</span>, <span class="Constant">94/background-orange</span>
-<span id="L341" class="LineNr"> 341 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, recipe-button-right, <span class="Constant">94/background-orange</span>
-<span id="L342" class="LineNr"> 342 </span>  print <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[delete]</span>, <span class="Constant">232/black</span>, <span class="Constant">52/background-red</span>
-<span id="L343" class="LineNr"> 343 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right, <span class="Constant">52/background-red</span>
-<span id="L344" class="LineNr"> 344 </span>]
-<span id="L345" class="LineNr"> 345 </span>
-<span id="L346" class="LineNr"> 346 </span><span class="muScenario">scenario</span> skip-rendering-sandbox-menu-past-bottom-row [
-<span id="L347" class="LineNr"> 347 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-<span id="L348" class="LineNr"> 348 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">6/height</span>
-<span id="L349" class="LineNr"> 349 </span>  <span class="Comment"># recipe editor is empty</span>
-<span id="L350" class="LineNr"> 350 </span>  assume-resources [
-<span id="L351" class="LineNr"> 351 </span>  <span class="Conceal">¦</span> <span class="Constant">[lesson/0]</span> <span class="Special">&lt;-</span> <span class="Constant">[|add 2, 2|]</span>
-<span id="L352" class="LineNr"> 352 </span>  <span class="Conceal">¦</span> <span class="Constant">[lesson/1]</span> <span class="Special">&lt;-</span> <span class="Constant">[|add 1, 1|]</span>
-<span id="L353" class="LineNr"> 353 </span>  ]
-<span id="L354" class="LineNr"> 354 </span>  <span class="Comment"># create two sandboxes such that the top one just barely fills the screen</span>
-<span id="L355" class="LineNr"> 355 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
-<span id="L356" class="LineNr"> 356 </span>  env <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L470'>restore-sandboxes</a> env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L357" class="LineNr"> 357 </span>  run [
-<span id="L358" class="LineNr"> 358 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L305" class="LineNr"> 305 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> sandbox-screen:&amp;:<a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> get *sandbox, <span class="Constant"><a href='../081print.mu.html#L16'>screen</a>:offset</span>
+<span id="L306" class="LineNr"> 306 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> empty-screen?:bool <span class="Special">&lt;-</span> <a href='../081print.mu.html#L74'>fake-screen-is-empty?</a> sandbox-screen
+<span id="L307" class="LineNr"> 307 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> empty-screen?
+<span id="L308" class="LineNr"> 308 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L510'>render-screen</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-screen, left, right, row
+<span id="L309" class="LineNr"> 309 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L310" class="LineNr"> 310 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L311" class="LineNr"> 311 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> empty-screen?
+<span id="L312" class="LineNr"> 312 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L312'>&lt;render-sandbox-response&gt;</a></span>
+<span id="L313" class="LineNr"> 313 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-response, left, right, <span class="Constant">245/grey</span>, row
+<span id="L314" class="LineNr"> 314 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L315" class="LineNr"> 315 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> +render-sandbox-end</span>
+<span id="L316" class="LineNr"> 316 </span>  <span class="Conceal">¦</span> at-bottom?:bool <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
+<span id="L317" class="LineNr"> 317 </span>  <span class="Conceal">¦</span> <span class="muControl">return-if</span> at-bottom?
+<span id="L318" class="LineNr"> 318 </span>  <span class="Conceal">¦</span> <span class="Comment"># draw solid line after sandbox</span>
+<span id="L319" class="LineNr"> 319 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L1116'>draw-horizontal</a> <a href='../081print.mu.html#L16'>screen</a>, row, left, right
+<span id="L320" class="LineNr"> 320 </span>  <span class="Delimiter">}</span>
+<span id="L321" class="LineNr"> 321 </span>  <span class="Comment"># if hidden, reset row attributes</span>
+<span id="L322" class="LineNr"> 322 </span>  <span class="Delimiter">{</span>
+<span id="L323" class="LineNr"> 323 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> hidden?
+<span id="L324" class="LineNr"> 324 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>
+<span id="L325" class="LineNr"> 325 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>,<span class="Constant"> 0</span>
+<span id="L326" class="LineNr"> 326 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L326'>&lt;end-render-sandbox-reset-hidden&gt;</a></span>
+<span id="L327" class="LineNr"> 327 </span>  <span class="Delimiter">}</span>
+<span id="L328" class="LineNr"> 328 </span>  <span class="Comment"># draw next sandbox</span>
+<span id="L329" class="LineNr"> 329 </span>  next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
+<span id="L330" class="LineNr"> 330 </span>  next-idx:num <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<span id="L331" class="LineNr"> 331 </span>  row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L279'>render-sandboxes</a> <a href='../081print.mu.html#L16'>screen</a>, next-sandbox, left, right, row, render-from, next-idx
+<span id="L332" class="LineNr"> 332 </span>]
+<span id="L333" class="LineNr"> 333 </span>
+<span id="L334" class="LineNr"> 334 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L334'>render-sandbox-menu</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, sandbox-index:num, left:num, right:num<span class="muRecipe"> -&gt; </span><a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a> [
+<span id="L335" class="LineNr"> 335 </span>  <span class="Constant">local-scope</span>
+<span id="L336" class="LineNr"> 336 </span>  <span class="Constant">load-ingredients</span>
+<span id="L337" class="LineNr"> 337 </span>  <a href='../081print.mu.html#L760'>move-cursor-to-column</a> <a href='../081print.mu.html#L16'>screen</a>, left
+<span id="L338" class="LineNr"> 338 </span>  edit-button-left:num, edit-button-right:num, copy-button-left:num, copy-button-right:num, recipe-button-left:num, recipe-button-right:num, delete-button-left:num <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L379'>sandbox-menu-columns</a> left, right
+<span id="L339" class="LineNr"> 339 </span>  print <a href='../081print.mu.html#L16'>screen</a>, sandbox-index, <span class="Constant">232/dark-grey</span>, <span class="Constant">245/grey</span>
+<span id="L340" class="LineNr"> 340 </span>  start-buttons:num <span class="Special">&lt;-</span> subtract edit-button-left,<span class="Constant"> 1</span>
+<span id="L341" class="LineNr"> 341 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, start-buttons, <span class="Constant">245/grey</span>
+<span id="L342" class="LineNr"> 342 </span>  print <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[edit]</span>, <span class="Constant">232/black</span>, <span class="Constant">25/background-blue</span>
+<span id="L343" class="LineNr"> 343 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, edit-button-right, <span class="Constant">25/background-blue</span>
+<span id="L344" class="LineNr"> 344 </span>  print <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[copy]</span>, <span class="Constant">232/black</span>, <span class="Constant">58/background-green</span>
+<span id="L345" class="LineNr"> 345 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, copy-button-right, <span class="Constant">58/background-green</span>
+<span id="L346" class="LineNr"> 346 </span>  print <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[to recipe]</span>, <span class="Constant">232/black</span>, <span class="Constant">94/background-orange</span>
+<span id="L347" class="LineNr"> 347 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, recipe-button-right, <span class="Constant">94/background-orange</span>
+<span id="L348" class="LineNr"> 348 </span>  print <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[delete]</span>, <span class="Constant">232/black</span>, <span class="Constant">52/background-red</span>
+<span id="L349" class="LineNr"> 349 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right, <span class="Constant">52/background-red</span>
+<span id="L350" class="LineNr"> 350 </span>]
+<span id="L351" class="LineNr"> 351 </span>
+<span id="L352" class="LineNr"> 352 </span><span class="muScenario">scenario</span> skip-rendering-sandbox-menu-past-bottom-row [
+<span id="L353" class="LineNr"> 353 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<span id="L354" class="LineNr"> 354 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">6/height</span>
+<span id="L355" class="LineNr"> 355 </span>  <span class="Comment"># recipe editor is empty</span>
+<span id="L356" class="LineNr"> 356 </span>  assume-resources [
+<span id="L357" class="LineNr"> 357 </span>  <span class="Conceal">¦</span> <span class="Constant">[lesson/0]</span> <span class="Special">&lt;-</span> <span class="Constant">[|add 2, 2|]</span>
+<span id="L358" class="LineNr"> 358 </span>  <span class="Conceal">¦</span> <span class="Constant">[lesson/1]</span> <span class="Special">&lt;-</span> <span class="Constant">[|add 1, 1|]</span>
 <span id="L359" class="LineNr"> 359 </span>  ]
-<span id="L360" class="LineNr"> 360 </span>  screen-should-contain [
-<span id="L361" class="LineNr"> 361 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L362" class="LineNr"> 362 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L363" class="LineNr"> 363 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L364" class="LineNr"> 364 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L365" class="LineNr"> 365 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L366" class="LineNr"> 366 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L367" class="LineNr"> 367 </span>  ]
-<span id="L368" class="LineNr"> 368 </span>]
-<span id="L369" class="LineNr"> 369 </span>
-<span id="L370" class="LineNr"> 370 </span><span class="Comment"># divide up the menu bar for a sandbox into 3 segments, for edit/copy/delete buttons</span>
-<span id="L371" class="LineNr"> 371 </span><span class="Comment"># delete-button-right == right</span>
-<span id="L372" class="LineNr"> 372 </span><span class="Comment"># all left/right pairs are inclusive</span>
-<span id="L373" class="LineNr"> 373 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L373'>sandbox-menu-columns</a> left:num, right:num<span class="muRecipe"> -&gt; </span>edit-button-left:num, edit-button-right:num, copy-button-left:num, copy-button-right:num, recipe-button-left:num, recipe-button-right:num, delete-button-left:num [
-<span id="L374" class="LineNr"> 374 </span>  <span class="Constant">local-scope</span>
-<span id="L375" class="LineNr"> 375 </span>  <span class="Constant">load-ingredients</span>
-<span id="L376" class="LineNr"> 376 </span>  start-buttons:num <span class="Special">&lt;-</span> add left, <span class="Constant">4/space-for-sandbox-index</span>
-<span id="L377" class="LineNr"> 377 </span>  buttons-space:num <span class="Special">&lt;-</span> subtract right, start-buttons
-<span id="L378" class="LineNr"> 378 </span>  button-width:num <span class="Special">&lt;-</span> divide-with-remainder buttons-space,<span class="Constant"> 4</span>  <span class="Comment"># integer division</span>
-<span id="L379" class="LineNr"> 379 </span>  buttons-wide-enough?:bool <span class="Special">&lt;-</span> greater-or-equal button-width,<span class="Constant"> 10</span>
-<span id="L380" class="LineNr"> 380 </span>  assert buttons-wide-enough?, <span class="Constant">[sandbox must be at least 40 or so characters wide]</span>
-<span id="L381" class="LineNr"> 381 </span>  edit-button-left:num <span class="Special">&lt;-</span> copy start-buttons
-<span id="L382" class="LineNr"> 382 </span>  copy-button-left:num <span class="Special">&lt;-</span> add start-buttons, button-width
-<span id="L383" class="LineNr"> 383 </span>  edit-button-right:num <span class="Special">&lt;-</span> subtract copy-button-left,<span class="Constant"> 1</span>
-<span id="L384" class="LineNr"> 384 </span>  recipe-button-left:num <span class="Special">&lt;-</span> add copy-button-left, button-width
-<span id="L385" class="LineNr"> 385 </span>  copy-button-right:num <span class="Special">&lt;-</span> subtract recipe-button-left,<span class="Constant"> 1</span>
-<span id="L386" class="LineNr"> 386 </span>  delete-button-left:num <span class="Special">&lt;-</span> subtract right, button-width,<span class="Constant"> -2</span>  <span class="Comment"># because 'to recipe' is wider than 'delete'</span>
-<span id="L387" class="LineNr"> 387 </span>  recipe-button-right:num <span class="Special">&lt;-</span> subtract delete-button-left,<span class="Constant"> 1</span>
-<span id="L388" class="LineNr"> 388 </span>]
-<span id="L389" class="LineNr"> 389 </span>
-<span id="L390" class="LineNr"> 390 </span><span class="Comment"># print a text 's' to 'editor' in 'color' starting at 'row'</span>
-<span id="L391" class="LineNr"> 391 </span><span class="Comment"># clear rest of last line, move cursor to next line</span>
-<span id="L392" class="LineNr"> 392 </span><span class="Comment"># like 'render-code' but without syntax-based colorization</span>
-<span id="L393" class="LineNr"> 393 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, s:text, left:num, right:num, color: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="L394" class="LineNr"> 394 </span>  <span class="Constant">local-scope</span>
-<span id="L395" class="LineNr"> 395 </span>  <span class="Constant">load-ingredients</span>
-<span id="L396" class="LineNr"> 396 </span>  <span class="muControl">return-unless</span> s
-<span id="L397" class="LineNr"> 397 </span>  column:num <span class="Special">&lt;-</span> copy left
-<span id="L398" class="LineNr"> 398 </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="L399" class="LineNr"> 399 </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="L400" class="LineNr"> 400 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-<span id="L401" class="LineNr"> 401 </span>  len:num <span class="Special">&lt;-</span> length *s
-<span id="L402" class="LineNr"> 402 </span>  <span class="Delimiter">{</span>
-<span id="L403" class="LineNr"> 403 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> +next-character</span>
-<span id="L404" class="LineNr"> 404 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-<span id="L405" class="LineNr"> 405 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
-<span id="L406" class="LineNr"> 406 </span>  <span class="Conceal">¦</span> done? <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
-<span id="L407" class="LineNr"> 407 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
-<span id="L408" class="LineNr"> 408 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> index *s, i
-<span id="L409" class="LineNr"> 409 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L410" class="LineNr"> 410 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># newline? move to left rather than 0</span>
-<span id="L411" class="LineNr"> 411 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
-<span id="L412" class="LineNr"> 412 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> newline?
-<span id="L413" class="LineNr"> 413 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># clear rest of line in this window</span>
-<span id="L414" class="LineNr"> 414 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L415" class="LineNr"> 415 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-than column, right
-<span id="L416" class="LineNr"> 416 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
-<span id="L417" class="LineNr"> 417 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-<span id="L418" class="LineNr"> 418 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space
-<span id="L419" class="LineNr"> 419 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-<span id="L420" class="LineNr"> 420 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L421" class="LineNr"> 421 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L422" class="LineNr"> 422 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-<span id="L423" class="LineNr"> 423 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left
-<span id="L424" class="LineNr"> 424 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
-<span id="L425" class="LineNr"> 425 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-<span id="L426" class="LineNr"> 426 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-<span id="L427" class="LineNr"> 427 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L428" class="LineNr"> 428 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L429" class="LineNr"> 429 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># at right? wrap.</span>
-<span id="L430" class="LineNr"> 430 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> equal column, right
-<span id="L431" class="LineNr"> 431 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-right?
-<span id="L432" class="LineNr"> 432 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># print wrap icon</span>
-<span id="L433" class="LineNr"> 433 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
-<span id="L434" class="LineNr"> 434 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, wrap-icon, <span class="Constant">245/grey</span>
-<span id="L435" class="LineNr"> 435 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left
-<span id="L436" class="LineNr"> 436 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-<span id="L437" class="LineNr"> 437 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
-<span id="L438" class="LineNr"> 438 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># don't increment i</span>
-<span id="L439" class="LineNr"> 439 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-character</span>
-<span id="L440" class="LineNr"> 440 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L441" class="LineNr"> 441 </span>  <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-<span id="L442" class="LineNr"> 442 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, c, color
-<span id="L443" class="LineNr"> 443 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-<span id="L444" class="LineNr"> 444 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L445" class="LineNr"> 445 </span>  <span class="Delimiter">}</span>
-<span id="L446" class="LineNr"> 446 </span>  was-at-left?:bool <span class="Special">&lt;-</span> equal column, left
-<span id="L447" class="LineNr"> 447 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right
-<span id="L448" class="LineNr"> 448 </span>  <span class="Delimiter">{</span>
-<span id="L449" class="LineNr"> 449 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> was-at-left?
-<span id="L450" class="LineNr"> 450 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L360" class="LineNr"> 360 </span>  <span class="Comment"># create two sandboxes such that the top one just barely fills the screen</span>
+<span id="L361" class="LineNr"> 361 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
+<span id="L362" class="LineNr"> 362 </span>  env <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L476'>restore-sandboxes</a> env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L363" class="LineNr"> 363 </span>  run [
+<span id="L364" class="LineNr"> 364 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L365" class="LineNr"> 365 </span>  ]
+<span id="L366" class="LineNr"> 366 </span>  screen-should-contain [
+<span id="L367" class="LineNr"> 367 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L368" class="LineNr"> 368 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L369" class="LineNr"> 369 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L370" class="LineNr"> 370 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L371" class="LineNr"> 371 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L372" class="LineNr"> 372 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L373" class="LineNr"> 373 </span>  ]
+<span id="L374" class="LineNr"> 374 </span>]
+<span id="L375" class="LineNr"> 375 </span>
+<span id="L376" class="LineNr"> 376 </span><span class="Comment"># divide up the menu bar for a sandbox into 3 segments, for edit/copy/delete buttons</span>
+<span id="L377" class="LineNr"> 377 </span><span class="Comment"># delete-button-right == right</span>
+<span id="L378" class="LineNr"> 378 </span><span class="Comment"># all left/right pairs are inclusive</span>
+<span id="L379" class="LineNr"> 379 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L379'>sandbox-menu-columns</a> left:num, right:num<span class="muRecipe"> -&gt; </span>edit-button-left:num, edit-button-right:num, copy-button-left:num, copy-button-right:num, recipe-button-left:num, recipe-button-right:num, delete-button-left:num [
+<span id="L380" class="LineNr"> 380 </span>  <span class="Constant">local-scope</span>
+<span id="L381" class="LineNr"> 381 </span>  <span class="Constant">load-ingredients</span>
+<span id="L382" class="LineNr"> 382 </span>  start-buttons:num <span class="Special">&lt;-</span> add left, <span class="Constant">4/space-for-sandbox-index</span>
+<span id="L383" class="LineNr"> 383 </span>  buttons-space:num <span class="Special">&lt;-</span> subtract right, start-buttons
+<span id="L384" class="LineNr"> 384 </span>  button-width:num <span class="Special">&lt;-</span> divide-with-remainder buttons-space,<span class="Constant"> 4</span>  <span class="Comment"># integer division</span>
+<span id="L385" class="LineNr"> 385 </span>  buttons-wide-enough?:bool <span class="Special">&lt;-</span> greater-or-equal button-width,<span class="Constant"> 10</span>
+<span id="L386" class="LineNr"> 386 </span>  assert buttons-wide-enough?, <span class="Constant">[sandbox must be at least 40 or so characters wide]</span>
+<span id="L387" class="LineNr"> 387 </span>  edit-button-left:num <span class="Special">&lt;-</span> copy start-buttons
+<span id="L388" class="LineNr"> 388 </span>  copy-button-left:num <span class="Special">&lt;-</span> add start-buttons, button-width
+<span id="L389" class="LineNr"> 389 </span>  edit-button-right:num <span class="Special">&lt;-</span> subtract copy-button-left,<span class="Constant"> 1</span>
+<span id="L390" class="LineNr"> 390 </span>  recipe-button-left:num <span class="Special">&lt;-</span> add copy-button-left, button-width
+<span id="L391" class="LineNr"> 391 </span>  copy-button-right:num <span class="Special">&lt;-</span> subtract recipe-button-left,<span class="Constant"> 1</span>
+<span id="L392" class="LineNr"> 392 </span>  delete-button-left:num <span class="Special">&lt;-</span> subtract right, button-width,<span class="Constant"> -2</span>  <span class="Comment"># because 'to recipe' is wider than 'delete'</span>
+<span id="L393" class="LineNr"> 393 </span>  recipe-button-right:num <span class="Special">&lt;-</span> subtract delete-button-left,<span class="Constant"> 1</span>
+<span id="L394" class="LineNr"> 394 </span>]
+<span id="L395" class="LineNr"> 395 </span>
+<span id="L396" class="LineNr"> 396 </span><span class="Comment"># print a text 's' to 'editor' in 'color' starting at 'row'</span>
+<span id="L397" class="LineNr"> 397 </span><span class="Comment"># clear rest of last line, move cursor to next line</span>
+<span id="L398" class="LineNr"> 398 </span><span class="Comment"># like 'render-code' but without syntax-based colorization</span>
+<span id="L399" class="LineNr"> 399 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, s:text, left:num, right:num, color: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="L400" class="LineNr"> 400 </span>  <span class="Constant">local-scope</span>
+<span id="L401" class="LineNr"> 401 </span>  <span class="Constant">load-ingredients</span>
+<span id="L402" class="LineNr"> 402 </span>  <span class="muControl">return-unless</span> s
+<span id="L403" class="LineNr"> 403 </span>  column:num <span class="Special">&lt;-</span> copy left
+<span id="L404" class="LineNr"> 404 </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="L405" class="LineNr"> 405 </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="L406" class="LineNr"> 406 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<span id="L407" class="LineNr"> 407 </span>  len:num <span class="Special">&lt;-</span> length *s
+<span id="L408" class="LineNr"> 408 </span>  <span class="Delimiter">{</span>
+<span id="L409" class="LineNr"> 409 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> +next-character</span>
+<span id="L410" class="LineNr"> 410 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<span id="L411" class="LineNr"> 411 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
+<span id="L412" class="LineNr"> 412 </span>  <span class="Conceal">¦</span> done? <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
+<span id="L413" class="LineNr"> 413 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
+<span id="L414" class="LineNr"> 414 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> index *s, i
+<span id="L415" class="LineNr"> 415 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L416" class="LineNr"> 416 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># newline? move to left rather than 0</span>
+<span id="L417" class="LineNr"> 417 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> newline?:bool <span class="Special">&lt;-</span> equal c, <span class="Constant">10/newline</span>
+<span id="L418" class="LineNr"> 418 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> newline?
+<span id="L419" class="LineNr"> 419 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># clear rest of line in this window</span>
+<span id="L420" class="LineNr"> 420 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L421" class="LineNr"> 421 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-than column, right
+<span id="L422" class="LineNr"> 422 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
+<span id="L423" class="LineNr"> 423 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<span id="L424" class="LineNr"> 424 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space
+<span id="L425" class="LineNr"> 425 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<span id="L426" class="LineNr"> 426 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
+<span id="L427" class="LineNr"> 427 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L428" class="LineNr"> 428 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L429" class="LineNr"> 429 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left
+<span id="L430" class="LineNr"> 430 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
+<span id="L431" class="LineNr"> 431 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<span id="L432" class="LineNr"> 432 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<span id="L433" class="LineNr"> 433 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L434" class="LineNr"> 434 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L435" class="LineNr"> 435 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># at right? wrap.</span>
+<span id="L436" class="LineNr"> 436 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-right?:bool <span class="Special">&lt;-</span> equal column, right
+<span id="L437" class="LineNr"> 437 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> at-right?
+<span id="L438" class="LineNr"> 438 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># print wrap icon</span>
+<span id="L439" class="LineNr"> 439 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> wrap-icon:char <span class="Special">&lt;-</span> copy <span class="Constant">8617/loop-back-to-left</span>
+<span id="L440" class="LineNr"> 440 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, wrap-icon, <span class="Constant">245/grey</span>
+<span id="L441" class="LineNr"> 441 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left
+<span id="L442" class="LineNr"> 442 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L443" class="LineNr"> 443 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
+<span id="L444" class="LineNr"> 444 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># don't increment i</span>
+<span id="L445" class="LineNr"> 445 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-character</span>
+<span id="L446" class="LineNr"> 446 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L447" class="LineNr"> 447 </span>  <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<span id="L448" class="LineNr"> 448 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, c, color
+<span id="L449" class="LineNr"> 449 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<span id="L450" class="LineNr"> 450 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
 <span id="L451" class="LineNr"> 451 </span>  <span class="Delimiter">}</span>
-<span id="L452" class="LineNr"> 452 </span>  move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, left
-<span id="L453" class="LineNr"> 453 </span>]
-<span id="L454" class="LineNr"> 454 </span>
-<span id="L455" class="LineNr"> 455 </span><span class="muScenario">scenario</span> render-text-wraps-barely-long-lines [
-<span id="L456" class="LineNr"> 456 </span>  <span class="Constant">local-scope</span>
-<span id="L457" class="LineNr"> 457 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
-<span id="L458" class="LineNr"> 458 </span>  run [
-<span id="L459" class="LineNr"> 459 </span>  <span class="Conceal">¦</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>, <span class="Constant">7/white</span>, <span class="Constant">1/row</span>
-<span id="L460" class="LineNr"> 460 </span>  ]
-<span id="L461" class="LineNr"> 461 </span>  screen-should-contain [
-<span id="L462" class="LineNr"> 462 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
-<span id="L463" class="LineNr"> 463 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .abcd↩.</span>
-<span id="L464" class="LineNr"> 464 </span>  <span class="Conceal">¦</span><span class="Constant"> .e    .</span>
-<span id="L465" class="LineNr"> 465 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
+<span id="L452" class="LineNr"> 452 </span>  was-at-left?:bool <span class="Special">&lt;-</span> equal column, left
+<span id="L453" class="LineNr"> 453 </span>  <a href='../081print.mu.html#L553'>clear-line-until</a> <a href='../081print.mu.html#L16'>screen</a>, right
+<span id="L454" class="LineNr"> 454 </span>  <span class="Delimiter">{</span>
+<span id="L455" class="LineNr"> 455 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> was-at-left?
+<span id="L456" class="LineNr"> 456 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L457" class="LineNr"> 457 </span>  <span class="Delimiter">}</span>
+<span id="L458" class="LineNr"> 458 </span>  move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, left
+<span id="L459" class="LineNr"> 459 </span>]
+<span id="L460" class="LineNr"> 460 </span>
+<span id="L461" class="LineNr"> 461 </span><span class="muScenario">scenario</span> render-text-wraps-barely-long-lines [
+<span id="L462" class="LineNr"> 462 </span>  <span class="Constant">local-scope</span>
+<span id="L463" class="LineNr"> 463 </span>  assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span>
+<span id="L464" class="LineNr"> 464 </span>  run [
+<span id="L465" class="LineNr"> 465 </span>  <span class="Conceal">¦</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">4/right</span>, <span class="Constant">7/white</span>, <span class="Constant">1/row</span>
 <span id="L466" class="LineNr"> 466 </span>  ]
-<span id="L467" class="LineNr"> 467 </span>]
-<span id="L468" class="LineNr"> 468 </span>
-<span id="L469" class="LineNr"> 469 </span><span class="Comment"># assumes programming environment has no sandboxes; restores them from previous session</span>
-<span id="L470" class="LineNr"> 470 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L470'>restore-sandboxes</a> env:&amp;:environment, <a href='../088file.mu.html#L11'>resources</a>:&amp;:<a href='../088file.mu.html#L11'>resources</a><span class="muRecipe"> -&gt; </span>env:&amp;:environment [
-<span id="L471" class="LineNr"> 471 </span>  <span class="Constant">local-scope</span>
-<span id="L472" class="LineNr"> 472 </span>  <span class="Constant">load-ingredients</span>
-<span id="L473" class="LineNr"> 473 </span>  <span class="Comment"># read all scenarios, pushing them to end of a list of scenarios</span>
-<span id="L474" class="LineNr"> 474 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-<span id="L475" class="LineNr"> 475 </span>  curr:&amp;:sandbox <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-<span id="L476" class="LineNr"> 476 </span>  <a href='../065duplex_list.mu.html#L36'>prev</a>:&amp;:sandbox <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-<span id="L477" class="LineNr"> 477 </span>  <span class="Delimiter">{</span>
-<span id="L478" class="LineNr"> 478 </span>  <span class="Conceal">¦</span> filename:text <span class="Special">&lt;-</span> append <span class="Constant">[lesson/]</span>, idx
-<span id="L479" class="LineNr"> 479 </span>  <span class="Conceal">¦</span> contents:text <span class="Special">&lt;-</span> <a href='../088file.mu.html#L38'>slurp</a> <a href='../088file.mu.html#L11'>resources</a>, filename
-<span id="L480" class="LineNr"> 480 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> contents  <span class="Comment"># stop at first error; assuming file didn't exist</span>
-<span id="L481" class="LineNr"> 481 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span>      <span class="Comment"># todo: handle empty sandbox</span>
-<span id="L482" class="LineNr"> 482 </span>  <span class="Conceal">¦</span> <span class="Comment"># create new sandbox for file</span>
-<span id="L483" class="LineNr"> 483 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> new <span class="Constant">sandbox:type</span>
-<span id="L484" class="LineNr"> 484 </span>  <span class="Conceal">¦</span> *curr <span class="Special">&lt;-</span> put *curr, <span class="Constant">data:offset</span>, contents
-<span id="L485" class="LineNr"> 485 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L485'>&lt;end-restore-sandbox&gt;</a></span>
-<span id="L486" class="LineNr"> 486 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L487" class="LineNr"> 487 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> idx
-<span id="L488" class="LineNr"> 488 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox:offset</span>, curr
-<span id="L489" class="LineNr"> 489 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L490" class="LineNr"> 490 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L491" class="LineNr"> 491 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> idx
-<span id="L492" class="LineNr"> 492 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *prev <span class="Special">&lt;-</span> put *prev, <span class="Constant">next-sandbox:offset</span>, curr
-<span id="L493" class="LineNr"> 493 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L494" class="LineNr"> 494 </span>  <span class="Conceal">¦</span> idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
-<span id="L495" class="LineNr"> 495 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a> <span class="Special">&lt;-</span> copy curr
-<span id="L496" class="LineNr"> 496 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L497" class="LineNr"> 497 </span>  <span class="Delimiter">}</span>
-<span id="L498" class="LineNr"> 498 </span>  <span class="Comment"># update sandbox count</span>
-<span id="L499" class="LineNr"> 499 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">number-of-sandboxes:offset</span>, idx
-<span id="L500" class="LineNr"> 500 </span>]
-<span id="L501" class="LineNr"> 501 </span>
-<span id="L502" class="LineNr"> 502 </span><span class="Comment"># print the fake sandbox screen to 'screen' with appropriate delimiters</span>
-<span id="L503" class="LineNr"> 503 </span><span class="Comment"># leave cursor at start of next line</span>
-<span id="L504" class="LineNr"> 504 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L504'>render-screen</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, sandbox-screen:&amp;:<a href='../081print.mu.html#L16'>screen</a>, 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="L505" class="LineNr"> 505 </span>  <span class="Constant">local-scope</span>
-<span id="L506" class="LineNr"> 506 </span>  <span class="Constant">load-ingredients</span>
-<span id="L507" class="LineNr"> 507 </span>  <span class="muControl">return-unless</span> sandbox-screen
-<span id="L508" class="LineNr"> 508 </span>  <span class="Comment"># print 'screen:'</span>
-<span id="L509" class="LineNr"> 509 </span>  row <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[screen:]</span>, left, right, <span class="Constant">245/grey</span>, row
-<span id="L510" class="LineNr"> 510 </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, left
-<span id="L511" class="LineNr"> 511 </span>  <span class="Comment"># start printing sandbox-screen</span>
-<span id="L512" class="LineNr"> 512 </span>  column:num <span class="Special">&lt;-</span> copy left
-<span id="L513" class="LineNr"> 513 </span>  s-width:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L768'>screen-width</a> sandbox-screen
-<span id="L514" class="LineNr"> 514 </span>  s-height:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L782'>screen-height</a> sandbox-screen
-<span id="L515" class="LineNr"> 515 </span>  buf:&amp;:@:<a href='../081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *sandbox-screen, <span class="Constant">data:offset</span>
-<span id="L516" class="LineNr"> 516 </span>  stop-printing:num <span class="Special">&lt;-</span> add left, s-width,<span class="Constant"> 3</span>
-<span id="L517" class="LineNr"> 517 </span>  max-column:num <span class="Special">&lt;-</span> min stop-printing, right
-<span id="L518" class="LineNr"> 518 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
-<span id="L519" class="LineNr"> 519 </span>  len:num <span class="Special">&lt;-</span> length *buf
-<span id="L520" class="LineNr"> 520 </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="L521" class="LineNr"> 521 </span>  <span class="Delimiter">{</span>
-<span id="L522" class="LineNr"> 522 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
-<span id="L523" class="LineNr"> 523 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
-<span id="L524" class="LineNr"> 524 </span>  <span class="Conceal">¦</span> done? <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
-<span id="L525" class="LineNr"> 525 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
-<span id="L526" class="LineNr"> 526 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left
-<span id="L527" class="LineNr"> 527 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
-<span id="L528" class="LineNr"> 528 </span>  <span class="Conceal">¦</span> <span class="Comment"># initial leader for each row: two spaces and a '.'</span>
-<span id="L529" class="LineNr"> 529 </span>  <span class="Conceal">¦</span> space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
-<span id="L530" class="LineNr"> 530 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space, <span class="Constant">245/grey</span>
-<span id="L531" class="LineNr"> 531 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space, <span class="Constant">245/grey</span>
-<span id="L532" class="LineNr"> 532 </span>  <span class="Conceal">¦</span> full-stop:char <span class="Special">&lt;-</span> copy <span class="Constant">46/period</span>
-<span id="L533" class="LineNr"> 533 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, full-stop, <span class="Constant">245/grey</span>
-<span id="L534" class="LineNr"> 534 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add left,<span class="Constant"> 3</span>
-<span id="L535" class="LineNr"> 535 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L536" class="LineNr"> 536 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># print row</span>
-<span id="L537" class="LineNr"> 537 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row-done?:bool <span class="Special">&lt;-</span> greater-or-equal column, max-column
-<span id="L538" class="LineNr"> 538 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> row-done?
-<span id="L539" class="LineNr"> 539 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> curr:<a href='../081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> index *buf, i
-<span id="L540" class="LineNr"> 540 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get curr, <span class="Constant">contents:offset</span>
-<span id="L541" class="LineNr"> 541 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> color:num <span class="Special">&lt;-</span> get curr, <span class="Constant">color:offset</span>
-<span id="L542" class="LineNr"> 542 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L543" class="LineNr"> 543 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># damp whites down to grey</span>
-<span id="L544" class="LineNr"> 544 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> white?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">7/white</span>
-<span id="L545" class="LineNr"> 545 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> white?
-<span id="L546" class="LineNr"> 546 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span>
-<span id="L547" class="LineNr"> 547 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L548" class="LineNr"> 548 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, c, color
-<span id="L549" class="LineNr"> 549 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-<span id="L550" class="LineNr"> 550 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
-<span id="L551" class="LineNr"> 551 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L552" class="LineNr"> 552 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L553" class="LineNr"> 553 </span>  <span class="Conceal">¦</span> <span class="Comment"># print final '.'</span>
-<span id="L554" class="LineNr"> 554 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, full-stop, <span class="Constant">245/grey</span>
-<span id="L555" class="LineNr"> 555 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-<span id="L556" class="LineNr"> 556 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L557" class="LineNr"> 557 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># clear rest of current line</span>
-<span id="L558" class="LineNr"> 558 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> line-done?:bool <span class="Special">&lt;-</span> greater-than column, right
-<span id="L559" class="LineNr"> 559 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> line-done?
-<span id="L560" class="LineNr"> 560 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space
-<span id="L561" class="LineNr"> 561 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
-<span id="L562" class="LineNr"> 562 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L563" class="LineNr"> 563 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L564" class="LineNr"> 564 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
-<span id="L565" class="LineNr"> 565 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L566" class="LineNr"> 566 </span>  <span class="Delimiter">}</span>
-<span id="L567" class="LineNr"> 567 </span>]
-<span id="L568" class="LineNr"> 568 </span>
-<span id="L569" class="LineNr"> 569 </span><span class="muScenario">scenario</span> run-updates-results [
-<span id="L570" class="LineNr"> 570 </span>  <span class="Constant">local-scope</span>
-<span id="L571" class="LineNr"> 571 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-<span id="L572" class="LineNr"> 572 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">12/height</span>
-<span id="L573" class="LineNr"> 573 </span>  <span class="Comment"># define a recipe (no indent for the 'add' line below so column numbers are more obvious)</span>
-<span id="L574" class="LineNr"> 574 </span>  assume-resources [
-<span id="L575" class="LineNr"> 575 </span>  <span class="Conceal">¦</span> <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
-<span id="L576" class="LineNr"> 576 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> ||</span>
-<span id="L577" class="LineNr"> 577 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
-<span id="L578" class="LineNr"> 578 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> |  local-scope|</span>
-<span id="L579" class="LineNr"> 579 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> |  z:num &lt;- add 2, 2|</span>
-<span id="L580" class="LineNr"> 580 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> |  reply z|</span>
-<span id="L581" class="LineNr"> 581 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> |]</span>|
-<span id="L582" class="LineNr"> 582 </span>  <span class="Conceal">¦</span> ]
-<span id="L583" class="LineNr"> 583 </span>  ]
-<span id="L584" class="LineNr"> 584 </span>  <span class="Comment"># sandbox editor contains an instruction without storing outputs</span>
-<span id="L585" class="LineNr"> 585 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[foo]</span>  <span class="Comment"># contents of sandbox editor</span>
-<span id="L586" class="LineNr"> 586 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L587" class="LineNr"> 587 </span>  $clear-trace
-<span id="L588" class="LineNr"> 588 </span>  <span class="Comment"># run the code in the editors</span>
-<span id="L589" class="LineNr"> 589 </span>  assume-console [
-<span id="L590" class="LineNr"> 590 </span>  <span class="Conceal">¦</span> press F4
-<span id="L591" class="LineNr"> 591 </span>  ]
-<span id="L592" class="LineNr"> 592 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L593" class="LineNr"> 593 </span>  screen-should-contain [
-<span id="L594" class="LineNr"> 594 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L595" class="LineNr"> 595 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L596" class="LineNr"> 596 </span>  <span class="Conceal">¦</span><span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
-<span id="L597" class="LineNr"> 597 </span>  <span class="Conceal">¦</span><span class="Constant"> .  local-scope                                     ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L598" class="LineNr"> 598 </span>  <span class="Conceal">¦</span><span class="Constant"> .  z:num &lt;- add 2, 2                               ╎foo                                              .</span>
-<span id="L599" class="LineNr"> 599 </span>  <span class="Conceal">¦</span><span class="Constant"> .  reply z                                         ╎4                                                .</span>
-<span id="L600" class="LineNr"> 600 </span>  <span class="Conceal">¦</span><span class="Constant"> .]                                                 ╎─────────────────────────────────────────────────.</span>
+<span id="L467" class="LineNr"> 467 </span>  screen-should-contain [
+<span id="L468" class="LineNr"> 468 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
+<span id="L469" class="LineNr"> 469 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .abcd↩.</span>
+<span id="L470" class="LineNr"> 470 </span>  <span class="Conceal">¦</span><span class="Constant"> .e    .</span>
+<span id="L471" class="LineNr"> 471 </span>  <span class="Conceal">¦</span><span class="Constant"> .     .</span>
+<span id="L472" class="LineNr"> 472 </span>  ]
+<span id="L473" class="LineNr"> 473 </span>]
+<span id="L474" class="LineNr"> 474 </span>
+<span id="L475" class="LineNr"> 475 </span><span class="Comment"># assumes programming environment has no sandboxes; restores them from previous session</span>
+<span id="L476" class="LineNr"> 476 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L476'>restore-sandboxes</a> env:&amp;:environment, <a href='../088file.mu.html#L11'>resources</a>:&amp;:<a href='../088file.mu.html#L11'>resources</a><span class="muRecipe"> -&gt; </span>env:&amp;:environment [
+<span id="L477" class="LineNr"> 477 </span>  <span class="Constant">local-scope</span>
+<span id="L478" class="LineNr"> 478 </span>  <span class="Constant">load-ingredients</span>
+<span id="L479" class="LineNr"> 479 </span>  <span class="Comment"># read all scenarios, pushing them to end of a list of scenarios</span>
+<span id="L480" class="LineNr"> 480 </span>  idx:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<span id="L481" class="LineNr"> 481 </span>  curr:&amp;:sandbox <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<span id="L482" class="LineNr"> 482 </span>  <a href='../065duplex_list.mu.html#L36'>prev</a>:&amp;:sandbox <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<span id="L483" class="LineNr"> 483 </span>  <span class="Delimiter">{</span>
+<span id="L484" class="LineNr"> 484 </span>  <span class="Conceal">¦</span> filename:text <span class="Special">&lt;-</span> append <span class="Constant">[lesson/]</span>, idx
+<span id="L485" class="LineNr"> 485 </span>  <span class="Conceal">¦</span> contents:text <span class="Special">&lt;-</span> <a href='../088file.mu.html#L38'>slurp</a> <a href='../088file.mu.html#L11'>resources</a>, filename
+<span id="L486" class="LineNr"> 486 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> contents  <span class="Comment"># stop at first error; assuming file didn't exist</span>
+<span id="L487" class="LineNr"> 487 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span>      <span class="Comment"># todo: handle empty sandbox</span>
+<span id="L488" class="LineNr"> 488 </span>  <span class="Conceal">¦</span> <span class="Comment"># create new sandbox for file</span>
+<span id="L489" class="LineNr"> 489 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> new <span class="Constant">sandbox:type</span>
+<span id="L490" class="LineNr"> 490 </span>  <span class="Conceal">¦</span> *curr <span class="Special">&lt;-</span> put *curr, <span class="Constant">data:offset</span>, contents
+<span id="L491" class="LineNr"> 491 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> <a href='005-sandbox.mu.html#L491'>&lt;end-restore-sandbox&gt;</a></span>
+<span id="L492" class="LineNr"> 492 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L493" class="LineNr"> 493 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> idx
+<span id="L494" class="LineNr"> 494 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *env <span class="Special">&lt;-</span> put *env, <span class="Constant">sandbox:offset</span>, curr
+<span id="L495" class="LineNr"> 495 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L496" class="LineNr"> 496 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L497" class="LineNr"> 497 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> idx
+<span id="L498" class="LineNr"> 498 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *prev <span class="Special">&lt;-</span> put *prev, <span class="Constant">next-sandbox:offset</span>, curr
+<span id="L499" class="LineNr"> 499 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L500" class="LineNr"> 500 </span>  <span class="Conceal">¦</span> idx <span class="Special">&lt;-</span> add idx,<span class="Constant"> 1</span>
+<span id="L501" class="LineNr"> 501 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L36'>prev</a> <span class="Special">&lt;-</span> copy curr
+<span id="L502" class="LineNr"> 502 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
+<span id="L503" class="LineNr"> 503 </span>  <span class="Delimiter">}</span>
+<span id="L504" class="LineNr"> 504 </span>  <span class="Comment"># update sandbox count</span>
+<span id="L505" class="LineNr"> 505 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">number-of-sandboxes:offset</span>, idx
+<span id="L506" class="LineNr"> 506 </span>]
+<span id="L507" class="LineNr"> 507 </span>
+<span id="L508" class="LineNr"> 508 </span><span class="Comment"># print the fake sandbox screen to 'screen' with appropriate delimiters</span>
+<span id="L509" class="LineNr"> 509 </span><span class="Comment"># leave cursor at start of next line</span>
+<span id="L510" class="LineNr"> 510 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L510'>render-screen</a> <a href='../081print.mu.html#L16'>screen</a>:&amp;:<a href='../081print.mu.html#L16'>screen</a>, sandbox-screen:&amp;:<a href='../081print.mu.html#L16'>screen</a>, 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="L511" class="LineNr"> 511 </span>  <span class="Constant">local-scope</span>
+<span id="L512" class="LineNr"> 512 </span>  <span class="Constant">load-ingredients</span>
+<span id="L513" class="LineNr"> 513 </span>  <span class="muControl">return-unless</span> sandbox-screen
+<span id="L514" class="LineNr"> 514 </span>  <span class="Comment"># print 'screen:'</span>
+<span id="L515" class="LineNr"> 515 </span>  row <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[screen:]</span>, left, right, <span class="Constant">245/grey</span>, row
+<span id="L516" class="LineNr"> 516 </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, left
+<span id="L517" class="LineNr"> 517 </span>  <span class="Comment"># start printing sandbox-screen</span>
+<span id="L518" class="LineNr"> 518 </span>  column:num <span class="Special">&lt;-</span> copy left
+<span id="L519" class="LineNr"> 519 </span>  s-width:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L768'>screen-width</a> sandbox-screen
+<span id="L520" class="LineNr"> 520 </span>  s-height:num <span class="Special">&lt;-</span> <a href='../081print.mu.html#L782'>screen-height</a> sandbox-screen
+<span id="L521" class="LineNr"> 521 </span>  buf:&amp;:@:<a href='../081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> get *sandbox-screen, <span class="Constant">data:offset</span>
+<span id="L522" class="LineNr"> 522 </span>  stop-printing:num <span class="Special">&lt;-</span> add left, s-width,<span class="Constant"> 3</span>
+<span id="L523" class="LineNr"> 523 </span>  max-column:num <span class="Special">&lt;-</span> min stop-printing, right
+<span id="L524" class="LineNr"> 524 </span>  i:num <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<span id="L525" class="LineNr"> 525 </span>  len:num <span class="Special">&lt;-</span> length *buf
+<span id="L526" class="LineNr"> 526 </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="L527" class="LineNr"> 527 </span>  <span class="Delimiter">{</span>
+<span id="L528" class="LineNr"> 528 </span>  <span class="Conceal">¦</span> done?:bool <span class="Special">&lt;-</span> greater-or-equal i, len
+<span id="L529" class="LineNr"> 529 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
+<span id="L530" class="LineNr"> 530 </span>  <span class="Conceal">¦</span> done? <span class="Special">&lt;-</span> greater-or-equal row, <a href='../081print.mu.html#L782'>screen-height</a>
+<span id="L531" class="LineNr"> 531 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> done?
+<span id="L532" class="LineNr"> 532 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> copy left
+<span id="L533" class="LineNr"> 533 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, row, column
+<span id="L534" class="LineNr"> 534 </span>  <span class="Conceal">¦</span> <span class="Comment"># initial leader for each row: two spaces and a '.'</span>
+<span id="L535" class="LineNr"> 535 </span>  <span class="Conceal">¦</span> space:char <span class="Special">&lt;-</span> copy <span class="Constant">32/space</span>
+<span id="L536" class="LineNr"> 536 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space, <span class="Constant">245/grey</span>
+<span id="L537" class="LineNr"> 537 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space, <span class="Constant">245/grey</span>
+<span id="L538" class="LineNr"> 538 </span>  <span class="Conceal">¦</span> full-stop:char <span class="Special">&lt;-</span> copy <span class="Constant">46/period</span>
+<span id="L539" class="LineNr"> 539 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, full-stop, <span class="Constant">245/grey</span>
+<span id="L540" class="LineNr"> 540 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add left,<span class="Constant"> 3</span>
+<span id="L541" class="LineNr"> 541 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L542" class="LineNr"> 542 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># print row</span>
+<span id="L543" class="LineNr"> 543 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row-done?:bool <span class="Special">&lt;-</span> greater-or-equal column, max-column
+<span id="L544" class="LineNr"> 544 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> row-done?
+<span id="L545" class="LineNr"> 545 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> curr:<a href='../081print.mu.html#L27'>screen-cell</a> <span class="Special">&lt;-</span> index *buf, i
+<span id="L546" class="LineNr"> 546 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get curr, <span class="Constant">contents:offset</span>
+<span id="L547" class="LineNr"> 547 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> color:num <span class="Special">&lt;-</span> get curr, <span class="Constant">color:offset</span>
+<span id="L548" class="LineNr"> 548 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L549" class="LineNr"> 549 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># damp whites down to grey</span>
+<span id="L550" class="LineNr"> 550 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> white?:bool <span class="Special">&lt;-</span> equal color, <span class="Constant">7/white</span>
+<span id="L551" class="LineNr"> 551 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> white?
+<span id="L552" class="LineNr"> 552 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Conceal">¦</span> color <span class="Special">&lt;-</span> copy <span class="Constant">245/grey</span>
+<span id="L553" class="LineNr"> 553 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L554" class="LineNr"> 554 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, c, color
+<span id="L555" class="LineNr"> 555 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<span id="L556" class="LineNr"> 556 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> i <span class="Special">&lt;-</span> add i,<span class="Constant"> 1</span>
+<span id="L557" class="LineNr"> 557 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
+<span id="L558" class="LineNr"> 558 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L559" class="LineNr"> 559 </span>  <span class="Conceal">¦</span> <span class="Comment"># print final '.'</span>
+<span id="L560" class="LineNr"> 560 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, full-stop, <span class="Constant">245/grey</span>
+<span id="L561" class="LineNr"> 561 </span>  <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<span id="L562" class="LineNr"> 562 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L563" class="LineNr"> 563 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Comment"># clear rest of current line</span>
+<span id="L564" class="LineNr"> 564 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> line-done?:bool <span class="Special">&lt;-</span> greater-than column, right
+<span id="L565" class="LineNr"> 565 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> line-done?
+<span id="L566" class="LineNr"> 566 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, space
+<span id="L567" class="LineNr"> 567 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> column <span class="Special">&lt;-</span> add column,<span class="Constant"> 1</span>
+<span id="L568" class="LineNr"> 568 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop</span>
+<span id="L569" class="LineNr"> 569 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L570" class="LineNr"> 570 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
+<span id="L571" class="LineNr"> 571 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
+<span id="L572" class="LineNr"> 572 </span>  <span class="Delimiter">}</span>
+<span id="L573" class="LineNr"> 573 </span>]
+<span id="L574" class="LineNr"> 574 </span>
+<span id="L575" class="LineNr"> 575 </span><span class="muScenario">scenario</span> run-updates-results [
+<span id="L576" class="LineNr"> 576 </span>  <span class="Constant">local-scope</span>
+<span id="L577" class="LineNr"> 577 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<span id="L578" class="LineNr"> 578 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">12/height</span>
+<span id="L579" class="LineNr"> 579 </span>  <span class="Comment"># define a recipe (no indent for the 'add' line below so column numbers are more obvious)</span>
+<span id="L580" class="LineNr"> 580 </span>  assume-resources [
+<span id="L581" class="LineNr"> 581 </span>  <span class="Conceal">¦</span> <span class="Constant">[lesson/recipes.mu]</span> <span class="Special">&lt;-</span> [
+<span id="L582" class="LineNr"> 582 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> ||</span>
+<span id="L583" class="LineNr"> 583 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="Constant">|recipe</span> foo <span class="Constant">[|</span>
+<span id="L584" class="LineNr"> 584 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> |  local-scope|</span>
+<span id="L585" class="LineNr"> 585 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> |  z:num &lt;- add 2, 2|</span>
+<span id="L586" class="LineNr"> 586 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> |  reply z|</span>
+<span id="L587" class="LineNr"> 587 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> </span><span class="Conceal">¦</span><span class="Constant"> |]</span>|
+<span id="L588" class="LineNr"> 588 </span>  <span class="Conceal">¦</span> ]
+<span id="L589" class="LineNr"> 589 </span>  ]
+<span id="L590" class="LineNr"> 590 </span>  <span class="Comment"># sandbox editor contains an instruction without storing outputs</span>
+<span id="L591" class="LineNr"> 591 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[foo]</span>  <span class="Comment"># contents of sandbox editor</span>
+<span id="L592" class="LineNr"> 592 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L593" class="LineNr"> 593 </span>  $clear-trace
+<span id="L594" class="LineNr"> 594 </span>  <span class="Comment"># run the code in the editors</span>
+<span id="L595" class="LineNr"> 595 </span>  assume-console [
+<span id="L596" class="LineNr"> 596 </span>  <span class="Conceal">¦</span> press F4
+<span id="L597" class="LineNr"> 597 </span>  ]
+<span id="L598" class="LineNr"> 598 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L599" class="LineNr"> 599 </span>  screen-should-contain [
+<span id="L600" class="LineNr"> 600 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
 <span id="L601" class="LineNr"> 601 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L602" class="LineNr"> 602 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-<span id="L603" class="LineNr"> 603 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L604" class="LineNr"> 604 </span>  ]
-<span id="L605" class="LineNr"> 605 </span>  <span class="Comment"># no need to update editor</span>
-<span id="L606" class="LineNr"> 606 </span>  trace-should-not-contain [
-<span id="L607" class="LineNr"> 607 </span>  <span class="Conceal">¦</span> app: <a href='001-editor.mu.html#L107'>render</a> recipes
-<span id="L608" class="LineNr"> 608 </span>  ]
-<span id="L609" class="LineNr"> 609 </span>  <span class="Comment"># make a change (incrementing one of the args to 'add'), then rerun</span>
-<span id="L610" class="LineNr"> 610 </span>  assume-console [
-<span id="L611" class="LineNr"> 611 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 28</span>  <span class="Comment"># one past the value of the second arg</span>
-<span id="L612" class="LineNr"> 612 </span>  <span class="Conceal">¦</span> press backspace
-<span id="L613" class="LineNr"> 613 </span>  <span class="Conceal">¦</span> type <span class="Constant">[3]</span>
-<span id="L614" class="LineNr"> 614 </span>  <span class="Conceal">¦</span> press F4
-<span id="L615" class="LineNr"> 615 </span>  ]
-<span id="L616" class="LineNr"> 616 </span>  run [
-<span id="L617" class="LineNr"> 617 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L618" class="LineNr"> 618 </span>  ]
-<span id="L619" class="LineNr"> 619 </span>  <span class="Comment"># check that screen updates the result on the right</span>
-<span id="L620" class="LineNr"> 620 </span>  screen-should-contain [
-<span id="L621" class="LineNr"> 621 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L622" class="LineNr"> 622 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L623" class="LineNr"> 623 </span>  <span class="Conceal">¦</span><span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
-<span id="L624" class="LineNr"> 624 </span>  <span class="Conceal">¦</span><span class="Constant"> .  local-scope                                     ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L625" class="LineNr"> 625 </span>  <span class="Conceal">¦</span><span class="Constant"> .  z:num &lt;- add 2, 3                               ╎foo                                              .</span>
-<span id="L626" class="LineNr"> 626 </span>  <span class="Conceal">¦</span><span class="Constant"> .  reply z                                         ╎5                                                .</span>
-<span id="L627" class="LineNr"> 627 </span>  <span class="Conceal">¦</span><span class="Constant"> .]                                                 ╎─────────────────────────────────────────────────.</span>
+<span id="L602" class="LineNr"> 602 </span>  <span class="Conceal">¦</span><span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
+<span id="L603" class="LineNr"> 603 </span>  <span class="Conceal">¦</span><span class="Constant"> .  local-scope                                     ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L604" class="LineNr"> 604 </span>  <span class="Conceal">¦</span><span class="Constant"> .  z:num &lt;- add 2, 2                               ╎foo                                              .</span>
+<span id="L605" class="LineNr"> 605 </span>  <span class="Conceal">¦</span><span class="Constant"> .  reply z                                         ╎4                                                .</span>
+<span id="L606" class="LineNr"> 606 </span>  <span class="Conceal">¦</span><span class="Constant"> .]                                                 ╎─────────────────────────────────────────────────.</span>
+<span id="L607" class="LineNr"> 607 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L608" class="LineNr"> 608 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<span id="L609" class="LineNr"> 609 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L610" class="LineNr"> 610 </span>  ]
+<span id="L611" class="LineNr"> 611 </span>  <span class="Comment"># no need to update editor</span>
+<span id="L612" class="LineNr"> 612 </span>  trace-should-not-contain [
+<span id="L613" class="LineNr"> 613 </span>  <span class="Conceal">¦</span> app: <a href='001-editor.mu.html#L107'>render</a> recipes
+<span id="L614" class="LineNr"> 614 </span>  ]
+<span id="L615" class="LineNr"> 615 </span>  <span class="Comment"># make a change (incrementing one of the args to 'add'), then rerun</span>
+<span id="L616" class="LineNr"> 616 </span>  assume-console [
+<span id="L617" class="LineNr"> 617 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 28</span>  <span class="Comment"># one past the value of the second arg</span>
+<span id="L618" class="LineNr"> 618 </span>  <span class="Conceal">¦</span> press backspace
+<span id="L619" class="LineNr"> 619 </span>  <span class="Conceal">¦</span> type <span class="Constant">[3]</span>
+<span id="L620" class="LineNr"> 620 </span>  <span class="Conceal">¦</span> press F4
+<span id="L621" class="LineNr"> 621 </span>  ]
+<span id="L622" class="LineNr"> 622 </span>  run [
+<span id="L623" class="LineNr"> 623 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L624" class="LineNr"> 624 </span>  ]
+<span id="L625" class="LineNr"> 625 </span>  <span class="Comment"># check that screen updates the result on the right</span>
+<span id="L626" class="LineNr"> 626 </span>  screen-should-contain [
+<span id="L627" class="LineNr"> 627 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
 <span id="L628" class="LineNr"> 628 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L629" class="LineNr"> 629 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-<span id="L630" class="LineNr"> 630 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L631" class="LineNr"> 631 </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> run-instruction-manages-screen-per-sandbox [
-<span id="L635" class="LineNr"> 635 </span>  <span class="Constant">local-scope</span>
-<span id="L636" class="LineNr"> 636 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-<span id="L637" class="LineNr"> 637 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span>
-<span id="L638" class="LineNr"> 638 </span>  <span class="Comment"># empty recipes</span>
-<span id="L639" class="LineNr"> 639 </span>  assume-resources [
-<span id="L640" class="LineNr"> 640 </span>  ]
-<span id="L641" class="LineNr"> 641 </span>  <span class="Comment"># sandbox editor contains an instruction</span>
-<span id="L642" class="LineNr"> 642 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[print <a href='../081print.mu.html#L16'>screen</a>, 4]</span>  <span class="Comment"># contents of sandbox editor</span>
-<span id="L643" class="LineNr"> 643 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L644" class="LineNr"> 644 </span>  <span class="Comment"># run the code in the editor</span>
-<span id="L645" class="LineNr"> 645 </span>  assume-console [
-<span id="L646" class="LineNr"> 646 </span>  <span class="Conceal">¦</span> press F4
-<span id="L647" class="LineNr"> 647 </span>  ]
-<span id="L648" class="LineNr"> 648 </span>  run [
-<span id="L649" class="LineNr"> 649 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L650" class="LineNr"> 650 </span>  ]
-<span id="L651" class="LineNr"> 651 </span>  <span class="Comment"># check that it prints a little toy screen</span>
-<span id="L652" class="LineNr"> 652 </span>  screen-should-contain [
-<span id="L653" class="LineNr"> 653 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L654" class="LineNr"> 654 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L655" class="LineNr"> 655 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L656" class="LineNr"> 656 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L657" class="LineNr"> 657 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎print <a href='../081print.mu.html#L16'>screen</a>, 4                                  .</span>
-<span id="L658" class="LineNr"> 658 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎screen:                                          .</span>
-<span id="L659" class="LineNr"> 659 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .4                             .               .</span>
-<span id="L660" class="LineNr"> 660 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .                              .               .</span>
-<span id="L661" class="LineNr"> 661 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .                              .               .</span>
-<span id="L662" class="LineNr"> 662 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .                              .               .</span>
-<span id="L663" class="LineNr"> 663 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .                              .               .</span>
-<span id="L664" class="LineNr"> 664 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L665" class="LineNr"> 665 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L666" class="LineNr"> 666 </span>  ]
-<span id="L667" class="LineNr"> 667 </span>]
-<span id="L668" class="LineNr"> 668 </span>
-<span id="L669" class="LineNr"> 669 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L669'>editor-contents</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:text [
-<span id="L670" class="LineNr"> 670 </span>  <span class="Constant">local-scope</span>
-<span id="L671" class="LineNr"> 671 </span>  <span class="Constant">load-ingredients</span>
-<span id="L672" class="LineNr"> 672 </span>  buf:&amp;:<a href='../061text.mu.html#L126'>buffer</a>:char <span class="Special">&lt;-</span> <a href='../061text.mu.html#L131'>new-buffer</a><span class="Constant"> 80</span>
-<span id="L673" class="LineNr"> 673 </span>  curr:&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="L674" class="LineNr"> 674 </span>  <span class="Comment"># skip § sentinel</span>
-<span id="L675" class="LineNr"> 675 </span>  assert curr, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span>
-<span id="L676" class="LineNr"> 676 </span>  curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
-<span id="L677" class="LineNr"> 677 </span>  <span class="muControl">return-unless</span> curr,<span class="Constant"> 0</span>
-<span id="L678" class="LineNr"> 678 </span>  <span class="Delimiter">{</span>
-<span id="L679" class="LineNr"> 679 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
-<span id="L680" class="LineNr"> 680 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
-<span id="L681" class="LineNr"> 681 </span>  <span class="Conceal">¦</span> buf <span class="Special">&lt;-</span> append buf, c
-<span id="L682" class="LineNr"> 682 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
-<span id="L683" class="LineNr"> 683 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L684" class="LineNr"> 684 </span>  <span class="Delimiter">}</span>
-<span id="L685" class="LineNr"> 685 </span>  result <span class="Special">&lt;-</span> <a href='../061text.mu.html#L344'>buffer-to-array</a> buf
-<span id="L686" class="LineNr"> 686 </span>]
-<span id="L687" class="LineNr"> 687 </span>
-<span id="L688" class="LineNr"> 688 </span><span class="muScenario">scenario</span> editor-provides-edited-contents [
-<span id="L689" class="LineNr"> 689 </span>  <span class="Constant">local-scope</span>
-<span id="L690" class="LineNr"> 690 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
-<span id="L691" class="LineNr"> 691 </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="L692" class="LineNr"> 692 </span>  assume-console [
-<span id="L693" class="LineNr"> 693 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
-<span id="L694" class="LineNr"> 694 </span>  <span class="Conceal">¦</span> type <span class="Constant">[def]</span>
-<span id="L695" class="LineNr"> 695 </span>  ]
-<span id="L696" class="LineNr"> 696 </span>  run [
-<span id="L697" class="LineNr"> 697 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
-<span id="L698" class="LineNr"> 698 </span>  <span class="Conceal">¦</span> s:text <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L669'>editor-contents</a> e
-<span id="L699" class="LineNr"> 699 </span>  <span class="Conceal">¦</span> 1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s
-<span id="L700" class="LineNr"> 700 </span>  ]
-<span id="L701" class="LineNr"> 701 </span>  memory-should-contain [
-<span id="L702" class="LineNr"> 702 </span>  <span class="Conceal">¦</span> 1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abdefc]</span>
-<span id="L703" class="LineNr"> 703 </span>  ]
-<span id="L704" class="LineNr"> 704 </span>]
-<span id="L705" class="LineNr"> 705 </span>
-<span id="L706" class="LineNr"> 706 </span><span class="Comment"># keep the bottom of recipes from scrolling off the screen</span>
-<span id="L707" class="LineNr"> 707 </span>
-<span id="L708" class="LineNr"> 708 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor [
-<span id="L709" class="LineNr"> 709 </span>  <span class="Constant">local-scope</span>
-<span id="L710" class="LineNr"> 710 </span>  trace-until <span class="Constant">100/app</span>
-<span id="L711" class="LineNr"> 711 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-<span id="L712" class="LineNr"> 712 </span>  assume-resources [
-<span id="L713" class="LineNr"> 713 </span>  ]
-<span id="L714" class="LineNr"> 714 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
-<span id="L715" class="LineNr"> 715 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L716" class="LineNr"> 716 </span>  assume-console [
-<span id="L717" class="LineNr"> 717 </span>  <span class="Conceal">¦</span> press enter
-<span id="L718" class="LineNr"> 718 </span>  <span class="Conceal">¦</span> press down-arrow
+<span id="L629" class="LineNr"> 629 </span>  <span class="Conceal">¦</span><span class="Constant"> .recipe foo [                                      ╎─────────────────────────────────────────────────.</span>
+<span id="L630" class="LineNr"> 630 </span>  <span class="Conceal">¦</span><span class="Constant"> .  local-scope                                     ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L631" class="LineNr"> 631 </span>  <span class="Conceal">¦</span><span class="Constant"> .  z:num &lt;- add 2, 3                               ╎foo                                              .</span>
+<span id="L632" class="LineNr"> 632 </span>  <span class="Conceal">¦</span><span class="Constant"> .  reply z                                         ╎5                                                .</span>
+<span id="L633" class="LineNr"> 633 </span>  <span class="Conceal">¦</span><span class="Constant"> .]                                                 ╎─────────────────────────────────────────────────.</span>
+<span id="L634" class="LineNr"> 634 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L635" class="LineNr"> 635 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<span id="L636" class="LineNr"> 636 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L637" class="LineNr"> 637 </span>  ]
+<span id="L638" class="LineNr"> 638 </span>]
+<span id="L639" class="LineNr"> 639 </span>
+<span id="L640" class="LineNr"> 640 </span><span class="muScenario">scenario</span> run-instruction-manages-screen-per-sandbox [
+<span id="L641" class="LineNr"> 641 </span>  <span class="Constant">local-scope</span>
+<span id="L642" class="LineNr"> 642 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<span id="L643" class="LineNr"> 643 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">20/height</span>
+<span id="L644" class="LineNr"> 644 </span>  <span class="Comment"># empty recipes</span>
+<span id="L645" class="LineNr"> 645 </span>  assume-resources [
+<span id="L646" class="LineNr"> 646 </span>  ]
+<span id="L647" class="LineNr"> 647 </span>  <span class="Comment"># sandbox editor contains an instruction</span>
+<span id="L648" class="LineNr"> 648 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[print <a href='../081print.mu.html#L16'>screen</a>, 4]</span>  <span class="Comment"># contents of sandbox editor</span>
+<span id="L649" class="LineNr"> 649 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L650" class="LineNr"> 650 </span>  <span class="Comment"># run the code in the editor</span>
+<span id="L651" class="LineNr"> 651 </span>  assume-console [
+<span id="L652" class="LineNr"> 652 </span>  <span class="Conceal">¦</span> press F4
+<span id="L653" class="LineNr"> 653 </span>  ]
+<span id="L654" class="LineNr"> 654 </span>  run [
+<span id="L655" class="LineNr"> 655 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L656" class="LineNr"> 656 </span>  ]
+<span id="L657" class="LineNr"> 657 </span>  <span class="Comment"># check that it prints a little toy screen</span>
+<span id="L658" class="LineNr"> 658 </span>  screen-should-contain [
+<span id="L659" class="LineNr"> 659 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L660" class="LineNr"> 660 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L661" class="LineNr"> 661 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L662" class="LineNr"> 662 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L663" class="LineNr"> 663 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎print <a href='../081print.mu.html#L16'>screen</a>, 4                                  .</span>
+<span id="L664" class="LineNr"> 664 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎screen:                                          .</span>
+<span id="L665" class="LineNr"> 665 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .4                             .               .</span>
+<span id="L666" class="LineNr"> 666 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .                              .               .</span>
+<span id="L667" class="LineNr"> 667 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .                              .               .</span>
+<span id="L668" class="LineNr"> 668 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .                              .               .</span>
+<span id="L669" class="LineNr"> 669 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎  .                              .               .</span>
+<span id="L670" class="LineNr"> 670 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L671" class="LineNr"> 671 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L672" class="LineNr"> 672 </span>  ]
+<span id="L673" class="LineNr"> 673 </span>]
+<span id="L674" class="LineNr"> 674 </span>
+<span id="L675" class="LineNr"> 675 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L675'>editor-contents</a> editor:&amp;:editor<span class="muRecipe"> -&gt; </span>result:text [
+<span id="L676" class="LineNr"> 676 </span>  <span class="Constant">local-scope</span>
+<span id="L677" class="LineNr"> 677 </span>  <span class="Constant">load-ingredients</span>
+<span id="L678" class="LineNr"> 678 </span>  buf:&amp;:<a href='../061text.mu.html#L126'>buffer</a>:char <span class="Special">&lt;-</span> <a href='../061text.mu.html#L131'>new-buffer</a><span class="Constant"> 80</span>
+<span id="L679" class="LineNr"> 679 </span>  curr:&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="L680" class="LineNr"> 680 </span>  <span class="Comment"># skip § sentinel</span>
+<span id="L681" class="LineNr"> 681 </span>  assert curr, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span>
+<span id="L682" class="LineNr"> 682 </span>  curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
+<span id="L683" class="LineNr"> 683 </span>  <span class="muControl">return-unless</span> curr,<span class="Constant"> 0</span>
+<span id="L684" class="LineNr"> 684 </span>  <span class="Delimiter">{</span>
+<span id="L685" class="LineNr"> 685 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> curr
+<span id="L686" class="LineNr"> 686 </span>  <span class="Conceal">¦</span> c:char <span class="Special">&lt;-</span> get *curr, <span class="Constant">value:offset</span>
+<span id="L687" class="LineNr"> 687 </span>  <span class="Conceal">¦</span> buf <span class="Special">&lt;-</span> append buf, c
+<span id="L688" class="LineNr"> 688 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> <a href='../065duplex_list.mu.html#L29'>next</a> curr
+<span id="L689" class="LineNr"> 689 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
+<span id="L690" class="LineNr"> 690 </span>  <span class="Delimiter">}</span>
+<span id="L691" class="LineNr"> 691 </span>  result <span class="Special">&lt;-</span> <a href='../061text.mu.html#L344'>buffer-to-array</a> buf
+<span id="L692" class="LineNr"> 692 </span>]
+<span id="L693" class="LineNr"> 693 </span>
+<span id="L694" class="LineNr"> 694 </span><span class="muScenario">scenario</span> editor-provides-edited-contents [
+<span id="L695" class="LineNr"> 695 </span>  <span class="Constant">local-scope</span>
+<span id="L696" class="LineNr"> 696 </span>  assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span>
+<span id="L697" class="LineNr"> 697 </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="L698" class="LineNr"> 698 </span>  assume-console [
+<span id="L699" class="LineNr"> 699 </span>  <span class="Conceal">¦</span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span>
+<span id="L700" class="LineNr"> 700 </span>  <span class="Conceal">¦</span> type <span class="Constant">[def]</span>
+<span id="L701" class="LineNr"> 701 </span>  ]
+<span id="L702" class="LineNr"> 702 </span>  run [
+<span id="L703" class="LineNr"> 703 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L16'>editor-event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, e
+<span id="L704" class="LineNr"> 704 </span>  <span class="Conceal">¦</span> s:text <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L675'>editor-contents</a> e
+<span id="L705" class="LineNr"> 705 </span>  <span class="Conceal">¦</span> 1:@:char/<span class="Special">raw</span> <span class="Special">&lt;-</span> copy *s
+<span id="L706" class="LineNr"> 706 </span>  ]
+<span id="L707" class="LineNr"> 707 </span>  memory-should-contain [
+<span id="L708" class="LineNr"> 708 </span>  <span class="Conceal">¦</span> 1:array:character <span class="Special">&lt;-</span> <span class="Constant">[abdefc]</span>
+<span id="L709" class="LineNr"> 709 </span>  ]
+<span id="L710" class="LineNr"> 710 </span>]
+<span id="L711" class="LineNr"> 711 </span>
+<span id="L712" class="LineNr"> 712 </span><span class="Comment"># keep the bottom of recipes from scrolling off the screen</span>
+<span id="L713" class="LineNr"> 713 </span>
+<span id="L714" class="LineNr"> 714 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor [
+<span id="L715" class="LineNr"> 715 </span>  <span class="Constant">local-scope</span>
+<span id="L716" class="LineNr"> 716 </span>  trace-until <span class="Constant">100/app</span>
+<span id="L717" class="LineNr"> 717 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<span id="L718" class="LineNr"> 718 </span>  assume-resources [
 <span id="L719" class="LineNr"> 719 </span>  ]
-<span id="L720" class="LineNr"> 720 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L721" class="LineNr"> 721 </span>  <span class="Comment"># no scroll</span>
-<span id="L722" class="LineNr"> 722 </span>  screen-should-contain [
-<span id="L723" class="LineNr"> 723 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L724" class="LineNr"> 724 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L725" class="LineNr"> 725 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L726" class="LineNr"> 726 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-<span id="L727" class="LineNr"> 727 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L728" class="LineNr"> 728 </span>  ]
-<span id="L729" class="LineNr"> 729 </span>]
-<span id="L730" class="LineNr"> 730 </span>
-<span id="L731" class="LineNr"> 731 </span><span class="muScenario">scenario</span> cursor-down-in-recipe-editor [
-<span id="L732" class="LineNr"> 732 </span>  <span class="Constant">local-scope</span>
-<span id="L733" class="LineNr"> 733 </span>  trace-until <span class="Constant">100/app</span>
-<span id="L734" class="LineNr"> 734 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-<span id="L735" class="LineNr"> 735 </span>  assume-resources [
-<span id="L736" class="LineNr"> 736 </span>  ]
-<span id="L737" class="LineNr"> 737 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
-<span id="L738" class="LineNr"> 738 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L739" class="LineNr"> 739 </span>  assume-console [
-<span id="L740" class="LineNr"> 740 </span>  <span class="Conceal">¦</span> press enter
-<span id="L741" class="LineNr"> 741 </span>  <span class="Conceal">¦</span> press up-arrow
-<span id="L742" class="LineNr"> 742 </span>  <span class="Conceal">¦</span> press down-arrow  <span class="Comment"># while cursor isn't at bottom</span>
-<span id="L743" class="LineNr"> 743 </span>  ]
-<span id="L744" class="LineNr"> 744 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L745" class="LineNr"> 745 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-<span id="L746" class="LineNr"> 746 </span>  print <a href='../081print.mu.html#L16'>screen</a>, cursor
-<span id="L747" class="LineNr"> 747 </span>  <span class="Comment"># cursor moves back to bottom</span>
-<span id="L748" class="LineNr"> 748 </span>  screen-should-contain [
-<span id="L749" class="LineNr"> 749 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L750" class="LineNr"> 750 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L751" class="LineNr"> 751 </span>  <span class="Conceal">¦</span><span class="Constant"> .␣                                                 ╎─────────────────────────────────────────────────.</span>
-<span id="L752" class="LineNr"> 752 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-<span id="L753" class="LineNr"> 753 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L754" class="LineNr"> 754 </span>  ]
-<span id="L755" class="LineNr"> 755 </span>]
-<span id="L756" class="LineNr"> 756 </span>
-<span id="L757" class="LineNr"> 757 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor-2 [
-<span id="L758" class="LineNr"> 758 </span>  <span class="Constant">local-scope</span>
-<span id="L759" class="LineNr"> 759 </span>  trace-until <span class="Constant">100/app</span>
-<span id="L760" class="LineNr"> 760 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-<span id="L761" class="LineNr"> 761 </span>  assume-resources [
-<span id="L762" class="LineNr"> 762 </span>  ]
-<span id="L763" class="LineNr"> 763 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
-<span id="L764" class="LineNr"> 764 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L765" class="LineNr"> 765 </span>  assume-console [
-<span id="L766" class="LineNr"> 766 </span>  <span class="Conceal">¦</span> <span class="Comment"># add a line</span>
-<span id="L767" class="LineNr"> 767 </span>  <span class="Conceal">¦</span> press enter
-<span id="L768" class="LineNr"> 768 </span>  <span class="Conceal">¦</span> <span class="Comment"># cursor back to top line</span>
-<span id="L769" class="LineNr"> 769 </span>  <span class="Conceal">¦</span> press up-arrow
-<span id="L770" class="LineNr"> 770 </span>  <span class="Conceal">¦</span> <span class="Comment"># try to scroll</span>
-<span id="L771" class="LineNr"> 771 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>  <span class="Comment"># or ctrl-f</span>
-<span id="L772" class="LineNr"> 772 </span>  ]
-<span id="L773" class="LineNr"> 773 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L774" class="LineNr"> 774 </span>  <span class="Comment"># no scroll, and cursor remains at top line</span>
-<span id="L775" class="LineNr"> 775 </span>  screen-should-contain [
-<span id="L776" class="LineNr"> 776 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L777" class="LineNr"> 777 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L778" class="LineNr"> 778 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L779" class="LineNr"> 779 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
-<span id="L780" class="LineNr"> 780 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L781" class="LineNr"> 781 </span>  ]
-<span id="L782" class="LineNr"> 782 </span>]
-<span id="L783" class="LineNr"> 783 </span>
-<span id="L784" class="LineNr"> 784 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor-3 [
-<span id="L785" class="LineNr"> 785 </span>  <span class="Constant">local-scope</span>
-<span id="L786" class="LineNr"> 786 </span>  trace-until <span class="Constant">100/app</span>
-<span id="L787" class="LineNr"> 787 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-<span id="L788" class="LineNr"> 788 </span>  assume-resources [
-<span id="L789" class="LineNr"> 789 </span>  ]
-<span id="L790" class="LineNr"> 790 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[ab</span>
-<span id="L791" class="LineNr"> 791 </span><span class="Constant">cd]</span>
-<span id="L792" class="LineNr"> 792 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L793" class="LineNr"> 793 </span>  assume-console [
-<span id="L794" class="LineNr"> 794 </span>  <span class="Conceal">¦</span> <span class="Comment"># add a line</span>
-<span id="L795" class="LineNr"> 795 </span>  <span class="Conceal">¦</span> press enter
-<span id="L796" class="LineNr"> 796 </span>  <span class="Conceal">¦</span> <span class="Comment"># switch to sandbox</span>
-<span id="L797" class="LineNr"> 797 </span>  <span class="Conceal">¦</span> press ctrl-n
-<span id="L798" class="LineNr"> 798 </span>  <span class="Conceal">¦</span> <span class="Comment"># move cursor</span>
-<span id="L799" class="LineNr"> 799 </span>  <span class="Conceal">¦</span> press down-arrow
-<span id="L800" class="LineNr"> 800 </span>  ]
-<span id="L801" class="LineNr"> 801 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L802" class="LineNr"> 802 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-<span id="L803" class="LineNr"> 803 </span>  print <a href='../081print.mu.html#L16'>screen</a>, cursor
-<span id="L804" class="LineNr"> 804 </span>  <span class="Comment"># no scroll on recipe side, cursor moves on sandbox side</span>
-<span id="L805" class="LineNr"> 805 </span>  screen-should-contain [
-<span id="L806" class="LineNr"> 806 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L807" class="LineNr"> 807 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎ab                                               .</span>
-<span id="L808" class="LineNr"> 808 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣d                                               .</span>
-<span id="L809" class="LineNr"> 809 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L810" class="LineNr"> 810 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L811" class="LineNr"> 811 </span>  ]
-<span id="L812" class="LineNr"> 812 </span>]
-<span id="L813" class="LineNr"> 813 </span>
-<span id="L814" class="LineNr"> 814 </span><span class="Comment"># scrolling through sandboxes</span>
-<span id="L815" class="LineNr"> 815 </span>
-<span id="L816" class="LineNr"> 816 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-sandbox-editor [
-<span id="L817" class="LineNr"> 817 </span>  <span class="Constant">local-scope</span>
-<span id="L818" class="LineNr"> 818 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-<span id="L819" class="LineNr"> 819 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-<span id="L820" class="LineNr"> 820 </span>  <span class="Comment"># initialize</span>
-<span id="L821" class="LineNr"> 821 </span>  assume-resources [
-<span id="L822" class="LineNr"> 822 </span>  ]
-<span id="L823" class="LineNr"> 823 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[add 2, 2]</span>
-<span id="L824" class="LineNr"> 824 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L825" class="LineNr"> 825 </span>  assume-console [
-<span id="L826" class="LineNr"> 826 </span>  <span class="Conceal">¦</span> <span class="Comment"># create a sandbox</span>
-<span id="L827" class="LineNr"> 827 </span>  <span class="Conceal">¦</span> press F4
+<span id="L720" class="LineNr"> 720 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
+<span id="L721" class="LineNr"> 721 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L722" class="LineNr"> 722 </span>  assume-console [
+<span id="L723" class="LineNr"> 723 </span>  <span class="Conceal">¦</span> press enter
+<span id="L724" class="LineNr"> 724 </span>  <span class="Conceal">¦</span> press down-arrow
+<span id="L725" class="LineNr"> 725 </span>  ]
+<span id="L726" class="LineNr"> 726 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L727" class="LineNr"> 727 </span>  <span class="Comment"># no scroll</span>
+<span id="L728" class="LineNr"> 728 </span>  screen-should-contain [
+<span id="L729" class="LineNr"> 729 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L730" class="LineNr"> 730 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L731" class="LineNr"> 731 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L732" class="LineNr"> 732 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<span id="L733" class="LineNr"> 733 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L734" class="LineNr"> 734 </span>  ]
+<span id="L735" class="LineNr"> 735 </span>]
+<span id="L736" class="LineNr"> 736 </span>
+<span id="L737" class="LineNr"> 737 </span><span class="muScenario">scenario</span> cursor-down-in-recipe-editor [
+<span id="L738" class="LineNr"> 738 </span>  <span class="Constant">local-scope</span>
+<span id="L739" class="LineNr"> 739 </span>  trace-until <span class="Constant">100/app</span>
+<span id="L740" class="LineNr"> 740 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<span id="L741" class="LineNr"> 741 </span>  assume-resources [
+<span id="L742" class="LineNr"> 742 </span>  ]
+<span id="L743" class="LineNr"> 743 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
+<span id="L744" class="LineNr"> 744 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L745" class="LineNr"> 745 </span>  assume-console [
+<span id="L746" class="LineNr"> 746 </span>  <span class="Conceal">¦</span> press enter
+<span id="L747" class="LineNr"> 747 </span>  <span class="Conceal">¦</span> press up-arrow
+<span id="L748" class="LineNr"> 748 </span>  <span class="Conceal">¦</span> press down-arrow  <span class="Comment"># while cursor isn't at bottom</span>
+<span id="L749" class="LineNr"> 749 </span>  ]
+<span id="L750" class="LineNr"> 750 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L751" class="LineNr"> 751 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<span id="L752" class="LineNr"> 752 </span>  print <a href='../081print.mu.html#L16'>screen</a>, cursor
+<span id="L753" class="LineNr"> 753 </span>  <span class="Comment"># cursor moves back to bottom</span>
+<span id="L754" class="LineNr"> 754 </span>  screen-should-contain [
+<span id="L755" class="LineNr"> 755 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L756" class="LineNr"> 756 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L757" class="LineNr"> 757 </span>  <span class="Conceal">¦</span><span class="Constant"> .␣                                                 ╎─────────────────────────────────────────────────.</span>
+<span id="L758" class="LineNr"> 758 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<span id="L759" class="LineNr"> 759 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L760" class="LineNr"> 760 </span>  ]
+<span id="L761" class="LineNr"> 761 </span>]
+<span id="L762" class="LineNr"> 762 </span>
+<span id="L763" class="LineNr"> 763 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor-2 [
+<span id="L764" class="LineNr"> 764 </span>  <span class="Constant">local-scope</span>
+<span id="L765" class="LineNr"> 765 </span>  trace-until <span class="Constant">100/app</span>
+<span id="L766" class="LineNr"> 766 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<span id="L767" class="LineNr"> 767 </span>  assume-resources [
+<span id="L768" class="LineNr"> 768 </span>  ]
+<span id="L769" class="LineNr"> 769 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
+<span id="L770" class="LineNr"> 770 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L771" class="LineNr"> 771 </span>  assume-console [
+<span id="L772" class="LineNr"> 772 </span>  <span class="Conceal">¦</span> <span class="Comment"># add a line</span>
+<span id="L773" class="LineNr"> 773 </span>  <span class="Conceal">¦</span> press enter
+<span id="L774" class="LineNr"> 774 </span>  <span class="Conceal">¦</span> <span class="Comment"># cursor back to top line</span>
+<span id="L775" class="LineNr"> 775 </span>  <span class="Conceal">¦</span> press up-arrow
+<span id="L776" class="LineNr"> 776 </span>  <span class="Conceal">¦</span> <span class="Comment"># try to scroll</span>
+<span id="L777" class="LineNr"> 777 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>  <span class="Comment"># or ctrl-f</span>
+<span id="L778" class="LineNr"> 778 </span>  ]
+<span id="L779" class="LineNr"> 779 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L780" class="LineNr"> 780 </span>  <span class="Comment"># no scroll, and cursor remains at top line</span>
+<span id="L781" class="LineNr"> 781 </span>  screen-should-contain [
+<span id="L782" class="LineNr"> 782 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L783" class="LineNr"> 783 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L784" class="LineNr"> 784 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L785" class="LineNr"> 785 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎                                                 .</span>
+<span id="L786" class="LineNr"> 786 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L787" class="LineNr"> 787 </span>  ]
+<span id="L788" class="LineNr"> 788 </span>]
+<span id="L789" class="LineNr"> 789 </span>
+<span id="L790" class="LineNr"> 790 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-recipe-editor-3 [
+<span id="L791" class="LineNr"> 791 </span>  <span class="Constant">local-scope</span>
+<span id="L792" class="LineNr"> 792 </span>  trace-until <span class="Constant">100/app</span>
+<span id="L793" class="LineNr"> 793 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<span id="L794" class="LineNr"> 794 </span>  assume-resources [
+<span id="L795" class="LineNr"> 795 </span>  ]
+<span id="L796" class="LineNr"> 796 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[ab</span>
+<span id="L797" class="LineNr"> 797 </span><span class="Constant">cd]</span>
+<span id="L798" class="LineNr"> 798 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L799" class="LineNr"> 799 </span>  assume-console [
+<span id="L800" class="LineNr"> 800 </span>  <span class="Conceal">¦</span> <span class="Comment"># add a line</span>
+<span id="L801" class="LineNr"> 801 </span>  <span class="Conceal">¦</span> press enter
+<span id="L802" class="LineNr"> 802 </span>  <span class="Conceal">¦</span> <span class="Comment"># switch to sandbox</span>
+<span id="L803" class="LineNr"> 803 </span>  <span class="Conceal">¦</span> press ctrl-n
+<span id="L804" class="LineNr"> 804 </span>  <span class="Conceal">¦</span> <span class="Comment"># move cursor</span>
+<span id="L805" class="LineNr"> 805 </span>  <span class="Conceal">¦</span> press down-arrow
+<span id="L806" class="LineNr"> 806 </span>  ]
+<span id="L807" class="LineNr"> 807 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L808" class="LineNr"> 808 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<span id="L809" class="LineNr"> 809 </span>  print <a href='../081print.mu.html#L16'>screen</a>, cursor
+<span id="L810" class="LineNr"> 810 </span>  <span class="Comment"># no scroll on recipe side, cursor moves on sandbox side</span>
+<span id="L811" class="LineNr"> 811 </span>  screen-should-contain [
+<span id="L812" class="LineNr"> 812 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L813" class="LineNr"> 813 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎ab                                               .</span>
+<span id="L814" class="LineNr"> 814 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣d                                               .</span>
+<span id="L815" class="LineNr"> 815 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L816" class="LineNr"> 816 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L817" class="LineNr"> 817 </span>  ]
+<span id="L818" class="LineNr"> 818 </span>]
+<span id="L819" class="LineNr"> 819 </span>
+<span id="L820" class="LineNr"> 820 </span><span class="Comment"># scrolling through sandboxes</span>
+<span id="L821" class="LineNr"> 821 </span>
+<span id="L822" class="LineNr"> 822 </span><span class="muScenario">scenario</span> scrolling-down-past-bottom-of-sandbox-editor [
+<span id="L823" class="LineNr"> 823 </span>  <span class="Constant">local-scope</span>
+<span id="L824" class="LineNr"> 824 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<span id="L825" class="LineNr"> 825 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<span id="L826" class="LineNr"> 826 </span>  <span class="Comment"># initialize</span>
+<span id="L827" class="LineNr"> 827 </span>  assume-resources [
 <span id="L828" class="LineNr"> 828 </span>  ]
-<span id="L829" class="LineNr"> 829 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L830" class="LineNr"> 830 </span>  screen-should-contain [
-<span id="L831" class="LineNr"> 831 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L832" class="LineNr"> 832 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L833" class="LineNr"> 833 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L834" class="LineNr"> 834 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L835" class="LineNr"> 835 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L836" class="LineNr"> 836 </span>  ]
-<span id="L837" class="LineNr"> 837 </span>  <span class="Comment"># switch to sandbox window and hit 'page-down'</span>
-<span id="L838" class="LineNr"> 838 </span>  assume-console [
-<span id="L839" class="LineNr"> 839 </span>  <span class="Conceal">¦</span> press ctrl-n
-<span id="L840" class="LineNr"> 840 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
-<span id="L841" class="LineNr"> 841 </span>  ]
-<span id="L842" class="LineNr"> 842 </span>  run [
-<span id="L843" class="LineNr"> 843 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L844" class="LineNr"> 844 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-<span id="L845" class="LineNr"> 845 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
-<span id="L846" class="LineNr"> 846 </span>  ]
-<span id="L847" class="LineNr"> 847 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
-<span id="L848" class="LineNr"> 848 </span>  <span class="Comment"># cursor moves to first sandbox</span>
-<span id="L849" class="LineNr"> 849 </span>  screen-should-contain [
-<span id="L850" class="LineNr"> 850 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L851" class="LineNr"> 851 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L852" class="LineNr"> 852 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣   edit       copy       to recipe    delete    .</span>
-<span id="L853" class="LineNr"> 853 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L854" class="LineNr"> 854 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
-<span id="L855" class="LineNr"> 855 </span>  ]
-<span id="L856" class="LineNr"> 856 </span>  <span class="Comment"># hit 'page-up'</span>
-<span id="L857" class="LineNr"> 857 </span>  assume-console [
-<span id="L858" class="LineNr"> 858 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
-<span id="L859" class="LineNr"> 859 </span>  ]
-<span id="L860" class="LineNr"> 860 </span>  run [
-<span id="L861" class="LineNr"> 861 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L862" class="LineNr"> 862 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-<span id="L863" class="LineNr"> 863 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
-<span id="L864" class="LineNr"> 864 </span>  ]
-<span id="L865" class="LineNr"> 865 </span>  <span class="Comment"># sandbox editor displays again, cursor is in editor</span>
-<span id="L866" class="LineNr"> 866 </span>  screen-should-contain [
-<span id="L867" class="LineNr"> 867 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L868" class="LineNr"> 868 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣                                                .</span>
-<span id="L869" class="LineNr"> 869 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L870" class="LineNr"> 870 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L871" class="LineNr"> 871 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L872" class="LineNr"> 872 </span>  ]
-<span id="L873" class="LineNr"> 873 </span>]
-<span id="L874" class="LineNr"> 874 </span>
-<span id="L875" class="LineNr"> 875 </span><span class="Comment"># page-down on sandbox side updates render-from to scroll sandboxes</span>
-<span id="L876" class="LineNr"> 876 </span><span class="muRecipe">after</span> <span class="Constant"><a href='004-programming-environment.mu.html#L62'>&lt;global-keypress&gt;</a></span> [
-<span id="L877" class="LineNr"> 877 </span>  <span class="Delimiter">{</span>
-<span id="L878" class="LineNr"> 878 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-in-focus?
-<span id="L879" class="LineNr"> 879 </span>  <span class="Conceal">¦</span> page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
-<span id="L880" class="LineNr"> 880 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> page-down?
-<span id="L881" class="LineNr"> 881 </span>  <span class="Conceal">¦</span> sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-<span id="L882" class="LineNr"> 882 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox
-<span id="L883" class="LineNr"> 883 </span>  <span class="Conceal">¦</span> <span class="Comment"># slide down if possible</span>
-<span id="L884" class="LineNr"> 884 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
-<span id="L885" class="LineNr"> 885 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-<span id="L886" class="LineNr"> 886 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> number-of-sandboxes:num <span class="Special">&lt;-</span> get *env, <span class="Constant">number-of-sandboxes:offset</span>
-<span id="L887" class="LineNr"> 887 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> max:num <span class="Special">&lt;-</span> subtract number-of-sandboxes,<span class="Constant"> 1</span>
-<span id="L888" class="LineNr"> 888 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-end?:bool <span class="Special">&lt;-</span> greater-or-equal render-from, max
-<span id="L889" class="LineNr"> 889 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop-if</span> at-end?, <span class="Constant">+next-event</span>  <span class="Comment"># render nothing</span>
-<span id="L890" class="LineNr"> 890 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> render-from <span class="Special">&lt;-</span> add render-from,<span class="Constant"> 1</span>
-<span id="L891" class="LineNr"> 891 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>, render-from
-<span id="L892" class="LineNr"> 892 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
-<span id="L893" class="LineNr"> 893 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> render-sandbox-side <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L894" class="LineNr"> 894 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L472'>update-cursor</a> <a href='../081print.mu.html#L16'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env
-<span id="L895" class="LineNr"> 895 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-<span id="L896" class="LineNr"> 896 </span>  <span class="Delimiter">}</span>
-<span id="L897" class="LineNr"> 897 </span>]
-<span id="L898" class="LineNr"> 898 </span>
-<span id="L899" class="LineNr"> 899 </span><span class="Comment"># update-cursor takes render-from into account</span>
-<span id="L900" class="LineNr"> 900 </span><span class="muRecipe">after</span> <span class="Constant"><a href='004-programming-environment.mu.html#L475'>&lt;update-cursor-special-cases&gt;</a></span> [
-<span id="L901" class="LineNr"> 901 </span>  <span class="Delimiter">{</span>
-<span id="L902" class="LineNr"> 902 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-in-focus?
-<span id="L903" class="LineNr"> 903 </span>  <span class="Conceal">¦</span> render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-<span id="L904" class="LineNr"> 904 </span>  <span class="Conceal">¦</span> scrolling?:bool <span class="Special">&lt;-</span> greater-or-equal render-from,<span class="Constant"> 0</span>
-<span id="L905" class="LineNr"> 905 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> scrolling?
-<span id="L906" class="LineNr"> 906 </span>  <span class="Conceal">¦</span> cursor-column:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
-<span id="L907" class="LineNr"> 907 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">2/row</span>, cursor-column  <span class="Comment"># highlighted sandbox will always start at row 2</span>
-<span id="L908" class="LineNr"> 908 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
-<span id="L909" class="LineNr"> 909 </span>  <span class="Delimiter">}</span>
-<span id="L910" class="LineNr"> 910 </span>]
-<span id="L911" class="LineNr"> 911 </span>
-<span id="L912" class="LineNr"> 912 </span><span class="Comment"># 'page-up' on sandbox side is like 'page-down': updates render-from when necessary</span>
-<span id="L913" class="LineNr"> 913 </span><span class="muRecipe">after</span> <span class="Constant"><a href='004-programming-environment.mu.html#L62'>&lt;global-keypress&gt;</a></span> [
-<span id="L914" class="LineNr"> 914 </span>  <span class="Delimiter">{</span>
-<span id="L915" class="LineNr"> 915 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-in-focus?
-<span id="L916" class="LineNr"> 916 </span>  <span class="Conceal">¦</span> page-up?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65519/page-up</span>
-<span id="L917" class="LineNr"> 917 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> page-up?
-<span id="L918" class="LineNr"> 918 </span>  <span class="Conceal">¦</span> render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
-<span id="L919" class="LineNr"> 919 </span>  <span class="Conceal">¦</span> at-beginning?:bool <span class="Special">&lt;-</span> equal render-from,<span class="Constant"> -1</span>
-<span id="L920" class="LineNr"> 920 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-beginning?
-<span id="L921" class="LineNr"> 921 </span>  <span class="Conceal">¦</span> render-from <span class="Special">&lt;-</span> subtract render-from,<span class="Constant"> 1</span>
-<span id="L922" class="LineNr"> 922 </span>  <span class="Conceal">¦</span> *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>, render-from
-<span id="L923" class="LineNr"> 923 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> render-sandbox-side <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L924" class="LineNr"> 924 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L472'>update-cursor</a> <a href='../081print.mu.html#L16'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env
-<span id="L925" class="LineNr"> 925 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-<span id="L926" class="LineNr"> 926 </span>  <span class="Delimiter">}</span>
-<span id="L927" class="LineNr"> 927 </span>]
-<span id="L928" class="LineNr"> 928 </span>
-<span id="L929" class="LineNr"> 929 </span><span class="Comment"># sandbox belonging to 'env' whose next-sandbox is 'in'</span>
-<span id="L930" class="LineNr"> 930 </span><span class="Comment"># return 0 if there's no such sandbox, either because 'in' doesn't exist in 'env', or because it's the first sandbox</span>
-<span id="L931" class="LineNr"> 931 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L931'>previous-sandbox</a> env:&amp;:environment, in:&amp;:sandbox<span class="muRecipe"> -&gt; </span>out:&amp;:sandbox [
-<span id="L932" class="LineNr"> 932 </span>  <span class="Constant">local-scope</span>
-<span id="L933" class="LineNr"> 933 </span>  <span class="Constant">load-ingredients</span>
-<span id="L934" class="LineNr"> 934 </span>  curr:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-<span id="L935" class="LineNr"> 935 </span>  <span class="muControl">return-unless</span> curr, <span class="Constant">0/nil</span>
-<span id="L936" class="LineNr"> 936 </span>  <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:sandbox <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
-<span id="L937" class="LineNr"> 937 </span>  <span class="Delimiter">{</span>
-<span id="L938" class="LineNr"> 938 </span>  <span class="Conceal">¦</span> <span class="muControl">return-unless</span> <a href='../065duplex_list.mu.html#L29'>next</a>, <span class="Constant">0/nil</span>
-<span id="L939" class="LineNr"> 939 </span>  <span class="Conceal">¦</span> found?:bool <span class="Special">&lt;-</span> equal <a href='../065duplex_list.mu.html#L29'>next</a>, in
-<span id="L940" class="LineNr"> 940 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> found?
-<span id="L941" class="LineNr"> 941 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L29'>next</a>
-<span id="L942" class="LineNr"> 942 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L29'>next</a> <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
-<span id="L943" class="LineNr"> 943 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
-<span id="L944" class="LineNr"> 944 </span>  <span class="Delimiter">}</span>
-<span id="L945" class="LineNr"> 945 </span>  <span class="muControl">return</span> curr
-<span id="L946" class="LineNr"> 946 </span>]
-<span id="L947" class="LineNr"> 947 </span>
-<span id="L948" class="LineNr"> 948 </span><span class="muScenario">scenario</span> scrolling-through-multiple-sandboxes [
-<span id="L949" class="LineNr"> 949 </span>  <span class="Constant">local-scope</span>
-<span id="L950" class="LineNr"> 950 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-<span id="L951" class="LineNr"> 951 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-<span id="L952" class="LineNr"> 952 </span>  <span class="Comment"># initialize environment</span>
-<span id="L953" class="LineNr"> 953 </span>  assume-resources [
-<span id="L954" class="LineNr"> 954 </span>  ]
-<span id="L955" class="LineNr"> 955 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
-<span id="L956" class="LineNr"> 956 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L957" class="LineNr"> 957 </span>  <span class="Comment"># create 2 sandboxes</span>
-<span id="L958" class="LineNr"> 958 </span>  assume-console [
-<span id="L959" class="LineNr"> 959 </span>  <span class="Conceal">¦</span> press ctrl-n
-<span id="L960" class="LineNr"> 960 </span>  <span class="Conceal">¦</span> type <span class="Constant">[add 2, 2]</span>
-<span id="L961" class="LineNr"> 961 </span>  <span class="Conceal">¦</span> press F4
-<span id="L962" class="LineNr"> 962 </span>  <span class="Conceal">¦</span> type <span class="Constant">[add 1, 1]</span>
-<span id="L963" class="LineNr"> 963 </span>  <span class="Conceal">¦</span> press F4
-<span id="L964" class="LineNr"> 964 </span>  ]
-<span id="L965" class="LineNr"> 965 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L966" class="LineNr"> 966 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-<span id="L967" class="LineNr"> 967 </span>  print <a href='../081print.mu.html#L16'>screen</a>, cursor
-<span id="L968" class="LineNr"> 968 </span>  screen-should-contain [
-<span id="L969" class="LineNr"> 969 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L970" class="LineNr"> 970 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣                                                .</span>
-<span id="L971" class="LineNr"> 971 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L972" class="LineNr"> 972 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L973" class="LineNr"> 973 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L974" class="LineNr"> 974 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L975" class="LineNr"> 975 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L976" class="LineNr"> 976 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
-<span id="L977" class="LineNr"> 977 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L978" class="LineNr"> 978 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
-<span id="L979" class="LineNr"> 979 </span>  ]
-<span id="L980" class="LineNr"> 980 </span>  <span class="Comment"># hit 'page-down'</span>
-<span id="L981" class="LineNr"> 981 </span>  assume-console [
-<span id="L982" class="LineNr"> 982 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
-<span id="L983" class="LineNr"> 983 </span>  ]
-<span id="L984" class="LineNr"> 984 </span>  run [
-<span id="L985" class="LineNr"> 985 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L986" class="LineNr"> 986 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-<span id="L987" class="LineNr"> 987 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
-<span id="L988" class="LineNr"> 988 </span>  ]
-<span id="L989" class="LineNr"> 989 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
-<span id="L990" class="LineNr"> 990 </span>  <span class="Comment"># cursor moves to first sandbox</span>
-<span id="L991" class="LineNr"> 991 </span>  screen-should-contain [
-<span id="L992" class="LineNr"> 992 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L993" class="LineNr"> 993 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L994" class="LineNr"> 994 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣   edit       copy       to recipe    delete    .</span>
-<span id="L995" class="LineNr"> 995 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L996" class="LineNr"> 996 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L997" class="LineNr"> 997 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L998" class="LineNr"> 998 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
-<span id="L999" class="LineNr"> 999 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L1000" class="LineNr">1000 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
-<span id="L1001" class="LineNr">1001 </span>  ]
-<span id="L1002" class="LineNr">1002 </span>  <span class="Comment"># hit 'page-down' again</span>
-<span id="L1003" class="LineNr">1003 </span>  assume-console [
-<span id="L1004" class="LineNr">1004 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
-<span id="L1005" class="LineNr">1005 </span>  ]
-<span id="L1006" class="LineNr">1006 </span>  run [
-<span id="L1007" class="LineNr">1007 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1008" class="LineNr">1008 </span>  ]
-<span id="L1009" class="LineNr">1009 </span>  <span class="Comment"># just second sandbox displayed</span>
-<span id="L1010" class="LineNr">1010 </span>  screen-should-contain [
-<span id="L1011" class="LineNr">1011 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1012" class="LineNr">1012 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1013" class="LineNr">1013 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit       copy       to recipe    delete    .</span>
-<span id="L1014" class="LineNr">1014 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L1015" class="LineNr">1015 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
-<span id="L1016" class="LineNr">1016 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1017" class="LineNr">1017 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L1018" class="LineNr">1018 </span>  ]
-<span id="L1019" class="LineNr">1019 </span>  <span class="Comment"># hit 'page-down' again</span>
-<span id="L1020" class="LineNr">1020 </span>  assume-console [
-<span id="L1021" class="LineNr">1021 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
-<span id="L1022" class="LineNr">1022 </span>  ]
-<span id="L1023" class="LineNr">1023 </span>  run [
-<span id="L1024" class="LineNr">1024 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1025" class="LineNr">1025 </span>  ]
-<span id="L1026" class="LineNr">1026 </span>  <span class="Comment"># no change</span>
-<span id="L1027" class="LineNr">1027 </span>  screen-should-contain [
-<span id="L1028" class="LineNr">1028 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1029" class="LineNr">1029 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1030" class="LineNr">1030 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit       copy       to recipe    delete    .</span>
-<span id="L1031" class="LineNr">1031 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L1032" class="LineNr">1032 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
-<span id="L1033" class="LineNr">1033 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1034" class="LineNr">1034 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L1035" class="LineNr">1035 </span>  ]
-<span id="L1036" class="LineNr">1036 </span>  <span class="Comment"># hit 'page-up'</span>
-<span id="L1037" class="LineNr">1037 </span>  assume-console [
-<span id="L1038" class="LineNr">1038 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
-<span id="L1039" class="LineNr">1039 </span>  ]
-<span id="L1040" class="LineNr">1040 </span>  run [
-<span id="L1041" class="LineNr">1041 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1042" class="LineNr">1042 </span>  ]
-<span id="L1043" class="LineNr">1043 </span>  <span class="Comment"># back to displaying both sandboxes without editor</span>
-<span id="L1044" class="LineNr">1044 </span>  screen-should-contain [
-<span id="L1045" class="LineNr">1045 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1046" class="LineNr">1046 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1047" class="LineNr">1047 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit       copy       to recipe    delete    .</span>
-<span id="L1048" class="LineNr">1048 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L1049" class="LineNr">1049 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L1050" class="LineNr">1050 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1051" class="LineNr">1051 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
-<span id="L1052" class="LineNr">1052 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L1053" class="LineNr">1053 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
-<span id="L1054" class="LineNr">1054 </span>  ]
-<span id="L1055" class="LineNr">1055 </span>  <span class="Comment"># hit 'page-up' again</span>
-<span id="L1056" class="LineNr">1056 </span>  assume-console [
-<span id="L1057" class="LineNr">1057 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
-<span id="L1058" class="LineNr">1058 </span>  ]
-<span id="L1059" class="LineNr">1059 </span>  run [
-<span id="L1060" class="LineNr">1060 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1061" class="LineNr">1061 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-<span id="L1062" class="LineNr">1062 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
-<span id="L1063" class="LineNr">1063 </span>  ]
-<span id="L1064" class="LineNr">1064 </span>  <span class="Comment"># back to displaying both sandboxes as well as editor</span>
-<span id="L1065" class="LineNr">1065 </span>  screen-should-contain [
-<span id="L1066" class="LineNr">1066 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1067" class="LineNr">1067 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣                                                .</span>
-<span id="L1068" class="LineNr">1068 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L1069" class="LineNr">1069 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L1070" class="LineNr">1070 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L1071" class="LineNr">1071 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L1072" class="LineNr">1072 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1073" class="LineNr">1073 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
-<span id="L1074" class="LineNr">1074 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L1075" class="LineNr">1075 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
-<span id="L1076" class="LineNr">1076 </span>  ]
-<span id="L1077" class="LineNr">1077 </span>  <span class="Comment"># hit 'page-up' again</span>
-<span id="L1078" class="LineNr">1078 </span>  assume-console [
-<span id="L1079" class="LineNr">1079 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
-<span id="L1080" class="LineNr">1080 </span>  ]
-<span id="L1081" class="LineNr">1081 </span>  run [
-<span id="L1082" class="LineNr">1082 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1083" class="LineNr">1083 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
-<span id="L1084" class="LineNr">1084 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
-<span id="L1085" class="LineNr">1085 </span>  ]
-<span id="L1086" class="LineNr">1086 </span>  <span class="Comment"># no change</span>
-<span id="L1087" class="LineNr">1087 </span>  screen-should-contain [
-<span id="L1088" class="LineNr">1088 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1089" class="LineNr">1089 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣                                                .</span>
-<span id="L1090" class="LineNr">1090 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L1091" class="LineNr">1091 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L1092" class="LineNr">1092 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L1093" class="LineNr">1093 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L1094" class="LineNr">1094 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1095" class="LineNr">1095 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
-<span id="L1096" class="LineNr">1096 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
-<span id="L1097" class="LineNr">1097 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
-<span id="L1098" class="LineNr">1098 </span>  ]
-<span id="L1099" class="LineNr">1099 </span>]
-<span id="L1100" class="LineNr">1100 </span>
-<span id="L1101" class="LineNr">1101 </span><span class="muScenario">scenario</span> scrolling-manages-sandbox-index-correctly [
-<span id="L1102" class="LineNr">1102 </span>  <span class="Constant">local-scope</span>
-<span id="L1103" class="LineNr">1103 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
-<span id="L1104" class="LineNr">1104 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
-<span id="L1105" class="LineNr">1105 </span>  <span class="Comment"># initialize environment</span>
-<span id="L1106" class="LineNr">1106 </span>  assume-resources [
-<span id="L1107" class="LineNr">1107 </span>  ]
-<span id="L1108" class="LineNr">1108 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
-<span id="L1109" class="LineNr">1109 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L1110" class="LineNr">1110 </span>  <span class="Comment"># create a sandbox</span>
-<span id="L1111" class="LineNr">1111 </span>  assume-console [
-<span id="L1112" class="LineNr">1112 </span>  <span class="Conceal">¦</span> press ctrl-n
-<span id="L1113" class="LineNr">1113 </span>  <span class="Conceal">¦</span> type <span class="Constant">[add 1, 1]</span>
-<span id="L1114" class="LineNr">1114 </span>  <span class="Conceal">¦</span> press F4
-<span id="L1115" class="LineNr">1115 </span>  ]
-<span id="L1116" class="LineNr">1116 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1117" class="LineNr">1117 </span>  screen-should-contain [
-<span id="L1118" class="LineNr">1118 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1119" class="LineNr">1119 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L1120" class="LineNr">1120 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L1121" class="LineNr">1121 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L1122" class="LineNr">1122 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L1123" class="LineNr">1123 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L1124" class="LineNr">1124 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L829" class="LineNr"> 829 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[add 2, 2]</span>
+<span id="L830" class="LineNr"> 830 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L831" class="LineNr"> 831 </span>  assume-console [
+<span id="L832" class="LineNr"> 832 </span>  <span class="Conceal">¦</span> <span class="Comment"># create a sandbox</span>
+<span id="L833" class="LineNr"> 833 </span>  <span class="Conceal">¦</span> press F4
+<span id="L834" class="LineNr"> 834 </span>  ]
+<span id="L835" class="LineNr"> 835 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L836" class="LineNr"> 836 </span>  screen-should-contain [
+<span id="L837" class="LineNr"> 837 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L838" class="LineNr"> 838 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L839" class="LineNr"> 839 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L840" class="LineNr"> 840 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L841" class="LineNr"> 841 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L842" class="LineNr"> 842 </span>  ]
+<span id="L843" class="LineNr"> 843 </span>  <span class="Comment"># switch to sandbox window and hit 'page-down'</span>
+<span id="L844" class="LineNr"> 844 </span>  assume-console [
+<span id="L845" class="LineNr"> 845 </span>  <span class="Conceal">¦</span> press ctrl-n
+<span id="L846" class="LineNr"> 846 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
+<span id="L847" class="LineNr"> 847 </span>  ]
+<span id="L848" class="LineNr"> 848 </span>  run [
+<span id="L849" class="LineNr"> 849 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L850" class="LineNr"> 850 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<span id="L851" class="LineNr"> 851 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
+<span id="L852" class="LineNr"> 852 </span>  ]
+<span id="L853" class="LineNr"> 853 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
+<span id="L854" class="LineNr"> 854 </span>  <span class="Comment"># cursor moves to first sandbox</span>
+<span id="L855" class="LineNr"> 855 </span>  screen-should-contain [
+<span id="L856" class="LineNr"> 856 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L857" class="LineNr"> 857 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L858" class="LineNr"> 858 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣   edit       copy       to recipe    delete    .</span>
+<span id="L859" class="LineNr"> 859 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L860" class="LineNr"> 860 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
+<span id="L861" class="LineNr"> 861 </span>  ]
+<span id="L862" class="LineNr"> 862 </span>  <span class="Comment"># hit 'page-up'</span>
+<span id="L863" class="LineNr"> 863 </span>  assume-console [
+<span id="L864" class="LineNr"> 864 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
+<span id="L865" class="LineNr"> 865 </span>  ]
+<span id="L866" class="LineNr"> 866 </span>  run [
+<span id="L867" class="LineNr"> 867 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L868" class="LineNr"> 868 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<span id="L869" class="LineNr"> 869 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
+<span id="L870" class="LineNr"> 870 </span>  ]
+<span id="L871" class="LineNr"> 871 </span>  <span class="Comment"># sandbox editor displays again, cursor is in editor</span>
+<span id="L872" class="LineNr"> 872 </span>  screen-should-contain [
+<span id="L873" class="LineNr"> 873 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L874" class="LineNr"> 874 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣                                                .</span>
+<span id="L875" class="LineNr"> 875 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L876" class="LineNr"> 876 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L877" class="LineNr"> 877 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L878" class="LineNr"> 878 </span>  ]
+<span id="L879" class="LineNr"> 879 </span>]
+<span id="L880" class="LineNr"> 880 </span>
+<span id="L881" class="LineNr"> 881 </span><span class="Comment"># page-down on sandbox side updates render-from to scroll sandboxes</span>
+<span id="L882" class="LineNr"> 882 </span><span class="muRecipe">after</span> <span class="Constant"><a href='004-programming-environment.mu.html#L62'>&lt;global-keypress&gt;</a></span> [
+<span id="L883" class="LineNr"> 883 </span>  <span class="Delimiter">{</span>
+<span id="L884" class="LineNr"> 884 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-in-focus?
+<span id="L885" class="LineNr"> 885 </span>  <span class="Conceal">¦</span> page-down?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65518/page-down</span>
+<span id="L886" class="LineNr"> 886 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> page-down?
+<span id="L887" class="LineNr"> 887 </span>  <span class="Conceal">¦</span> sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<span id="L888" class="LineNr"> 888 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox
+<span id="L889" class="LineNr"> 889 </span>  <span class="Conceal">¦</span> <span class="Comment"># slide down if possible</span>
+<span id="L890" class="LineNr"> 890 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
+<span id="L891" class="LineNr"> 891 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<span id="L892" class="LineNr"> 892 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> number-of-sandboxes:num <span class="Special">&lt;-</span> get *env, <span class="Constant">number-of-sandboxes:offset</span>
+<span id="L893" class="LineNr"> 893 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> max:num <span class="Special">&lt;-</span> subtract number-of-sandboxes,<span class="Constant"> 1</span>
+<span id="L894" class="LineNr"> 894 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> at-end?:bool <span class="Special">&lt;-</span> greater-or-equal render-from, max
+<span id="L895" class="LineNr"> 895 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">loop-if</span> at-end?, <span class="Constant">+next-event</span>  <span class="Comment"># render nothing</span>
+<span id="L896" class="LineNr"> 896 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> render-from <span class="Special">&lt;-</span> add render-from,<span class="Constant"> 1</span>
+<span id="L897" class="LineNr"> 897 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>, render-from
+<span id="L898" class="LineNr"> 898 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
+<span id="L899" class="LineNr"> 899 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> render-sandbox-side <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L900" class="LineNr"> 900 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L472'>update-cursor</a> <a href='../081print.mu.html#L16'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env
+<span id="L901" class="LineNr"> 901 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<span id="L902" class="LineNr"> 902 </span>  <span class="Delimiter">}</span>
+<span id="L903" class="LineNr"> 903 </span>]
+<span id="L904" class="LineNr"> 904 </span>
+<span id="L905" class="LineNr"> 905 </span><span class="Comment"># update-cursor takes render-from into account</span>
+<span id="L906" class="LineNr"> 906 </span><span class="muRecipe">after</span> <span class="Constant"><a href='004-programming-environment.mu.html#L475'>&lt;update-cursor-special-cases&gt;</a></span> [
+<span id="L907" class="LineNr"> 907 </span>  <span class="Delimiter">{</span>
+<span id="L908" class="LineNr"> 908 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-in-focus?
+<span id="L909" class="LineNr"> 909 </span>  <span class="Conceal">¦</span> render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<span id="L910" class="LineNr"> 910 </span>  <span class="Conceal">¦</span> scrolling?:bool <span class="Special">&lt;-</span> greater-or-equal render-from,<span class="Constant"> 0</span>
+<span id="L911" class="LineNr"> 911 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> scrolling?
+<span id="L912" class="LineNr"> 912 </span>  <span class="Conceal">¦</span> cursor-column:num <span class="Special">&lt;-</span> get *current-sandbox, <span class="Constant">left:offset</span>
+<span id="L913" class="LineNr"> 913 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> move-cursor <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">2/row</span>, cursor-column  <span class="Comment"># highlighted sandbox will always start at row 2</span>
+<span id="L914" class="LineNr"> 914 </span>  <span class="Conceal">¦</span> <span class="muControl">return</span>
+<span id="L915" class="LineNr"> 915 </span>  <span class="Delimiter">}</span>
+<span id="L916" class="LineNr"> 916 </span>]
+<span id="L917" class="LineNr"> 917 </span>
+<span id="L918" class="LineNr"> 918 </span><span class="Comment"># 'page-up' on sandbox side is like 'page-down': updates render-from when necessary</span>
+<span id="L919" class="LineNr"> 919 </span><span class="muRecipe">after</span> <span class="Constant"><a href='004-programming-environment.mu.html#L62'>&lt;global-keypress&gt;</a></span> [
+<span id="L920" class="LineNr"> 920 </span>  <span class="Delimiter">{</span>
+<span id="L921" class="LineNr"> 921 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-in-focus?
+<span id="L922" class="LineNr"> 922 </span>  <span class="Conceal">¦</span> page-up?:bool <span class="Special">&lt;-</span> equal k, <span class="Constant">65519/page-up</span>
+<span id="L923" class="LineNr"> 923 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> page-up?
+<span id="L924" class="LineNr"> 924 </span>  <span class="Conceal">¦</span> render-from:num <span class="Special">&lt;-</span> get *env, <span class="Constant">render-from:offset</span>
+<span id="L925" class="LineNr"> 925 </span>  <span class="Conceal">¦</span> at-beginning?:bool <span class="Special">&lt;-</span> equal render-from,<span class="Constant"> -1</span>
+<span id="L926" class="LineNr"> 926 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> at-beginning?
+<span id="L927" class="LineNr"> 927 </span>  <span class="Conceal">¦</span> render-from <span class="Special">&lt;-</span> subtract render-from,<span class="Constant"> 1</span>
+<span id="L928" class="LineNr"> 928 </span>  <span class="Conceal">¦</span> *env <span class="Special">&lt;-</span> put *env, <span class="Constant">render-from:offset</span>, render-from
+<span id="L929" class="LineNr"> 929 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> render-sandbox-side <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L930" class="LineNr"> 930 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L472'>update-cursor</a> <a href='../081print.mu.html#L16'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env
+<span id="L931" class="LineNr"> 931 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<span id="L932" class="LineNr"> 932 </span>  <span class="Delimiter">}</span>
+<span id="L933" class="LineNr"> 933 </span>]
+<span id="L934" class="LineNr"> 934 </span>
+<span id="L935" class="LineNr"> 935 </span><span class="Comment"># sandbox belonging to 'env' whose next-sandbox is 'in'</span>
+<span id="L936" class="LineNr"> 936 </span><span class="Comment"># return 0 if there's no such sandbox, either because 'in' doesn't exist in 'env', or because it's the first sandbox</span>
+<span id="L937" class="LineNr"> 937 </span><span class="muRecipe">def</span> <a href='005-sandbox.mu.html#L937'>previous-sandbox</a> env:&amp;:environment, in:&amp;:sandbox<span class="muRecipe"> -&gt; </span>out:&amp;:sandbox [
+<span id="L938" class="LineNr"> 938 </span>  <span class="Constant">local-scope</span>
+<span id="L939" class="LineNr"> 939 </span>  <span class="Constant">load-ingredients</span>
+<span id="L940" class="LineNr"> 940 </span>  curr:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<span id="L941" class="LineNr"> 941 </span>  <span class="muControl">return-unless</span> curr, <span class="Constant">0/nil</span>
+<span id="L942" class="LineNr"> 942 </span>  <a href='../065duplex_list.mu.html#L29'>next</a>:&amp;:sandbox <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
+<span id="L943" class="LineNr"> 943 </span>  <span class="Delimiter">{</span>
+<span id="L944" class="LineNr"> 944 </span>  <span class="Conceal">¦</span> <span class="muControl">return-unless</span> <a href='../065duplex_list.mu.html#L29'>next</a>, <span class="Constant">0/nil</span>
+<span id="L945" class="LineNr"> 945 </span>  <span class="Conceal">¦</span> found?:bool <span class="Special">&lt;-</span> equal <a href='../065duplex_list.mu.html#L29'>next</a>, in
+<span id="L946" class="LineNr"> 946 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> found?
+<span id="L947" class="LineNr"> 947 </span>  <span class="Conceal">¦</span> curr <span class="Special">&lt;-</span> copy <a href='../065duplex_list.mu.html#L29'>next</a>
+<span id="L948" class="LineNr"> 948 </span>  <span class="Conceal">¦</span> <a href='../065duplex_list.mu.html#L29'>next</a> <span class="Special">&lt;-</span> get *curr, <span class="Constant">next-sandbox:offset</span>
+<span id="L949" class="LineNr"> 949 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
+<span id="L950" class="LineNr"> 950 </span>  <span class="Delimiter">}</span>
+<span id="L951" class="LineNr"> 951 </span>  <span class="muControl">return</span> curr
+<span id="L952" class="LineNr"> 952 </span>]
+<span id="L953" class="LineNr"> 953 </span>
+<span id="L954" class="LineNr"> 954 </span><span class="muScenario">scenario</span> scrolling-through-multiple-sandboxes [
+<span id="L955" class="LineNr"> 955 </span>  <span class="Constant">local-scope</span>
+<span id="L956" class="LineNr"> 956 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<span id="L957" class="LineNr"> 957 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<span id="L958" class="LineNr"> 958 </span>  <span class="Comment"># initialize environment</span>
+<span id="L959" class="LineNr"> 959 </span>  assume-resources [
+<span id="L960" class="LineNr"> 960 </span>  ]
+<span id="L961" class="LineNr"> 961 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
+<span id="L962" class="LineNr"> 962 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L963" class="LineNr"> 963 </span>  <span class="Comment"># create 2 sandboxes</span>
+<span id="L964" class="LineNr"> 964 </span>  assume-console [
+<span id="L965" class="LineNr"> 965 </span>  <span class="Conceal">¦</span> press ctrl-n
+<span id="L966" class="LineNr"> 966 </span>  <span class="Conceal">¦</span> type <span class="Constant">[add 2, 2]</span>
+<span id="L967" class="LineNr"> 967 </span>  <span class="Conceal">¦</span> press F4
+<span id="L968" class="LineNr"> 968 </span>  <span class="Conceal">¦</span> type <span class="Constant">[add 1, 1]</span>
+<span id="L969" class="LineNr"> 969 </span>  <span class="Conceal">¦</span> press F4
+<span id="L970" class="LineNr"> 970 </span>  ]
+<span id="L971" class="LineNr"> 971 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L972" class="LineNr"> 972 </span>  cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<span id="L973" class="LineNr"> 973 </span>  print <a href='../081print.mu.html#L16'>screen</a>, cursor
+<span id="L974" class="LineNr"> 974 </span>  screen-should-contain [
+<span id="L975" class="LineNr"> 975 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L976" class="LineNr"> 976 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣                                                .</span>
+<span id="L977" class="LineNr"> 977 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L978" class="LineNr"> 978 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L979" class="LineNr"> 979 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L980" class="LineNr"> 980 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L981" class="LineNr"> 981 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L982" class="LineNr"> 982 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
+<span id="L983" class="LineNr"> 983 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L984" class="LineNr"> 984 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
+<span id="L985" class="LineNr"> 985 </span>  ]
+<span id="L986" class="LineNr"> 986 </span>  <span class="Comment"># hit 'page-down'</span>
+<span id="L987" class="LineNr"> 987 </span>  assume-console [
+<span id="L988" class="LineNr"> 988 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
+<span id="L989" class="LineNr"> 989 </span>  ]
+<span id="L990" class="LineNr"> 990 </span>  run [
+<span id="L991" class="LineNr"> 991 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L992" class="LineNr"> 992 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<span id="L993" class="LineNr"> 993 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
+<span id="L994" class="LineNr"> 994 </span>  ]
+<span id="L995" class="LineNr"> 995 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
+<span id="L996" class="LineNr"> 996 </span>  <span class="Comment"># cursor moves to first sandbox</span>
+<span id="L997" class="LineNr"> 997 </span>  screen-should-contain [
+<span id="L998" class="LineNr"> 998 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L999" class="LineNr"> 999 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1000" class="LineNr">1000 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣   edit       copy       to recipe    delete    .</span>
+<span id="L1001" class="LineNr">1001 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L1002" class="LineNr">1002 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L1003" class="LineNr">1003 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1004" class="LineNr">1004 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
+<span id="L1005" class="LineNr">1005 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L1006" class="LineNr">1006 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
+<span id="L1007" class="LineNr">1007 </span>  ]
+<span id="L1008" class="LineNr">1008 </span>  <span class="Comment"># hit 'page-down' again</span>
+<span id="L1009" class="LineNr">1009 </span>  assume-console [
+<span id="L1010" class="LineNr">1010 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
+<span id="L1011" class="LineNr">1011 </span>  ]
+<span id="L1012" class="LineNr">1012 </span>  run [
+<span id="L1013" class="LineNr">1013 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1014" class="LineNr">1014 </span>  ]
+<span id="L1015" class="LineNr">1015 </span>  <span class="Comment"># just second sandbox displayed</span>
+<span id="L1016" class="LineNr">1016 </span>  screen-should-contain [
+<span id="L1017" class="LineNr">1017 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L1018" class="LineNr">1018 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1019" class="LineNr">1019 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit       copy       to recipe    delete    .</span>
+<span id="L1020" class="LineNr">1020 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L1021" class="LineNr">1021 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
+<span id="L1022" class="LineNr">1022 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1023" class="LineNr">1023 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L1024" class="LineNr">1024 </span>  ]
+<span id="L1025" class="LineNr">1025 </span>  <span class="Comment"># hit 'page-down' again</span>
+<span id="L1026" class="LineNr">1026 </span>  assume-console [
+<span id="L1027" class="LineNr">1027 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
+<span id="L1028" class="LineNr">1028 </span>  ]
+<span id="L1029" class="LineNr">1029 </span>  run [
+<span id="L1030" class="LineNr">1030 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1031" class="LineNr">1031 </span>  ]
+<span id="L1032" class="LineNr">1032 </span>  <span class="Comment"># no change</span>
+<span id="L1033" class="LineNr">1033 </span>  screen-should-contain [
+<span id="L1034" class="LineNr">1034 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L1035" class="LineNr">1035 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1036" class="LineNr">1036 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1   edit       copy       to recipe    delete    .</span>
+<span id="L1037" class="LineNr">1037 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L1038" class="LineNr">1038 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
+<span id="L1039" class="LineNr">1039 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1040" class="LineNr">1040 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L1041" class="LineNr">1041 </span>  ]
+<span id="L1042" class="LineNr">1042 </span>  <span class="Comment"># hit 'page-up'</span>
+<span id="L1043" class="LineNr">1043 </span>  assume-console [
+<span id="L1044" class="LineNr">1044 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
+<span id="L1045" class="LineNr">1045 </span>  ]
+<span id="L1046" class="LineNr">1046 </span>  run [
+<span id="L1047" class="LineNr">1047 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1048" class="LineNr">1048 </span>  ]
+<span id="L1049" class="LineNr">1049 </span>  <span class="Comment"># back to displaying both sandboxes without editor</span>
+<span id="L1050" class="LineNr">1050 </span>  screen-should-contain [
+<span id="L1051" class="LineNr">1051 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L1052" class="LineNr">1052 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1053" class="LineNr">1053 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit       copy       to recipe    delete    .</span>
+<span id="L1054" class="LineNr">1054 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L1055" class="LineNr">1055 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L1056" class="LineNr">1056 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1057" class="LineNr">1057 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
+<span id="L1058" class="LineNr">1058 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L1059" class="LineNr">1059 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
+<span id="L1060" class="LineNr">1060 </span>  ]
+<span id="L1061" class="LineNr">1061 </span>  <span class="Comment"># hit 'page-up' again</span>
+<span id="L1062" class="LineNr">1062 </span>  assume-console [
+<span id="L1063" class="LineNr">1063 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
+<span id="L1064" class="LineNr">1064 </span>  ]
+<span id="L1065" class="LineNr">1065 </span>  run [
+<span id="L1066" class="LineNr">1066 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1067" class="LineNr">1067 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<span id="L1068" class="LineNr">1068 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
+<span id="L1069" class="LineNr">1069 </span>  ]
+<span id="L1070" class="LineNr">1070 </span>  <span class="Comment"># back to displaying both sandboxes as well as editor</span>
+<span id="L1071" class="LineNr">1071 </span>  screen-should-contain [
+<span id="L1072" class="LineNr">1072 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L1073" class="LineNr">1073 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣                                                .</span>
+<span id="L1074" class="LineNr">1074 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L1075" class="LineNr">1075 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L1076" class="LineNr">1076 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L1077" class="LineNr">1077 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L1078" class="LineNr">1078 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1079" class="LineNr">1079 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
+<span id="L1080" class="LineNr">1080 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L1081" class="LineNr">1081 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
+<span id="L1082" class="LineNr">1082 </span>  ]
+<span id="L1083" class="LineNr">1083 </span>  <span class="Comment"># hit 'page-up' again</span>
+<span id="L1084" class="LineNr">1084 </span>  assume-console [
+<span id="L1085" class="LineNr">1085 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
+<span id="L1086" class="LineNr">1086 </span>  ]
+<span id="L1087" class="LineNr">1087 </span>  run [
+<span id="L1088" class="LineNr">1088 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1089" class="LineNr">1089 </span>  <span class="Conceal">¦</span> cursor:char <span class="Special">&lt;-</span> copy <span class="Constant">9251/␣</span>
+<span id="L1090" class="LineNr">1090 </span>  <span class="Conceal">¦</span> print <a href='../081print.mu.html#L16'>screen</a>, cursor
+<span id="L1091" class="LineNr">1091 </span>  ]
+<span id="L1092" class="LineNr">1092 </span>  <span class="Comment"># no change</span>
+<span id="L1093" class="LineNr">1093 </span>  screen-should-contain [
+<span id="L1094" class="LineNr">1094 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L1095" class="LineNr">1095 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎␣                                                .</span>
+<span id="L1096" class="LineNr">1096 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L1097" class="LineNr">1097 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L1098" class="LineNr">1098 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L1099" class="LineNr">1099 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L1100" class="LineNr">1100 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1101" class="LineNr">1101 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎1   edit       copy       to recipe    delete    .</span>
+<span id="L1102" class="LineNr">1102 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 2, 2                                         .</span>
+<span id="L1103" class="LineNr">1103 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎4                                                .</span>
+<span id="L1104" class="LineNr">1104 </span>  ]
+<span id="L1105" class="LineNr">1105 </span>]
+<span id="L1106" class="LineNr">1106 </span>
+<span id="L1107" class="LineNr">1107 </span><span class="muScenario">scenario</span> scrolling-manages-sandbox-index-correctly [
+<span id="L1108" class="LineNr">1108 </span>  <span class="Constant">local-scope</span>
+<span id="L1109" class="LineNr">1109 </span>  trace-until <span class="Constant">100/app</span>  <span class="Comment"># trace too long</span>
+<span id="L1110" class="LineNr">1110 </span>  assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span>
+<span id="L1111" class="LineNr">1111 </span>  <span class="Comment"># initialize environment</span>
+<span id="L1112" class="LineNr">1112 </span>  assume-resources [
+<span id="L1113" class="LineNr">1113 </span>  ]
+<span id="L1114" class="LineNr">1114 </span>  env:&amp;:environment <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L21'>new-programming-environment</a> <a href='../088file.mu.html#L11'>resources</a>, <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[]</span>
+<span id="L1115" class="LineNr">1115 </span>  <a href='004-programming-environment.mu.html#L402'>render-all</a> <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L1116" class="LineNr">1116 </span>  <span class="Comment"># create a sandbox</span>
+<span id="L1117" class="LineNr">1117 </span>  assume-console [
+<span id="L1118" class="LineNr">1118 </span>  <span class="Conceal">¦</span> press ctrl-n
+<span id="L1119" class="LineNr">1119 </span>  <span class="Conceal">¦</span> type <span class="Constant">[add 1, 1]</span>
+<span id="L1120" class="LineNr">1120 </span>  <span class="Conceal">¦</span> press F4
+<span id="L1121" class="LineNr">1121 </span>  ]
+<span id="L1122" class="LineNr">1122 </span>  <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1123" class="LineNr">1123 </span>  screen-should-contain [
+<span id="L1124" class="LineNr">1124 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
 <span id="L1125" class="LineNr">1125 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L1126" class="LineNr">1126 </span>  ]
-<span id="L1127" class="LineNr">1127 </span>  <span class="Comment"># hit 'page-down' and 'page-up' a couple of times. sandbox index should be stable</span>
-<span id="L1128" class="LineNr">1128 </span>  assume-console [
-<span id="L1129" class="LineNr">1129 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
-<span id="L1130" class="LineNr">1130 </span>  ]
-<span id="L1131" class="LineNr">1131 </span>  run [
-<span id="L1132" class="LineNr">1132 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1133" class="LineNr">1133 </span>  ]
-<span id="L1134" class="LineNr">1134 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
-<span id="L1135" class="LineNr">1135 </span>  <span class="Comment"># cursor moves to first sandbox</span>
-<span id="L1136" class="LineNr">1136 </span>  screen-should-contain [
-<span id="L1137" class="LineNr">1137 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1138" class="LineNr">1138 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1139" class="LineNr">1139 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit       copy       to recipe    delete    .</span>
-<span id="L1140" class="LineNr">1140 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L1141" class="LineNr">1141 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L1142" class="LineNr">1142 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1143" class="LineNr">1143 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L1144" class="LineNr">1144 </span>  ]
-<span id="L1145" class="LineNr">1145 </span>  <span class="Comment"># hit 'page-up' again</span>
-<span id="L1146" class="LineNr">1146 </span>  assume-console [
-<span id="L1147" class="LineNr">1147 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
-<span id="L1148" class="LineNr">1148 </span>  ]
-<span id="L1149" class="LineNr">1149 </span>  run [
-<span id="L1150" class="LineNr">1150 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1151" class="LineNr">1151 </span>  ]
-<span id="L1152" class="LineNr">1152 </span>  <span class="Comment"># back to displaying both sandboxes as well as editor</span>
-<span id="L1153" class="LineNr">1153 </span>  screen-should-contain [
-<span id="L1154" class="LineNr">1154 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1155" class="LineNr">1155 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L1156" class="LineNr">1156 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
-<span id="L1157" class="LineNr">1157 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
-<span id="L1158" class="LineNr">1158 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L1159" class="LineNr">1159 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L1160" class="LineNr">1160 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1126" class="LineNr">1126 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L1127" class="LineNr">1127 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L1128" class="LineNr">1128 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L1129" class="LineNr">1129 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L1130" class="LineNr">1130 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1131" class="LineNr">1131 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L1132" class="LineNr">1132 </span>  ]
+<span id="L1133" class="LineNr">1133 </span>  <span class="Comment"># hit 'page-down' and 'page-up' a couple of times. sandbox index should be stable</span>
+<span id="L1134" class="LineNr">1134 </span>  assume-console [
+<span id="L1135" class="LineNr">1135 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
+<span id="L1136" class="LineNr">1136 </span>  ]
+<span id="L1137" class="LineNr">1137 </span>  run [
+<span id="L1138" class="LineNr">1138 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1139" class="LineNr">1139 </span>  ]
+<span id="L1140" class="LineNr">1140 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
+<span id="L1141" class="LineNr">1141 </span>  <span class="Comment"># cursor moves to first sandbox</span>
+<span id="L1142" class="LineNr">1142 </span>  screen-should-contain [
+<span id="L1143" class="LineNr">1143 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L1144" class="LineNr">1144 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1145" class="LineNr">1145 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit       copy       to recipe    delete    .</span>
+<span id="L1146" class="LineNr">1146 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L1147" class="LineNr">1147 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L1148" class="LineNr">1148 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1149" class="LineNr">1149 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L1150" class="LineNr">1150 </span>  ]
+<span id="L1151" class="LineNr">1151 </span>  <span class="Comment"># hit 'page-up' again</span>
+<span id="L1152" class="LineNr">1152 </span>  assume-console [
+<span id="L1153" class="LineNr">1153 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3813'>page-up</a>
+<span id="L1154" class="LineNr">1154 </span>  ]
+<span id="L1155" class="LineNr">1155 </span>  run [
+<span id="L1156" class="LineNr">1156 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1157" class="LineNr">1157 </span>  ]
+<span id="L1158" class="LineNr">1158 </span>  <span class="Comment"># back to displaying both sandboxes as well as editor</span>
+<span id="L1159" class="LineNr">1159 </span>  screen-should-contain [
+<span id="L1160" class="LineNr">1160 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
 <span id="L1161" class="LineNr">1161 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L1162" class="LineNr">1162 </span>  ]
-<span id="L1163" class="LineNr">1163 </span>  <span class="Comment"># hit 'page-down'</span>
-<span id="L1164" class="LineNr">1164 </span>  assume-console [
-<span id="L1165" class="LineNr">1165 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
-<span id="L1166" class="LineNr">1166 </span>  ]
-<span id="L1167" class="LineNr">1167 </span>  run [
-<span id="L1168" class="LineNr">1168 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L1169" class="LineNr">1169 </span>  ]
-<span id="L1170" class="LineNr">1170 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
-<span id="L1171" class="LineNr">1171 </span>  <span class="Comment"># cursor moves to first sandbox</span>
-<span id="L1172" class="LineNr">1172 </span>  screen-should-contain [
-<span id="L1173" class="LineNr">1173 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
-<span id="L1174" class="LineNr">1174 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1175" class="LineNr">1175 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit       copy       to recipe    delete    .</span>
-<span id="L1176" class="LineNr">1176 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
-<span id="L1177" class="LineNr">1177 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
-<span id="L1178" class="LineNr">1178 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
-<span id="L1179" class="LineNr">1179 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
-<span id="L1180" class="LineNr">1180 </span>  ]
-<span id="L1181" class="LineNr">1181 </span>]
+<span id="L1162" class="LineNr">1162 </span><span class="Constant">  </span><span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span>
+<span id="L1163" class="LineNr">1163 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎0   edit       copy       to recipe    delete    .</span>
+<span id="L1164" class="LineNr">1164 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L1165" class="LineNr">1165 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L1166" class="LineNr">1166 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1167" class="LineNr">1167 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L1168" class="LineNr">1168 </span>  ]
+<span id="L1169" class="LineNr">1169 </span>  <span class="Comment"># hit 'page-down'</span>
+<span id="L1170" class="LineNr">1170 </span>  assume-console [
+<span id="L1171" class="LineNr">1171 </span>  <span class="Conceal">¦</span> press <a href='003-shortcuts.mu.html#L3590'>page-down</a>
+<span id="L1172" class="LineNr">1172 </span>  ]
+<span id="L1173" class="LineNr">1173 </span>  run [
+<span id="L1174" class="LineNr">1174 </span>  <span class="Conceal">¦</span> <a href='004-programming-environment.mu.html#L39'>event-loop</a> <a href='../081print.mu.html#L16'>screen</a>, <a href='../084console.mu.html#L23'>console</a>, env, <a href='../088file.mu.html#L11'>resources</a>
+<span id="L1175" class="LineNr">1175 </span>  ]
+<span id="L1176" class="LineNr">1176 </span>  <span class="Comment"># sandbox editor hidden; first sandbox displayed</span>
+<span id="L1177" class="LineNr">1177 </span>  <span class="Comment"># cursor moves to first sandbox</span>
+<span id="L1178" class="LineNr">1178 </span>  screen-should-contain [
+<span id="L1179" class="LineNr">1179 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                                                 run (F4)           .</span>
+<span id="L1180" class="LineNr">1180 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1181" class="LineNr">1181 </span>  <span class="Conceal">¦</span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0   edit       copy       to recipe    delete    .</span>
+<span id="L1182" class="LineNr">1182 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎add 1, 1                                         .</span>
+<span id="L1183" class="LineNr">1183 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎2                                                .</span>
+<span id="L1184" class="LineNr">1184 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎─────────────────────────────────────────────────.</span>
+<span id="L1185" class="LineNr">1185 </span>  <span class="Conceal">¦</span><span class="Constant"> .                                                  ╎                                                 .</span>
+<span id="L1186" class="LineNr">1186 </span>  ]
+<span id="L1187" class="LineNr">1187 </span>]
 </pre>
 </body>
 </html>
diff --git a/html/edit/006-sandbox-copy.mu.html b/html/edit/006-sandbox-copy.mu.html
index 61a889c5..d6a56d6c 100644
--- a/html/edit/006-sandbox-copy.mu.html
+++ b/html/edit/006-sandbox-copy.mu.html
@@ -210,7 +210,7 @@ if ('onhashchange' in window) {
 <span id="L148" class="LineNr">148 </span>  assert first-sandbox, <span class="Constant">[!!]</span>
 <span id="L149" class="LineNr">149 </span>  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
 <span id="L150" class="LineNr">150 </span>  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
-<span id="L151" class="LineNr">151 </span>  _, _, copy-button-left:num, copy-button-right:num <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L373'>sandbox-menu-columns</a> sandbox-left-margin, sandbox-right-margin
+<span id="L151" class="LineNr">151 </span>  _, _, copy-button-left:num, copy-button-right:num <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L379'>sandbox-menu-columns</a> sandbox-left-margin, sandbox-right-margin
 <span id="L152" class="LineNr">152 </span>  copy-button-vertical-area?:bool <span class="Special">&lt;-</span> <a href='006-sandbox-copy.mu.html#L211'>within-range?</a> click-column, copy-button-left, copy-button-right
 <span id="L153" class="LineNr">153 </span>  <span class="muControl">return-unless</span> copy-button-vertical-area?, <span class="Constant">0/false</span>
 <span id="L154" class="LineNr">154 </span>  <span class="Comment"># finally, is sandbox editor empty?</span>
@@ -430,7 +430,7 @@ if ('onhashchange' in window) {
 <span id="L368" class="LineNr">368 </span>  assert first-sandbox, <span class="Constant">[!!]</span>
 <span id="L369" class="LineNr">369 </span>  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
 <span id="L370" class="LineNr">370 </span>  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
-<span id="L371" class="LineNr">371 </span>  _, _, _, _, recipe-button-left:num, recipe-button-right:num <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L373'>sandbox-menu-columns</a> sandbox-left-margin, sandbox-right-margin
+<span id="L371" class="LineNr">371 </span>  _, _, _, _, recipe-button-left:num, recipe-button-right:num <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L379'>sandbox-menu-columns</a> sandbox-left-margin, sandbox-right-margin
 <span id="L372" class="LineNr">372 </span>  result <span class="Special">&lt;-</span> <a href='006-sandbox-copy.mu.html#L211'>within-range?</a> click-column, recipe-button-left, recipe-button-right
 <span id="L373" class="LineNr">373 </span>]
 <span id="L374" class="LineNr">374 </span>
diff --git a/html/edit/007-sandbox-delete.mu.html b/html/edit/007-sandbox-delete.mu.html
index 0a41fc07..1d2aa139 100644
--- a/html/edit/007-sandbox-delete.mu.html
+++ b/html/edit/007-sandbox-delete.mu.html
@@ -153,7 +153,7 @@ if ('onhashchange' in window) {
 <span id="L91" class="LineNr"> 91 </span>  assert first-sandbox, <span class="Constant">[!!]</span>
 <span id="L92" class="LineNr"> 92 </span>  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
 <span id="L93" class="LineNr"> 93 </span>  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
-<span id="L94" class="LineNr"> 94 </span>  _, _, _, _, _, _, delete-button-left:num <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L373'>sandbox-menu-columns</a> sandbox-left-margin, sandbox-right-margin
+<span id="L94" class="LineNr"> 94 </span>  _, _, _, _, _, _, delete-button-left:num <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L379'>sandbox-menu-columns</a> sandbox-left-margin, sandbox-right-margin
 <span id="L95" class="LineNr"> 95 </span>  result <span class="Special">&lt;-</span> <a href='006-sandbox-copy.mu.html#L211'>within-range?</a> click-column, delete-button-left, sandbox-right-margin
 <span id="L96" class="LineNr"> 96 </span>]
 <span id="L97" class="LineNr"> 97 </span>
diff --git a/html/edit/008-sandbox-edit.mu.html b/html/edit/008-sandbox-edit.mu.html
index bfa85e12..22b0f407 100644
--- a/html/edit/008-sandbox-edit.mu.html
+++ b/html/edit/008-sandbox-edit.mu.html
@@ -193,7 +193,7 @@ if ('onhashchange' in window) {
 <span id="L131" class="LineNr">131 </span>  assert first-sandbox, <span class="Constant">[!!]</span>
 <span id="L132" class="LineNr">132 </span>  sandbox-left-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">left:offset</span>
 <span id="L133" class="LineNr">133 </span>  sandbox-right-margin:num <span class="Special">&lt;-</span> get *first-sandbox, <span class="Constant">right:offset</span>
-<span id="L134" class="LineNr">134 </span>  edit-button-left:num, edit-button-right:num, _ <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L373'>sandbox-menu-columns</a> sandbox-left-margin, sandbox-right-margin
+<span id="L134" class="LineNr">134 </span>  edit-button-left:num, edit-button-right:num, _ <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L379'>sandbox-menu-columns</a> sandbox-left-margin, sandbox-right-margin
 <span id="L135" class="LineNr">135 </span>  edit-button-vertical-area?:bool <span class="Special">&lt;-</span> <a href='006-sandbox-copy.mu.html#L211'>within-range?</a> click-column, edit-button-left, edit-button-right
 <span id="L136" class="LineNr">136 </span>  <span class="muControl">return-unless</span> edit-button-vertical-area?, <span class="Constant">0/false</span>
 <span id="L137" class="LineNr">137 </span>  <span class="Comment"># finally, is sandbox editor empty?</span>
diff --git a/html/edit/009-sandbox-test.mu.html b/html/edit/009-sandbox-test.mu.html
index d147fa92..f75f45f7 100644
--- a/html/edit/009-sandbox-test.mu.html
+++ b/html/edit/009-sandbox-test.mu.html
@@ -156,16 +156,16 @@ if ('onhashchange' in window) {
 <span id="L93" class="LineNr"> 93 </span>]
 <span id="L94" class="LineNr"> 94 </span>
 <span id="L95" class="LineNr"> 95 </span><span class="Comment"># include expected response when saving or restoring a sandbox</span>
-<span id="L96" class="LineNr"> 96 </span><span class="muRecipe">before</span> <span class="Constant"><a href='005-sandbox.mu.html#L239'>&lt;end-save-sandbox&gt;</a></span> [
+<span id="L96" class="LineNr"> 96 </span><span class="muRecipe">before</span> <span class="Constant"><a href='005-sandbox.mu.html#L249'>&lt;end-save-sandbox&gt;</a></span> [
 <span id="L97" class="LineNr"> 97 </span>  <span class="Delimiter">{</span>
-<span id="L98" class="LineNr"> 98 </span>  <span class="Conceal">¦</span> expected-response:text <span class="Special">&lt;-</span> get *curr, <span class="Constant">expected-response:offset</span>
+<span id="L98" class="LineNr"> 98 </span>  <span class="Conceal">¦</span> expected-response:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">expected-response:offset</span>
 <span id="L99" class="LineNr"> 99 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> expected-response
 <span id="L100" class="LineNr">100 </span>  <span class="Conceal">¦</span> filename <span class="Special">&lt;-</span> append filename, <span class="Constant">[.out]</span>
 <span id="L101" class="LineNr">101 </span>  <span class="Conceal">¦</span> <a href='../088file.mu.html#L11'>resources</a> <span class="Special">&lt;-</span> <a href='../088file.mu.html#L127'>dump</a> <a href='../088file.mu.html#L11'>resources</a>, filename, expected-response
 <span id="L102" class="LineNr">102 </span>  <span class="Delimiter">}</span>
 <span id="L103" class="LineNr">103 </span>]
 <span id="L104" class="LineNr">104 </span>
-<span id="L105" class="LineNr">105 </span><span class="muRecipe">before</span> <span class="Constant"><a href='005-sandbox.mu.html#L485'>&lt;end-restore-sandbox&gt;</a></span> [
+<span id="L105" class="LineNr">105 </span><span class="muRecipe">before</span> <span class="Constant"><a href='005-sandbox.mu.html#L491'>&lt;end-restore-sandbox&gt;</a></span> [
 <span id="L106" class="LineNr">106 </span>  <span class="Delimiter">{</span>
 <span id="L107" class="LineNr">107 </span>  <span class="Conceal">¦</span> filename <span class="Special">&lt;-</span> append filename, <span class="Constant">[.out]</span>
 <span id="L108" class="LineNr">108 </span>  <span class="Conceal">¦</span> contents <span class="Special">&lt;-</span> <a href='../088file.mu.html#L38'>slurp</a> <a href='../088file.mu.html#L11'>resources</a>, filename
@@ -189,43 +189,43 @@ if ('onhashchange' in window) {
 <span id="L126" class="LineNr">126 </span>  <span class="Conceal">¦</span> below-sandbox-editor?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, first-sandbox-begins
 <span id="L127" class="LineNr">127 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> below-sandbox-editor?
 <span id="L128" class="LineNr">128 </span>  <span class="Conceal">¦</span> <span class="Comment"># identify the sandbox whose output is being clicked on</span>
-<span id="L129" class="LineNr">129 </span>  <span class="Conceal">¦</span> sandbox:&amp;:sandbox <span class="Special">&lt;-</span> <a href='009-sandbox-test.mu.html#L142'>find-click-in-sandbox-output</a> env, click-row
+<span id="L129" class="LineNr">129 </span>  <span class="Conceal">¦</span> sandbox:&amp;:sandbox, sandbox-index:num <span class="Special">&lt;-</span> <a href='009-sandbox-test.mu.html#L140'>find-click-in-sandbox-output</a> env, click-row
 <span id="L130" class="LineNr">130 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox
-<span id="L131" class="LineNr">131 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L219'>update-status</a> <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[updating...      ]</span>, <span class="Constant">245/grey</span>
-<span id="L132" class="LineNr">132 </span>  <span class="Conceal">¦</span> <span class="Comment"># toggle its expected-response, and save session</span>
-<span id="L133" class="LineNr">133 </span>  <span class="Conceal">¦</span> sandbox <span class="Special">&lt;-</span> <a href='009-sandbox-test.mu.html#L168'>toggle-expected-response</a> sandbox
-<span id="L134" class="LineNr">134 </span>  <span class="Conceal">¦</span> <a href='005-sandbox.mu.html#L226'>save-sandboxes</a> env, <a href='../088file.mu.html#L11'>resources</a>
-<span id="L135" class="LineNr">135 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> render-sandbox-side <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
-<span id="L136" class="LineNr">136 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L219'>update-status</a> <a href='../081print.mu.html#L16'>screen</a>, <span class="Constant">[                 ]</span>, <span class="Constant">245/grey</span>
-<span id="L137" class="LineNr">137 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L472'>update-cursor</a> <a href='../081print.mu.html#L16'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env
-<span id="L138" class="LineNr">138 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-event</span>
-<span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
-<span id="L140" class="LineNr">140 </span>]
-<span id="L141" class="LineNr">141 </span>
-<span id="L142" class="LineNr">142 </span><span class="muRecipe">def</span> <a href='009-sandbox-test.mu.html#L142'>find-click-in-sandbox-output</a> env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
-<span id="L143" class="LineNr">143 </span>  <span class="Constant">local-scope</span>
-<span id="L144" class="LineNr">144 </span>  <span class="Constant">load-ingredients</span>
-<span id="L145" class="LineNr">145 </span>  <span class="Comment"># assert click-row &gt;= sandbox.starting-row-on-screen</span>
-<span id="L146" class="LineNr">146 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
-<span id="L147" class="LineNr">147 </span>  start:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-<span id="L148" class="LineNr">148 </span>  clicked-on-sandboxes?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, start
-<span id="L149" class="LineNr">149 </span>  assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span>
-<span id="L150" class="LineNr">150 </span>  <span class="Comment"># while click-row &lt; sandbox.next-sandbox.starting-row-on-screen</span>
-<span id="L151" class="LineNr">151 </span>  <span class="Delimiter">{</span>
-<span id="L152" class="LineNr">152 </span>  <span class="Conceal">¦</span> next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
-<span id="L153" class="LineNr">153 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> next-sandbox
-<span id="L154" class="LineNr">154 </span>  <span class="Conceal">¦</span> next-start:num <span class="Special">&lt;-</span> get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
-<span id="L155" class="LineNr">155 </span>  <span class="Conceal">¦</span> found?:bool <span class="Special">&lt;-</span> lesser-than click-row, next-start
-<span id="L156" class="LineNr">156 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> found?
-<span id="L157" class="LineNr">157 </span>  <span class="Conceal">¦</span> sandbox <span class="Special">&lt;-</span> copy next-sandbox
+<span id="L131" class="LineNr">131 </span>  <span class="Conceal">¦</span> <span class="Comment"># toggle its expected-response, and save session</span>
+<span id="L132" class="LineNr">132 </span>  <span class="Conceal">¦</span> sandbox <span class="Special">&lt;-</span> <a href='009-sandbox-test.mu.html#L168'>toggle-expected-response</a> sandbox
+<span id="L133" class="LineNr">133 </span>  <span class="Conceal">¦</span> <a href='005-sandbox.mu.html#L243'>save-sandbox</a> <a href='../088file.mu.html#L11'>resources</a>, sandbox, sandbox-index
+<span id="L134" class="LineNr">134 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> render-sandbox-side <a href='../081print.mu.html#L16'>screen</a>, env, <a href='001-editor.mu.html#L107'>render</a>
+<span id="L135" class="LineNr">135 </span>  <span class="Conceal">¦</span> <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='004-programming-environment.mu.html#L472'>update-cursor</a> <a href='../081print.mu.html#L16'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env
+<span id="L136" class="LineNr">136 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span> <span class="Constant">+next-event</span>
+<span id="L137" class="LineNr">137 </span>  <span class="Delimiter">}</span>
+<span id="L138" class="LineNr">138 </span>]
+<span id="L139" class="LineNr">139 </span>
+<span id="L140" class="LineNr">140 </span><span class="muRecipe">def</span> <a href='009-sandbox-test.mu.html#L140'>find-click-in-sandbox-output</a> env:&amp;:environment, click-row:num<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox, sandbox-index:num [
+<span id="L141" class="LineNr">141 </span>  <span class="Constant">local-scope</span>
+<span id="L142" class="LineNr">142 </span>  <span class="Constant">load-ingredients</span>
+<span id="L143" class="LineNr">143 </span>  <span class="Comment"># assert click-row &gt;= sandbox.starting-row-on-screen</span>
+<span id="L144" class="LineNr">144 </span>  sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *env, <span class="Constant">sandbox:offset</span>
+<span id="L145" class="LineNr">145 </span>  start:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<span id="L146" class="LineNr">146 </span>  clicked-on-sandboxes?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, start
+<span id="L147" class="LineNr">147 </span>  assert clicked-on-sandboxes?, <span class="Constant">[extract-sandbox called on click to sandbox editor]</span>
+<span id="L148" class="LineNr">148 </span>  <span class="Comment"># while click-row &lt; sandbox.next-sandbox.starting-row-on-screen</span>
+<span id="L149" class="LineNr">149 </span>  sandbox-index <span class="Special">&lt;-</span> copy<span class="Constant"> 0</span>
+<span id="L150" class="LineNr">150 </span>  <span class="Delimiter">{</span>
+<span id="L151" class="LineNr">151 </span>  <span class="Conceal">¦</span> next-sandbox:&amp;:sandbox <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span>
+<span id="L152" class="LineNr">152 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> next-sandbox
+<span id="L153" class="LineNr">153 </span>  <span class="Conceal">¦</span> next-start:num <span class="Special">&lt;-</span> get *next-sandbox, <span class="Constant">starting-row-on-screen:offset</span>
+<span id="L154" class="LineNr">154 </span>  <span class="Conceal">¦</span> found?:bool <span class="Special">&lt;-</span> lesser-than click-row, next-start
+<span id="L155" class="LineNr">155 </span>  <span class="Conceal">¦</span> <span class="muControl">break-if</span> found?
+<span id="L156" class="LineNr">156 </span>  <span class="Conceal">¦</span> sandbox <span class="Special">&lt;-</span> copy next-sandbox
+<span id="L157" class="LineNr">157 </span>  <span class="Conceal">¦</span> sandbox-index <span class="Special">&lt;-</span> add sandbox-index,<span class="Constant"> 1</span>
 <span id="L158" class="LineNr">158 </span>  <span class="Conceal">¦</span> <span class="muControl">loop</span>
 <span id="L159" class="LineNr">159 </span>  <span class="Delimiter">}</span>
 <span id="L160" class="LineNr">160 </span>  <span class="Comment"># return sandbox if click is in its output region</span>
 <span id="L161" class="LineNr">161 </span>  response-starting-row:num <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>
-<span id="L162" class="LineNr">162 </span>  <span class="muControl">return-unless</span> response-starting-row, <span class="Constant">0/no-click-in-sandbox-output</span>
+<span id="L162" class="LineNr">162 </span>  <span class="muControl">return-unless</span> response-starting-row, <span class="Constant">0/no-click-in-sandbox-output</span>, <span class="Constant">0/sandbox-index</span>
 <span id="L163" class="LineNr">163 </span>  click-in-response?:bool <span class="Special">&lt;-</span> greater-or-equal click-row, response-starting-row
-<span id="L164" class="LineNr">164 </span>  <span class="muControl">return-unless</span> click-in-response?, <span class="Constant">0/no-click-in-sandbox-output</span>
-<span id="L165" class="LineNr">165 </span>  <span class="muControl">return</span> sandbox
+<span id="L164" class="LineNr">164 </span>  <span class="muControl">return-unless</span> click-in-response?, <span class="Constant">0/no-click-in-sandbox-output</span>, <span class="Constant">0/sandbox-index</span>
+<span id="L165" class="LineNr">165 </span>  <span class="muControl">return</span> sandbox, sandbox-index
 <span id="L166" class="LineNr">166 </span>]
 <span id="L167" class="LineNr">167 </span>
 <span id="L168" class="LineNr">168 </span><span class="muRecipe">def</span> <a href='009-sandbox-test.mu.html#L168'>toggle-expected-response</a> sandbox:&amp;:sandbox<span class="muRecipe"> -&gt; </span>sandbox:&amp;:sandbox [
@@ -246,7 +246,7 @@ if ('onhashchange' in window) {
 <span id="L183" class="LineNr">183 </span>]
 <span id="L184" class="LineNr">184 </span>
 <span id="L185" class="LineNr">185 </span><span class="Comment"># when rendering a sandbox, color it in red/green if expected response exists</span>
-<span id="L186" class="LineNr">186 </span><span class="muRecipe">after</span> <span class="Constant"><a href='005-sandbox.mu.html#L306'>&lt;render-sandbox-response&gt;</a></span> [
+<span id="L186" class="LineNr">186 </span><span class="muRecipe">after</span> <span class="Constant"><a href='005-sandbox.mu.html#L312'>&lt;render-sandbox-response&gt;</a></span> [
 <span id="L187" class="LineNr">187 </span>  <span class="Delimiter">{</span>
 <span id="L188" class="LineNr">188 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-response
 <span id="L189" class="LineNr">189 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>, row
@@ -255,17 +255,17 @@ if ('onhashchange' in window) {
 <span id="L192" class="LineNr">192 </span>  <span class="Conceal">¦</span> response-is-expected?:bool <span class="Special">&lt;-</span> equal expected-response, sandbox-response
 <span id="L193" class="LineNr">193 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
 <span id="L194" class="LineNr">194 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-if</span> response-is-expected?
-<span id="L195" class="LineNr">195 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-response, left, right, <span class="Constant">1/red</span>, row
+<span id="L195" class="LineNr">195 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-response, left, right, <span class="Constant">1/red</span>, row
 <span id="L196" class="LineNr">196 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
 <span id="L197" class="LineNr">197 </span>  <span class="Conceal">¦</span> <span class="Delimiter">{</span>
 <span id="L198" class="LineNr">198 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <span class="muControl">break-unless</span> response-is-expected?:bool
-<span id="L199" class="LineNr">199 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-response, left, right, <span class="Constant">2/green</span>, row
+<span id="L199" class="LineNr">199 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-response, left, right, <span class="Constant">2/green</span>, row
 <span id="L200" class="LineNr">200 </span>  <span class="Conceal">¦</span> <span class="Delimiter">}</span>
 <span id="L201" class="LineNr">201 </span>  <span class="Conceal">¦</span> <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end</span>
 <span id="L202" class="LineNr">202 </span>  <span class="Delimiter">}</span>
 <span id="L203" class="LineNr">203 </span>]
 <span id="L204" class="LineNr">204 </span>
-<span id="L205" class="LineNr">205 </span><span class="muRecipe">before</span> <span class="Constant"><a href='005-sandbox.mu.html#L320'>&lt;end-render-sandbox-reset-hidden&gt;</a></span> [
+<span id="L205" class="LineNr">205 </span><span class="muRecipe">before</span> <span class="Constant"><a href='005-sandbox.mu.html#L326'>&lt;end-render-sandbox-reset-hidden&gt;</a></span> [
 <span id="L206" class="LineNr">206 </span>  *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>
 <span id="L207" class="LineNr">207 </span>]
 </pre>
diff --git a/html/edit/010-sandbox-trace.mu.html b/html/edit/010-sandbox-trace.mu.html
index 8578fa11..6a0b6435 100644
--- a/html/edit/010-sandbox-trace.mu.html
+++ b/html/edit/010-sandbox-trace.mu.html
@@ -304,13 +304,13 @@ if ('onhashchange' in window) {
 <span id="L241" class="LineNr">241 </span>]
 <span id="L242" class="LineNr">242 </span>
 <span id="L243" class="LineNr">243 </span><span class="Comment"># when rendering a sandbox, dump its trace before response/warning if display-trace? property is set</span>
-<span id="L244" class="LineNr">244 </span><span class="muRecipe">after</span> <span class="Constant"><a href='005-sandbox.mu.html#L297'>&lt;render-sandbox-results&gt;</a></span> [
+<span id="L244" class="LineNr">244 </span><span class="muRecipe">after</span> <span class="Constant"><a href='005-sandbox.mu.html#L303'>&lt;render-sandbox-results&gt;</a></span> [
 <span id="L245" class="LineNr">245 </span>  <span class="Delimiter">{</span>
 <span id="L246" class="LineNr">246 </span>  <span class="Conceal">¦</span> display-trace?:bool <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">display-trace?:offset</span>
 <span id="L247" class="LineNr">247 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> display-trace?
 <span id="L248" class="LineNr">248 </span>  <span class="Conceal">¦</span> sandbox-trace:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">trace:offset</span>
 <span id="L249" class="LineNr">249 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-trace  <span class="Comment"># nothing to print; move on</span>
-<span id="L250" class="LineNr">250 </span>  <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row
+<span id="L250" class="LineNr">250 </span>  <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row
 <span id="L251" class="LineNr">251 </span>  <span class="Delimiter">}</span>
 <span id="L252" class="LineNr">252 </span><span class="Constant">  <a href='010-sandbox-trace.mu.html#L252'>&lt;render-sandbox-trace-done&gt;</a></span>
 <span id="L253" class="LineNr">253 </span>]
diff --git a/html/edit/011-errors.mu.html b/html/edit/011-errors.mu.html
index b01219ba..0f726e99 100644
--- a/html/edit/011-errors.mu.html
+++ b/html/edit/011-errors.mu.html
@@ -72,7 +72,7 @@ if ('onhashchange' in window) {
 <span id="L9" class="LineNr">  9 </span>  <span class="Constant">local-scope</span>
 <span id="L10" class="LineNr"> 10 </span>  <span class="Constant">load-ingredients</span>
 <span id="L11" class="LineNr"> 11 </span>  recipes:&amp;:editor <span class="Special">&lt;-</span> get *env, <span class="Constant">recipes:offset</span>
-<span id="L12" class="LineNr"> 12 </span>  in:text <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L669'>editor-contents</a> recipes
+<span id="L12" class="LineNr"> 12 </span>  in:text <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L675'>editor-contents</a> recipes
 <span id="L13" class="LineNr"> 13 </span>  <a href='../088file.mu.html#L11'>resources</a> <span class="Special">&lt;-</span> <a href='../088file.mu.html#L127'>dump</a> <a href='../088file.mu.html#L11'>resources</a>, <span class="Constant">[lesson/recipes.mu]</span>, in
 <span id="L14" class="LineNr"> 14 </span>  recipe-errors:text <span class="Special">&lt;-</span> reload in
 <span id="L15" class="LineNr"> 15 </span>  *env <span class="Special">&lt;-</span> put *env, <span class="Constant">recipe-errors:offset</span>, recipe-errors
@@ -94,7 +94,7 @@ if ('onhashchange' in window) {
 <span id="L31" class="LineNr"> 31 </span>  <span class="Conceal">¦</span> left:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">left:offset</span>
 <span id="L32" class="LineNr"> 32 </span>  <span class="Conceal">¦</span> right:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">right:offset</span>
 <span id="L33" class="LineNr"> 33 </span>  <span class="Conceal">¦</span> row:num <span class="Special">&lt;-</span> get *recipes, <span class="Constant">bottom:offset</span>
-<span id="L34" class="LineNr"> 34 </span>  <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, recipe-errors, left, right, <span class="Constant">1/red</span>, row
+<span id="L34" class="LineNr"> 34 </span>  <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, recipe-errors, left, right, <span class="Constant">1/red</span>, row
 <span id="L35" class="LineNr"> 35 </span>  <span class="Conceal">¦</span> <span class="Comment"># draw dotted line after recipes</span>
 <span id="L36" class="LineNr"> 36 </span>  <span class="Conceal">¦</span> <a href='002-typing.mu.html#L1116'>draw-horizontal</a> <a href='../081print.mu.html#L16'>screen</a>, row, left, right, <span class="Constant">9480/horizontal-dotted</span>
 <span id="L37" class="LineNr"> 37 </span>  <span class="Conceal">¦</span> row <span class="Special">&lt;-</span> add row,<span class="Constant"> 1</span>
@@ -170,7 +170,7 @@ if ('onhashchange' in window) {
 <span id="L107" class="LineNr">107 </span>  <span class="Conceal">¦</span> sandbox-errors:text <span class="Special">&lt;-</span> get *sandbox, <span class="Constant">errors:offset</span>
 <span id="L108" class="LineNr">108 </span>  <span class="Conceal">¦</span> <span class="muControl">break-unless</span> sandbox-errors
 <span id="L109" class="LineNr">109 </span>  <span class="Conceal">¦</span> *sandbox <span class="Special">&lt;-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>,<span class="Constant"> 0</span>  <span class="Comment"># no response</span>
-<span id="L110" class="LineNr">110 </span>  <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L393'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-errors, left, right, <span class="Constant">1/red</span>, row
+<span id="L110" class="LineNr">110 </span>  <span class="Conceal">¦</span> row, <a href='../081print.mu.html#L16'>screen</a> <span class="Special">&lt;-</span> <a href='005-sandbox.mu.html#L399'>render-text</a> <a href='../081print.mu.html#L16'>screen</a>, sandbox-errors, left, right, <span class="Constant">1/red</span>, row
 <span id="L111" class="LineNr">111 </span>  <span class="Conceal">¦</span> <span class="Comment"># don't try to print anything more for this sandbox</span>
 <span id="L112" class="LineNr">112 </span>  <span class="Conceal">¦</span> <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end</span>
 <span id="L113" class="LineNr">113 </span>  <span class="Delimiter">}</span>