about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--zet.tlv2607
1 files changed, 17 insertions, 2590 deletions
diff --git a/zet.tlv b/zet.tlv
index 762e9a6..32282db 100644
--- a/zet.tlv
+++ b/zet.tlv
@@ -171,9 +171,11 @@
   init_colors:
     >function init_colors()
     >  -- light background
+    >  curses.init_pair(view_settings.current_zettel_bg, 236, 230)
     >  curses.init_pair(1, 236, 250)
     >  curses.init_pair(2, 236, 252)
     >  -- dark background
+    >--?   curses.init_pair(view_settings.current_zettel_bg, 252, 130)
     >--?   curses.init_pair(1, 252, 240)
     >--?   curses.init_pair(2, 252, 242)
     >end
@@ -181,6 +183,7 @@
   main:
     >function main()
     >  init_colors()
+    >  current_zettel_id = zettels.root
     >
     >  while true do
     >    render(window)
@@ -188,888 +191,6 @@
     >  end
     >end
 - __teliva_timestamp: original
-  zettels:
-    >zettels = {
-    >  a={
-    >    data="abc\ndef",
-    >    next="b",
-    >  },
-    >  b={
-    >    data="ghi\njklm",
-    >    prev="a",
-    >  },
-    >}
-- __teliva_timestamp: original
-  view_settings:
-    >view_settings = {
-    >  width=50,
-    >  height=3,
-    >}
-- __teliva_timestamp: original
-  render_zettel:
-    >function render_zettel(window, i, indent, line)
-    >  window:attrset(curses.color_pair(i%2+1))
-    >  -- exactly 3 lines of text, haiku size
-    >  spaces(1)  -- todo: glyph
-    >  spaces(indent)
-    >  window:addstr(line.data)
-    >  spaces(view_settings.width-#line.data-indent-1)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  -- one line of whitespace below
-    >  spaces(view_settings.width)
-    >  print()
-    >end
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local i = 0
-    >  for _, zettel in pairs(zettels) do
-    >    render_zettel(window, i, 0, zettel)
-    >    i = i+1
-    >  end
-    >  local lines, cols = window:getmaxyx()
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Thu Feb  3 23:01:24 2022
-- render_zettel:
-    >function render_zettel(window, i, indent, line)
-    >  local y=1, x=1
-    >  window:attrset(curses.color_pair(i%2+1))
-    >  -- exactly 3 lines of text, haiku size
-    >  spaces(1)  -- todo: glyph
-    >  spaces(indent)
-    >  window:addstr(line.data)
-    >  spaces(view_settings.width-#line.data-indent-1)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  -- one line of whitespace below
-    >  spaces(view_settings.width)
-    >  print()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:43:16 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local bg=false  -- we render zettels with two slightly different background colors
-    >                  -- call them true and false; doesn't matter what they are
-    >  for _, zettel in pairs(zettels) do
-    >    render_zettel(window, bg, 0, zettel)
-    >    bg = not bg
-    >  end
-    >  local lines, cols = window:getmaxyx()
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:45:16 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, line)
-    >  local y=1, x=1
-    >  window:attrset(curses.color_pair(bg))
-    >  -- exactly 3 lines of text, haiku size
-    >  spaces(1)  -- todo: glyph
-    >  spaces(indent)
-    >  window:addstr(line.data)
-    >  spaces(view_settings.width-#line.data-indent-1)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  -- one line of whitespace below
-    >  spaces(view_settings.width)
-    >  print()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:45:37 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, line)
-    >  local y=1
-    >  local x=1
-    >  window:attrset(curses.color_pair(bg))
-    >  -- exactly 3 lines of text, haiku size
-    >  spaces(1)  -- todo: glyph
-    >  spaces(indent)
-    >  window:addstr(line.data)
-    >  spaces(view_settings.width-#line.data-indent-1)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  -- one line of whitespace below
-    >  spaces(view_settings.width)
-    >  print()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:45:49 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, line)
-    >  local y=1
-    >  local x=1
-    >  window:attrset(curses.color_pair(tonumber(bg)))
-    >  -- exactly 3 lines of text, haiku size
-    >  spaces(1)  -- todo: glyph
-    >  spaces(indent)
-    >  window:addstr(line.data)
-    >  spaces(view_settings.width-#line.data-indent-1)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  -- one line of whitespace below
-    >  spaces(view_settings.width)
-    >  print()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:46:00 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, line)
-    >  local y=1
-    >  local x=1
-    >  window:attrset(curses.color_pair(bg and 1 or 0))
-    >  -- exactly 3 lines of text, haiku size
-    >  spaces(1)  -- todo: glyph
-    >  spaces(indent)
-    >  window:addstr(line.data)
-    >  spaces(view_settings.width-#line.data-indent-1)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  -- one line of whitespace below
-    >  spaces(view_settings.width)
-    >  print()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:46:47 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local bg=false  -- we render zettels with two slightly different background colors
-    >                  -- call them true and false; doesn't matter what they are
-    >  local y=0, x=0
-    >  for _, zettel in pairs(zettels) do
-    >    render_zettel(window, bg, 0, zettel)
-    >    bg = not bg
-    >  end
-    >  local lines, cols = window:getmaxyx()
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:47:39 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=false  -- we render zettels with two slightly different background colors
-    >                  -- call them true and false; doesn't matter what they are
-    >  local y=0, x=0
-    >  for _, zettel in pairs(zettels) do
-    >    render_zettel(window, bg, 0, y, x zettel)
-    >    bg = not bg
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:49:37 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=false  -- we render zettels with two slightly different background colors
-    >                  -- call them true and false; doesn't matter what they are
-    >  local y=0 x=0
-    >  for _, zettel in pairs(zettels) do
-    >    render_zettel(window, bg, 0, y, x zettel)
-    >    bg = not bg
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:49:46 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=false  -- we render zettels with two slightly different background colors
-    >                  -- call them true and false; doesn't matter what they are
-    >  local y, x = 0, 0
-    >  for _, zettel in pairs(zettels) do
-    >    render_zettel(window, bg, 0, y, x zettel)
-    >    bg = not bg
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:50:09 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=false  -- we render zettels with two slightly different background colors
-    >                  -- call them true and false; doesn't matter what they are
-    >  local y, x = 0, 0
-    >  for _, zettel in pairs(zettels) do
-    >    render_zettel(window, bg, 0, y, x, zettel)
-    >    bg = not bg
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:50:18 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  local y=1
-    >  local x=1
-    >  window:attrset(curses.color_pair(bg and 1 or 0))
-    >  -- exactly 3 lines of text, haiku size
-    >  spaces(1)  -- todo: glyph
-    >  spaces(indent)
-    >  window:addstr(line.data)
-    >  spaces(view_settings.width-#zettel.data-indent-1)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  -- one line of whitespace below
-    >  spaces(view_settings.width)
-    >  print()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:50:53 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  local y=1
-    >  local x=1
-    >  window:attrset(curses.color_pair(bg and 1 or 0))
-    >  -- exactly 3 lines of text, haiku size
-    >  spaces(1)  -- todo: glyph
-    >  spaces(indent)
-    >  window:addstr(zettel.data)
-    >  spaces(view_settings.width-#zettel.data-indent-1)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  spaces(view_settings.width)
-    >  print()
-    >  -- one line of whitespace below
-    >  spaces(view_settings.width)
-    >  print()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:51:03 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg and 1 or 0))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, 0 
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = 0
-    >    else
-    >      mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:56:47 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg and 1 or 0))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, 0 
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = 0
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:56:55 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, 0 
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = 0
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:57:22 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  for _, zettel in pairs(zettels) do
-    >    render_zettel(window, bg, 0, y, x, zettel)
-    >    bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:57:54 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, 1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = 0
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:58:15 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, 1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = 1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 21:58:25 2022
-- zettels:
-    >zettels = {
-    >  root="a",
-    >  a={
-    >    data="abc\ndef",
-    >    next="b",
-    >  },
-    >  b={
-    >    data="ghi\njklm",
-    >    prev="a",
-    >  },
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 21:59:29 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  while true do
-    >    render_zettel(window, bg, 0, y, x, zettel)
-    >    bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:15:09 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local zettel = zettels[table.remove(inprogress)]
-    >    render_zettel(window, bg, 0, y, x, zettel)
-    >    if zettel.next then table.insert(zettle.next) end
-    >    if zettel.
-    >    bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:19:37 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local zettel = zettels[table.remove(inprogress)]
-    >    render_zettel(window, bg, 0, y, x, zettel)
-    >    if zettel.next then table.insert(zettle.next) end
-    >    if zettel.child then table.insert(zettel.child) end
-    >    bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:20:59 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local zettel = zettels[table.remove(inprogress)]
-    >    render_zettel(window, bg, 0, y, x, zettel)
-    >    if zettel.next then table.insert(zettel.next) end
-    >    if zettel.child then table.insert(zettel.child) end
-    >    bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:21:09 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local zettel = zettels[table.remove(inprogress)]
-    >    render_zettel(window, bg, 0, y, x, zettel)
-    >    if zettel.next then table.insert(inprogress, zettel.next) end
-    >    if zettel.child then table.insert(inprogress, zettel.child) end
-    >    bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >    y = y+view_settings.height+1
-    >    if y > lines then
-    >      y = 0
-    >      x = x+view_settings.width+1
-    >      if x > cols then break end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:21:30 2022
-- zettels:
-    >zettels = {
-    >  root="a",
-    >  a={
-    >    data="abc\ndef",
-    >    next="b",
-    >  },
-    >  b={
-    >    data="ghi\njklm",
-    >    prev="a",
-    >    next="a",
-    >  },
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:22:04 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      local zettel = zettels[currid]
-    >      render_zettel(window, bg, 0, y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y+view_settings.height+1
-    >      if y > lines then
-    >        y = 0
-    >        x = x+view_settings.width+1
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:23:54 2022
-- zettels:
-    >zettels = {
-    >  root="a",
-    >  a={
-    >    data="abc\ndef",
-    >    child="c",
-    >    next="b",
-    >  },
-    >  b={
-    >    data="ghi\njklm",
-    >    prev="a",
-    >    next="a",
-    >  },
-    >  c={
-    >    data="c",
-    >    parent="a",
-    >    next="d",
-    >  },
-    >  d={
-    >    data="d",
-    >    parent="a",
-    >    prev="c",
-    >  }
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:25:10 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      local zettel = zettels[currid]
-    >      render_zettel(window, bg, depth(zettel), y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y+view_settings.height+1
-    >      if y > lines then
-    >        y = 0
-    >        x = x+view_settings.width+1
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:26:01 2022
-- __teliva_timestamp:
-    >Fri Feb  4 22:26:41 2022
-  depth:
-    >function depth(zettel)
-    >  local result = 0
-    >  while zettel.parent do
-    >    result = result+1
-    >    zettel = zettel.parent
-    >  end
-    >end
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:27:10 2022
-- __teliva_timestamp:
-    >Fri Feb  4 22:27:28 2022
   depth:
     >function depth(zettel)
     >  local result = 0
@@ -1079,357 +200,8 @@
     >  end
     >  return result
     >end
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    window:mvaddch(y+starty, x, ' ')
-    >    for x=1,indent do
-    >      window:mvaddch(y+starty, x+startx, '.')
-    >    for x=indent+1,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:30:25 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    window:mvaddch(y+starty, x, ' ')
-    >    for x=1,indent do
-    >      window:mvaddch(y+starty, x+startx, '.')
-    >    end
-    >    for x=indent+1,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:30:29 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    window:mvaddch(y+starty, startx, ' ')
-    >    for x=1,indent do
-    >      window:mvaddch(y+starty, x+startx, '.')
-    >    end
-    >    for x=indent+1,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:30:53 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    window:mvaddch(y+starty, startx, ' ')
-    >    for x=1,indent do
-    >      window:mvaddch(y+starty, x+startx, '.')
-    >    end
-    >    for x=0,view_settings.width-1 do
-    >      if y == 0 and x == indent then
-    >        window:mvaddch(y+starty, x+startx, '↳')
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:33:56 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      if y == 0 and x == indent then
-    >        window:mvaddch(y+starty, x+startx, '↳')
-    >      else
-    >        window:mvaddch(y+starty, x+startx, ' ')
-    >      end
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:34:14 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      if y == 0 then
-    >        window:mvaddch(y+starty, x+startx, '.')
-    >      else
-    >        window:mvaddch(y+starty, x+startx, ' ')
-    >      end
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:34:42 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      if y == 0 and x <= indent then
-    >        window:mvaddch(y+starty, x+startx, '.')
-    >      else
-    >        window:mvaddch(y+starty, x+startx, ' ')
-    >      end
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:35:00 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = indent+1
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:36:11 2022
-- view_settings:
-    >view_settings = {
-    >  width=50,
-    >  height=3,
-    >  hmargin=1,
-    >  vmargin=1,
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:37:14 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      local zettel = zettels[currid]
-    >      render_zettel(window, bg, depth(zettel), y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y + view_settings.height + view_settings.vmargin
-    >      if y > lines then
-    >        y = 0
-    >        x = x + view_settings.width + view_settings.hmargin
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '?')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:37:57 2022
-- view_settings:
-    >view_settings = {
-    >  width=50,
-    >  height=3,
-    >  hmargin=1,
-    >  vmargin=1,
-    >  indent=2,
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:38:11 2022
-- render_zettel:
-    >function render_zettel(window, bg, indent, starty, startx, zettel)
-    >  window:attrset(curses.color_pair(bg))
-    >  for y=0,view_settings.height-1 do
-    >    for x=0,view_settings.width-1 do
-    >      window:mvaddch(y+starty, x+startx, ' ')
-    >    end
-    >  end
-    >  local y, x = 0, indent+1
-    >  for i=1,#zettel.data do
-    >    local c = zettel.data[i]
-    >    if c == '\n' then
-    >      y = y+1
-    >      x = 1 + indent * view_settings.indent
-    >    else
-    >      window:mvaddch(y+starty, x+startx, c)
-    >      x = x+1
-    >      if x >= startx + view_settings.width then
-    >        y = y+1
-    >        x = 1 + indent * view_settings.indent
-    >      end
-    >    end
-    >    if y >= starty + view_settings.height then
-    >      break
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:39:18 2022
-- view_settings:
-    >view_settings = {
-    >  width=50,
-    >  height=3,
-    >  hmargin=1,
-    >  vmargin=1,
-    >  indent=8,
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:39:35 2022
-- render_zettel:
+- __teliva_timestamp: original
+  render_zettel:
     >function render_zettel(window, bg, indent, starty, startx, zettel)
     >  window:attrset(curses.color_pair(bg))
     >  for y=0,view_settings.height-1 do
@@ -1456,255 +228,11 @@
     >    end
     >  end
     >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:40:44 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      local zettel = zettels[currid]
-    >      render_zettel(window, bg, depth(zettel) * view_settings.indent, y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y + view_settings.height + view_settings.vmargin
-    >      if y > lines then
-    >        y = 0
-    >        x = x + view_settings.width + view_settings.hmargin
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '? ')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:41:06 2022
-  __teliva_note:
-    >configurable indent for child zettels
-- view_settings:
-    >view_settings = {
-    >  width=50,
-    >  height=3,
-    >  hmargin=1,
-    >  vmargin=1,
-    >  indent=2,
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:41:17 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      local zettel = zettels[currid]
-    >      local currbg = (currid == cursor) and view_settings.current_zettel_color or bg
-    >      render_zettel(window, currbg, depth(zettel) * view_settings.indent, y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y + view_settings.height + view_settings.vmargin
-    >      if y > lines then
-    >        y = 0
-    >        x = x + view_settings.width + view_settings.hmargin
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '? ')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:52:51 2022
-- view_settings:
-    >view_settings = {
-    >  width=50,
-    >  height=3,
-    >  hmargin=1,
-    >  vmargin=1,
-    >  indent=2,
-    >  cursor
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:53:04 2022
-- view_settings:
-    >view_settings = {
-    >  width=50,
-    >  height=3,
-    >  hmargin=1,
-    >  vmargin=1,
-    >  indent=2,
-    >  current_zettel_color=3
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:53:46 2022
-- __teliva_timestamp:
-    >Fri Feb  4 22:55:08 2022
-  init_colors:
-    >function init_colors()
-    >  -- light background
-    >  curses.init_pair(view_settings.current_zettel_bg, 236, 226)
-    >  curses.init_pair(1, 236, 250)
-    >  curses.init_pair(2, 236, 252)
-    >  -- dark background
-    >--?   curses.init_pair(view_settings.current_zettel_bg, 252, 172)
-    >--?   curses.init_pair(1, 252, 240)
-    >--?   curses.init_pair(2, 252, 242)
-    >end
-- view_settings:
-    >view_settings = {
-    >  width=50,
-    >  height=3,
-    >  hmargin=1,
-    >  vmargin=1,
-    >  indent=2,
-    >  current_zettel_bg=3,  -- color pair index
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 22:55:34 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      local zettel = zettels[currid]
-    >      local currbg = (currid == cursor) and view_settings.current_zettel_bg or bg
-    >      render_zettel(window, currbg, depth(zettel) * view_settings.indent, y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y + view_settings.height + view_settings.vmargin
-    >      if y > lines then
-    >        y = 0
-    >        x = x + view_settings.width + view_settings.hmargin
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '? ')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:55:42 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      local zettel = zettels[currid]
-    >      local currbg = (currid == current_zettel_id) and view_settings.current_zettel_bg or bg
-    >      render_zettel(window, currbg, depth(zettel) * view_settings.indent, y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y + view_settings.height + view_settings.vmargin
-    >      if y > lines then
-    >        y = 0
-    >        x = x + view_settings.width + view_settings.hmargin
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '? ')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:56:14 2022
-- current_zettel_id:
+- __teliva_timestamp: original
+  current_zettel_id:
     >current_zettel_id = ''
-  __teliva_timestamp:
-    >Fri Feb  4 22:56:28 2022
-- main:
-    >function main()
-    >  init_colors()
-    >  current_zettel_id = zettels.root
-    >
-    >  while true do
-    >    render(window)
-    >    update(window)
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 22:56:54 2022
-- __teliva_timestamp:
-    >Fri Feb  4 22:58:52 2022
-  init_colors:
-    >function init_colors()
-    >  -- light background
-    >  curses.init_pair(view_settings.current_zettel_bg, 236, 230)
-    >  curses.init_pair(1, 236, 250)
-    >  curses.init_pair(2, 236, 252)
-    >  -- dark background
-    >--?   curses.init_pair(view_settings.current_zettel_bg, 252, 130)
-    >--?   curses.init_pair(1, 252, 240)
-    >--?   curses.init_pair(2, 252, 242)
-    >end
-- view_settings:
+- __teliva_timestamp: original
+  view_settings:
     >view_settings = {
     >  -- dimensions for rendering a single zettel; extra text gets truncated
     >  width=50,
@@ -1716,495 +244,8 @@
     >  indent=2,  -- how children of a zettel are indicated
     >  current_zettel_bg=3,  -- color pair index initialized in init_colors
     >}
-  __teliva_timestamp:
-    >Fri Feb  4 23:02:58 2022
-  __teliva_note:
-    >notion of current zettel
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == 'j' then
-    >    if curr.child then current_zettel_id = curr.child end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:10:29 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == 'j' then
-    >    a = b+1
-    >    if curr.child then current_zettel_id = curr.child end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:11:43 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.child then current_zettel_id = curr.child end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:11:57 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.child then current_zettel_id = curr.child end
-    >    elseif curr.next then current_zettel_id = curr.next end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:12:36 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:13:02 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:13:30 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      a = b+1
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:14:14 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      a = b+1
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:14:23 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.parent then
-    >      mvaddstr(30, 30, 'parent')
-    >      curses.getch()
-    >    end
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:15:25 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.parent then
-    >      window:mvaddstr(30, 30, 'parent')
-    >      curses.getch()
-    >    end
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:15:35 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.parent and curr.parent.next then
-    >      window:mvaddstr(30, 30, 'parent.next')
-    >      curses.getch()
-    >    end
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:16:05 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.parent and curr.parent.next then
-    >      window:mvaddstr(30, 30, curr.parent)
-    >      curses.getch()
-    >    end
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:16:28 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.parent then
-    >      window:mvaddstr(30, 30, curr.parent)
-    >      curses.getch()
-    >    end
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:16:38 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.next then
-    >      window:mvaddstr(30, 30, curr.next)
-    >      curses.getch()
-    >    end
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and curr.parent.next then
-    >      current_zettel_id = curr.parent.next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:16:55 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == 'k' then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == 'h' then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == 'l' then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:17:49 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:18:20 2022
-  __teliva_note:
-    >navigating between zettels
-- zettels:
+- __teliva_timestamp: original
+  zettels:
     >zettels = {
     >  root="a",
     >  a={
@@ -2227,50 +268,7 @@
     >    prev="c",
     >  }
     >}
-  __teliva_timestamp:
-    >Fri Feb  4 23:21:16 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0
-    >  -- render zettels depth-first, while tracking relative positions
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      local zettel = zettels[currid]
-    >      local currbg = (currid == current_zettel_id) and view_settings.current_zettel_bg or bg
-    >      render_zettel(window, currbg, depth(zettel) * view_settings.indent, y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y + view_settings.height + view_settings.vmargin
-    >      if y > lines then
-    >        y = 0
-    >        x = x + view_settings.width + view_settings.hmargin
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '? ')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:28:22 2022
-- __teliva_timestamp:
-    >Fri Feb  4 23:32:33 2022
+- __teliva_timestamp: original
   render_state:
     >-- some information about what's been drawn on screen
     >render_state = {
@@ -2280,448 +278,8 @@
     >  -- what zettel is at each position on screen, in units of zettels
     >  hw2id = {},
     >}
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0 -- units of characters (0-based)
-    >  local w, h = 1, 1 -- units of zettels (1-based)
-    >  -- render zettels depth-first, while tracking relative positions
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  render_state.wh2id = {{}}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      table.insert(render_state.wh2id[w], currid)
-    >      local zettel = zettels[currid]
-    >      if currid == current_zettel_id then
-    >        render_state.curr_w = w
-    >        render_state.curr_h = h
-    >      end
-    >      local currbg = (currid == current_zettel_id) and view_settings.current_zettel_bg or bg
-    >      render_zettel(window, currbg, depth(zettel) * view_settings.indent, y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y + view_settings.height + view_settings.vmargin
-    >      h = h + 1
-    >      if y > lines then
-    >        y = 0
-    >        h = 1
-    >        x = x + view_settings.width + view_settings.hmargin
-    >        w = w + 1
-    >        table.insert(render_state.wh2id, {})
-    >        if x > cols then break end
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '? ')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:37:44 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if curr_h > 0 then
-    >      
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:40:31 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 0 then
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:41:11 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 0 then
-    >      current_zettel_id = render_state.rw2id[render_state.curr_w][render_state.curr_h - 1]
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:42:28 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 0 then
-    >      current_zettel_id = render_state.hw2id[render_state.curr_w][render_state.curr_h - 1]
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:42:52 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 0 then
-    >      print(#render_state.hw2id)
-    >      window:getch()
-    >      current_zettel_id = render_state.hw2id[render_state.curr_w][render_state.curr_h - 1]
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:43:51 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 0 then
-    >      print(#render_state.wh2id)
-    >      window:getch()
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w][render_state.curr_h - 1]
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:44:25 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 0 then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w][render_state.curr_h - 1]
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:44:44 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 0 then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w][render_state.curr_h - 1]
-    >    end
-    >  elseif key == curses.KEY_DOWN then
-    >    if render_state.wh2id[render_state.curr_w][render_state.curr_h + 1] then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w][render_state.curr_h + 1]
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:45:54 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 0 then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w][render_state.curr_h - 1]
-    >    end
-    >  elseif key == curses.KEY_DOWN then
-    >    if render_state.wh2id[render_state.curr_w][render_state.curr_h + 1] then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w][render_state.curr_h + 1]
-    >    end
-    >  elseif key == curses.KEY_LEFT then
-    >    if render_state.curr_w > 0 then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w - 1][render_state.curr_h]
-    >    end
-    >  elseif key == curses.KEY_RIGHT then
-    >    if render_state.wh2id[render_state.curr_w + 1][render_state.curr_h] then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w + 1][render_state.curr_h]
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:47:48 2022
-- update:
-    >function update(window)
-    >  local key = curses.getch()
-    >  local curr = zettels[current_zettel_id]
-    >  -- graph-based navigation
-    >  if key == string.byte('j') then
-    >    if curr.child then
-    >      current_zettel_id = curr.child
-    >    elseif curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  elseif key == string.byte('k') then
-    >    if curr.parent then current_zettel_id = curr.parent end
-    >  elseif key == string.byte('h') then
-    >    if curr.prev then
-    >      current_zettel_id = curr.prev
-    >    elseif curr.parent then
-    >      current_zettel_id = curr.parent
-    >    end
-    >  elseif key == string.byte('l') then
-    >    if curr.next then
-    >      current_zettel_id = curr.next
-    >    elseif curr.parent and zettels[curr.parent].next then
-    >      current_zettel_id = zettels[curr.parent].next
-    >    end
-    >  -- screen-based navigation
-    >  elseif key == curses.KEY_UP then
-    >    if render_state.curr_h > 1 then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w][render_state.curr_h - 1]
-    >    end
-    >  elseif key == curses.KEY_DOWN then
-    >    if render_state.wh2id[render_state.curr_w][render_state.curr_h + 1] then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w][render_state.curr_h + 1]
-    >    end
-    >  elseif key == curses.KEY_LEFT then
-    >    if render_state.curr_w > 1 then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w - 1][render_state.curr_h]
-    >    end
-    >  elseif key == curses.KEY_RIGHT then
-    >    if render_state.wh2id[render_state.curr_w + 1][render_state.curr_h] then
-    >      current_zettel_id = render_state.wh2id[render_state.curr_w + 1][render_state.curr_h]
-    >    end
-    >  end
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:48:34 2022
-- update:
+- __teliva_timestamp: original
+  update:
     >function update(window)
     >  local key = curses.getch()
     >  local curr = zettels[current_zettel_id]
@@ -2767,120 +325,8 @@
     >    end
     >  end
     >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:49:04 2022
-  __teliva_note:
-    >screen-based zettel navigation
-    >
-    >left/right arrows not tested yet
-- view_settings:
-    >view_settings = {
-    >  -- dimensions for rendering a single zettel; extra text gets truncated
-    >  width=50,
-    >  height=40,
-    >  -- spacing between zettels
-    >  hmargin=1,
-    >  vmargin=1,
-    >  --
-    >  indent=2,  -- how children of a zettel are indicated
-    >  current_zettel_bg=3,  -- color pair index initialized in init_colors
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 23:52:43 2022
-- view_settings:
-    >view_settings = {
-    >  -- dimensions for rendering a single zettel; extra text gets truncated
-    >  width=50,
-    >  height=3,
-    >  -- spacing between zettels
-    >  hmargin=1,
-    >  vmargin=1,
-    >  --
-    >  indent=2,  -- how children of a zettel are indicated
-    >  current_zettel_bg=3,  -- color pair index initialized in init_colors
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 23:53:07 2022
-- render:
-    >function render(window)
-    >  window:clear()
-    >  local lines, cols = window:getmaxyx()
-    >  local bg=1
-    >  local y, x = 0, 0 -- units of characters (0-based)
-    >  local w, h = 1, 1 -- units of zettels (1-based)
-    >  -- render zettels depth-first, while tracking relative positions
-    >  local done = {}
-    >  local inprogress = {zettels.root}
-    >  render_state.wh2id = {{}}
-    >  while #inprogress > 0 do
-    >    local currid = table.remove(inprogress)
-    >    if not done[currid] then
-    >      done[currid] = true
-    >      table.insert(render_state.wh2id[w], currid)
-    >      local zettel = zettels[currid]
-    >      if currid == current_zettel_id then
-    >        render_state.curr_w = w
-    >        render_state.curr_h = h
-    >      end
-    >      local currbg = (currid == current_zettel_id) and view_settings.current_zettel_bg or bg
-    >      render_zettel(window, currbg, depth(zettel) * view_settings.indent, y, x, zettel)
-    >      if zettel.next then table.insert(inprogress, zettel.next) end
-    >      if zettel.child then table.insert(inprogress, zettel.child) end
-    >      bg = 3 - bg  -- toggle between color pairs 1 and 2
-    >      y = y + view_settings.height + view_settings.vmargin
-    >      h = h + 1
-    >      if y > lines then
-    >        y = 0
-    >        h = 1
-    >        x = x + view_settings.width + view_settings.hmargin
-    >        w = w + 1
-    >        if x + view_settings.width > cols then break end
-    >        table.insert(render_state.wh2id, {})
-    >      end
-    >    end
-    >  end
-    >  window:mvaddstr(lines-2, 0, '')
-    >  for i=1,3 do
-    >    window:attrset(curses.color_pair(i%2+1))
-    >    window:addstr('')
-    >    spaces(view_settings.width-string.len(''))
-    >    window:attrset(curses.color_pair(0))
-    >    window:addstr(' ')  -- margin
-    >  end
-    >  window:mvaddstr(lines-1, 0, '? ')
-    >  curses.refresh()
-    >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:53:57 2022
-- view_settings:
-    >view_settings = {
-    >  -- dimensions for rendering a single zettel; extra text gets truncated
-    >  width=50,
-    >  height=35,
-    >  -- spacing between zettels
-    >  hmargin=1,
-    >  vmargin=1,
-    >  --
-    >  indent=2,  -- how children of a zettel are indicated
-    >  current_zettel_bg=3,  -- color pair index initialized in init_colors
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 23:54:07 2022
-- view_settings:
-    >view_settings = {
-    >  -- dimensions for rendering a single zettel; extra text gets truncated
-    >  width=50,
-    >  height=40,
-    >  -- spacing between zettels
-    >  hmargin=1,
-    >  vmargin=1,
-    >  --
-    >  indent=2,  -- how children of a zettel are indicated
-    >  current_zettel_bg=3,  -- color pair index initialized in init_colors
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 23:54:18 2022
-- render:
+- __teliva_timestamp: original
+  render:
     >function render(window)
     >  window:clear()
     >  local lines, cols = window:getmaxyx()
@@ -2929,26 +375,7 @@
     >  window:mvaddstr(lines-1, 0, '? ')
     >  curses.refresh()
     >end
-  __teliva_timestamp:
-    >Fri Feb  4 23:54:51 2022
-- view_settings:
-    >view_settings = {
-    >  -- dimensions for rendering a single zettel; extra text gets truncated
-    >  width=50,
-    >  height=35,
-    >  -- spacing between zettels
-    >  hmargin=1,
-    >  vmargin=1,
-    >  --
-    >  indent=2,  -- how children of a zettel are indicated
-    >  current_zettel_bg=3,  -- color pair index initialized in init_colors
-    >}
-  __teliva_timestamp:
-    >Fri Feb  4 23:54:58 2022
-- __teliva_note:
-    >tested multi-column render and nav
-  __teliva_timestamp:
-    >Fri Feb  4 23:55:10 2022
+- __teliva_timestamp: original
   view_settings:
     >view_settings = {
     >  -- dimensions for rendering a single zettel; extra text gets truncated