The harness records OSC 52 clipboard writes and pastes through libghostty's encoder. New screens show the copy marker on plain and selected cells (with light variants), a cut, the undo note and the narrow layout; the renderer now draws underline styles.
- commit
- a2eb17eed4c01b9c4e87f2a6e4fddb46b00d5252
- parent
- 89336a7d66c744189d74bf384b508ca4b1eb53b7
- author
- Dami <dami.etoile@gmail.com>
| M | e2e/ | 69 | ++++++++++++++++++++++++++++++ |
| A | e2e/ | 59 | ++++++++++++++++++++++++++ |
| M | e2e/ | 11 | ++++- |
| M | e2e/ | 22 | +++++++++- |
| A | e2e/ | 30 | +++++++++++++ |
| A | e2e/ | 30 | +++++++++++++ |
| A | e2e/ | 30 | +++++++++++++ |
| A | e2e/ | 30 | +++++++++++++ |
| A | e2e/ | 16 | +++++++ |
| A | e2e/ | 30 | +++++++++++++ |
@@ -131,6 +131,75 @@ func TestResizeShowsMoreColumns(t *testing.T) {
131131 s.eventually("column N after resize", func() bool { return strings.Contains(s.line(3), " N") })132132 }133133 134+func TestCopyPasteAdjustsReferences(t *testing.T) {135+ s := start(t, "")136+ clip := s.watchClipboard()137+ s.keys("2", "<tab>", "=A1*10", "<enter>", "3", "<enter>", "<ctrl+home>", "<right>", "<ctrl+c>")138+ s.waitFor("Copied B1")139+ s.eventually("system clipboard", func() bool { return clip.get() == "20" })140+ s.keys("<down>", "<ctrl+v>")141+ s.waitFor("Pasted 1 cell at B2")142+ s.waitFor("B2 =A2*10")143+ s.waitForLine(gridRow1+1, numRow(2, "3", "30"))144+145+ // Esc clears the marker; the paste stays.146+ s.keys("<esc>")147+ s.eventually("marker cleared", func() bool { return !strings.Contains(s.line(2), "Copied") })148+149+ // Cut and paste moves the cell and the formula that uses it follows.150+ s.keys("<ctrl+home>", "<ctrl+x>", "<down>", "<down>", "<down>", "<ctrl+v>")151+ s.waitFor("Moved A1 to A4")152+ s.keys("<ctrl+home>", "<right>")153+ s.waitFor("B1 =A4*10")154+ s.waitForLine(gridRow1+3, numRow(4, "2"))155+}156+157+func TestUndoRedo(t *testing.T) {158+ s := start(t, "")159+ s.keys("10", "<enter>", "=A1+1", "<enter>", "<up>", "<up>", "<shift+down>", "<delete>")160+ s.waitForLine(gridRow1, " 1")161+ s.keys("<ctrl+z>")162+ s.waitFor("Undid: clear A1:A2")163+ s.waitForLine(gridRow1+1, numRow(2, "11"))164+ s.keys("<ctrl+y>")165+ s.waitFor("Redid: clear A1:A2")166+ s.waitForLine(gridRow1+1, " 2")167+ s.keys("<ctrl+shift+z>")168+ s.waitFor("Nothing to redo")169+}170+171+func TestInsertRowRewritesFormulas(t *testing.T) {172+ s := start(t, "")173+ s.keys("1", "<enter>", "2", "<enter>", "=SUM(A1:A2)", "<enter>")174+ s.keys("<up>", "<up>", "<shift+space>", "<ctrl+alt+=>")175+ s.waitForLine(gridRow1+3, numRow(4, "3"))176+ s.keys("<down>", "<down>")177+ s.waitFor("A4 =SUM(A1:A3)")178+ s.keys("<up>", "<up>", "5", "<enter>")179+ s.waitForLine(gridRow1+3, numRow(4, "8"))180+ s.keys("<ctrl+z>", "<ctrl+z>")181+ s.waitFor("Undid: insert 1 row")182+ s.waitForLine(gridRow1+2, numRow(3, "3"))183+}184+185+func TestPasteTSVFillsCells(t *testing.T) {186+ s := start(t, "")187+ s.paste("Item\tCost\nRent\t1450\nFood\t=B2/2\n")188+ s.waitFor("Pasted 6 cells at A1:B3")189+ s.waitForLine(gridRow1+2, " 3 Food 725")190+}191+192+func TestFillAndAbsoluteReferences(t *testing.T) {193+ s := start(t, "")194+ s.keys("2", "<enter>", "3", "<enter>", "4", "<enter>", "<ctrl+home>", "<right>")195+ s.keys("=A1*A1", "<left>", "<left>", "<f4>")196+ s.waitForLine(1, "=A1*$A$1")197+ s.keys("<enter>", "<up>", "<shift+down>", "<shift+down>", "<ctrl+d>")198+ s.waitForLine(gridRow1+2, numRow(3, "4", "8"))199+ s.keys("<right>", "<shift+down>", "=B1+1", "<ctrl+enter>")200+ s.waitForLine(gridRow1+1, numRow(2, "3", "6", "7"))201+}202+134203 // Click handling is covered by the unit tests; this checks the program135204 // actually turned on mouse reporting in the terminal.136205 func TestMouseTrackingEnabled(t *testing.T) {@@ -0,0 +1,59 @@
1+package e2e2+3+import (4+ "sync"5+6+ ghostty "go.mitchellh.com/libghostty"7+)8+9+func init() {10+ namedKeys["f4"] = ghostty.KeyF411+}12+13+// clipboard records what the program writes to the system clipboard14+// through the terminal (OSC 52).15+type clipboard struct {16+ mu sync.Mutex17+ text string18+}19+20+func (c *clipboard) get() string {21+ c.mu.Lock()22+ defer c.mu.Unlock()23+ return c.text24+}25+26+// watchClipboard makes the terminal accept clipboard writes and records27+// them.28+func (s *session) watchClipboard() *clipboard {29+ c := &clipboard{}30+ s.mu.Lock()31+ defer s.mu.Unlock()32+ s.vt.SetEffectClipboardWrite(func(_ *ghostty.Terminal, w ghostty.ClipboardWrite) ghostty.ClipboardWriteReply {33+ c.mu.Lock()34+ defer c.mu.Unlock()35+ for _, content := range w.Contents {36+ if content.MIME == "text/plain" || c.text == "" {37+ c.text = string(content.Data)38+ }39+ }40+ return ghostty.ClipboardWriteReply{Result: ghostty.ClipboardWriteSuccess}41+ })42+ return c43+}44+45+// paste pastes text as the terminal would, with bracketed paste when the46+// program asked for it.47+func (s *session) paste(text string) {48+ s.t.Helper()49+ s.mu.Lock()50+ bracketed, _ := s.vt.Mode(ghostty.ModeBracketedPaste)51+ s.mu.Unlock()52+ data, err := ghostty.PasteEncode([]byte(text), bracketed)53+ if err != nil {54+ s.t.Fatal(err)55+ }56+ if _, err := s.pty.Write(data); err != nil {57+ s.t.Fatal(err)58+ }59+}@@ -109,8 +109,15 @@ func styleCSS(st *ghostty.Style) string {
109109 if st.Faint() {110110 parts = append(parts, "opacity:.6")111111 }112- if st.Underline() != 0 {113- parts = append(parts, "text-decoration:underline")112+ if u := st.Underline(); u != ghostty.UnderlineNone {113+ line := map[ghostty.SGRUnderline]string{114+ ghostty.UnderlineDouble: " double", ghostty.UnderlineCurly: " wavy",115+ ghostty.UnderlineDotted: " dotted", ghostty.UnderlineDashed: " dashed",116+ }[u]117+ if c := cssColor(st.UnderlineColor(), ""); c != "" {118+ line += " " + c119+ }120+ parts = append(parts, "text-decoration:underline"+line)114121 }115122 if st.Strikethrough() {116123 parts = append(parts, "text-decoration:line-through")@@ -99,12 +99,32 @@ var screens = []screen{
9999 s.mouse(ghostty.MouseActionMotion, ghostty.MouseButtonLeft, 6+10+5, 3, 0)100100 s.waitFor("Column A width 16")101101 }},102+ {name: "copy-marker", setup: func(s *session) {103+ budget(s)104+ s.keys("<up>", "<up>", "<up>", "<up>", "<shift+down>", "<shift+down>", "<ctrl+c>", "<right>", "<up>")105+ s.waitFor("Copied B3:B5")106+ }},107+ {name: "copy-marker-selected", setup: func(s *session) {108+ budget(s)109+ s.keys("<left>", "<up>", "<up>", "<up>", "<up>", "<shift+down>", "<shift+down>", "<shift+right>", "<ctrl+x>")110+ s.waitFor("Cut A3:B5")111+ }},112+ {name: "undo-note", setup: func(s *session) {113+ budget(s)114+ s.keys("<up>", "<shift+up>", "<delete>", "<ctrl+z>")115+ s.waitFor("Undid: clear B5:B6")116+ }},117+ {name: "narrow-copy", opts: options{cols: 60, rows: 16}, setup: func(s *session) {118+ budget(s)119+ s.keys("<ctrl+c>", "<down>")120+ s.waitFor("Copied B7")121+ }},102122 }103123 104124 // Key screens are also recorded on a light terminal, where the app picks105125 // its light theme from the reported background color.106126 func init() {107- for _, name := range []string{"budget", "point-range", "selection-stats", "quit-confirm", "help", "resizing-column"} {127+ for _, name := range []string{"budget", "point-range", "selection-stats", "quit-confirm", "help", "resizing-column", "copy-marker", "copy-marker-selected"} {108128 for _, sc := range screens {109129 if sc.name == name {110130 sc.name += "-light"@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> C2 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Copied B3:B5 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-0)">paste </span><span style="font-weight:bold">Ctrl+Shift+V</span> <span style="color:var(--vt-palette-0)">paste values </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-0)">clear</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> A B </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> C </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> D E F G H I </span>5+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 2 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)"> </span>7+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 3 </span> Rent <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">1450</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>8+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 4 </span> Groceries<span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">612.4</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>9+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 5 </span> Transit <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">96</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>10+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 8 </span>13+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 9 </span>14+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 10 </span>15+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 11 </span>16+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 12 </span>17+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 13 </span>18+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 14 </span>19+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 15 </span>20+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 16 </span>21+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 17 </span>22+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 18 </span>23+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 19 </span>24+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 20 </span>25+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 21 </span>26+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 22 </span>27+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 23 </span>28+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 24 </span>29+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 25 </span>30+untitled<span style="color:var(--vt-palette-0)"> modified</span> <span style="font-weight:bold">F1</span> <span style="color:var(--vt-palette-0)">help </span><span style="font-weight:bold">F10</span> <span style="color:var(--vt-palette-0)">menu </span><span style="font-weight:bold">Ctrl+Q</span> <span style="color:var(--vt-palette-0)">quit</span></pre>\ No newline at end of file@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> A3 </span> Rent <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Cut A3:B5 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-0)">move here </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-0)">cancel</span>4+<span style="background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> A </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4)"> B </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> C D E F G H I </span>5+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 2 </span>7+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 3 </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline dashed">Rent</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">1450</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span>8+<span style="color:var(--vt-palette-15);background:var(--vt-palette-4)"> 4 </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">Groceries</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">612.4</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span>9+<span style="color:var(--vt-palette-15);background:var(--vt-palette-4)"> 5 </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">Transit</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline dashed">96</span><span style="color:var(--vt-palette-15);background:var(--vt-palette-4);text-decoration:underline"> </span>10+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 8 </span>13+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 9 </span>14+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 10 </span>15+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 11 </span>16+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 12 </span>17+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 13 </span>18+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 14 </span>19+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 15 </span>20+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 16 </span>21+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 17 </span>22+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 18 </span>23+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 19 </span>24+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 20 </span>25+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 21 </span>26+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 22 </span>27+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 23 </span>28+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 24 </span>29+<span style="color:var(--vt-palette-0);background:var(--vt-palette-7)"> 25 </span>30+untitled<span style="color:var(--vt-palette-0)"> modified</span> <span style="font-weight:bold">A3:B5</span> <span style="color:var(--vt-palette-0)">Sum </span>2158.4 <span style="color:var(--vt-palette-0)">Avg </span>719.47 <span style="color:var(--vt-palette-0)">Count </span>6</pre>\ No newline at end of file@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> A3 </span> Rent <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Cut A3:B5 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-8)">move here </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-8)">cancel</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> A </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> B </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> C D E F G H I </span>5+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 2 </span>7+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 3 </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline dashed">Rent</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">1450</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span>8+<span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> 4 </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">Groceries</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">612.4</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span>9+<span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> 5 </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">Transit</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline dashed">96</span><span style="color:var(--vt-palette-0);background:var(--vt-palette-4);text-decoration:underline"> </span>10+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 8 </span>13+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 9 </span>14+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 10 </span>15+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 11 </span>16+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 12 </span>17+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 13 </span>18+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 14 </span>19+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 15 </span>20+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 16 </span>21+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 17 </span>22+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 18 </span>23+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 19 </span>24+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 20 </span>25+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 21 </span>26+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 22 </span>27+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 23 </span>28+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 24 </span>29+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 25 </span>30+untitled<span style="color:var(--vt-palette-8)"> modified</span> <span style="font-weight:bold">A3:B5</span> <span style="color:var(--vt-palette-8)">Sum </span>2158.4 <span style="color:var(--vt-palette-8)">Avg </span>719.47 <span style="color:var(--vt-palette-8)">Count </span>6</pre>\ No newline at end of file@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> C2 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Copied B3:B5 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-8)">paste </span><span style="font-weight:bold">Ctrl+Shift+V</span> <span style="color:var(--vt-palette-8)">paste values </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-8)">clear</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> A B </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> C </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> D E F G H I </span>5+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 2 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)"> </span>7+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 3 </span> Rent <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">1450</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>8+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 4 </span> Groceries<span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">612.4</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>9+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 5 </span> Transit <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">96</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>10+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 8 </span>13+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 9 </span>14+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 10 </span>15+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 11 </span>16+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 12 </span>17+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 13 </span>18+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 14 </span>19+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 15 </span>20+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 16 </span>21+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 17 </span>22+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 18 </span>23+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 19 </span>24+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 20 </span>25+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 21 </span>26+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 22 </span>27+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 23 </span>28+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 24 </span>29+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 25 </span>30+untitled<span style="color:var(--vt-palette-8)"> modified</span> <span style="font-weight:bold">F1</span> <span style="color:var(--vt-palette-8)">help </span><span style="font-weight:bold">F10</span> <span style="color:var(--vt-palette-8)">menu </span><span style="font-weight:bold">Ctrl+Q</span> <span style="color:var(--vt-palette-8)">quit</span></pre>\ No newline at end of file@@ -0,0 +1,16 @@
1+<pre class="screen"><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> B8 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Copied B7 <span style="font-weight:bold">Ctrl+V</span> <span style="color:var(--vt-palette-8)">paste </span><span style="font-weight:bold">Esc</span> <span style="color:var(--vt-palette-8)">clear</span>4+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> A </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> B </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> C D E </span>5+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 2 </span>7+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 3 </span> Rent 14508+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 4 </span> Groceries 612.49+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 5 </span> Transit 9610+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 6 </span> Savings r<span style="color:var(--vt-palette-1)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 7 </span> Total <span style="color:var(--vt-palette-5);text-decoration:underline"> </span><span style="color:var(--vt-palette-5);text-decoration:underline dashed">2158.4</span><span style="color:var(--vt-palette-5);text-decoration:underline"> </span>12+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 8 </span> <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)"> </span>13+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 9 </span>14+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 10 </span>15+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 11 </span>16+untitled<span style="color:var(--vt-palette-8)"> modified</span> <span style="font-weight:bold">F1</span> <span style="color:var(--vt-palette-8)">help </span><span style="font-weight:bold">F10</span> <span style="color:var(--vt-palette-8)">menu </span><span style="font-weight:bold">Ctrl+Q</span> <span style="color:var(--vt-palette-8)">quit</span></pre>\ No newline at end of file@@ -0,0 +1,30 @@
1+<pre class="screen"><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> B5 </span> 96 <span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> READY</span><span style="background:var(--vt-palette-6)"> </span>2+3+Undid: clear B5:B64+<span style="background:var(--vt-palette-8)"> </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> A </span><span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> B </span><span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> C D E F G H I </span>5+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 1 </span> Household budget 20266+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 2 </span>7+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 3 </span> Rent 14508+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 4 </span> Groceries 612.49+<span style="color:var(--vt-palette-0);background:var(--vt-palette-6);font-weight:bold"> 5 </span> Transit <span style="color:var(--vt-palette-0);background:var(--vt-palette-6)"> 96 </span>10+<span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> 6 </span> Savings r<span style="color:var(--vt-palette-0);background:var(--vt-palette-4)"> #DIV/0! </span>11+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 7 </span> Total 2158.412+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 8 </span>13+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 9 </span>14+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 10 </span>15+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 11 </span>16+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 12 </span>17+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 13 </span>18+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 14 </span>19+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 15 </span>20+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 16 </span>21+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 17 </span>22+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 18 </span>23+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 19 </span>24+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 20 </span>25+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 21 </span>26+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 22 </span>27+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 23 </span>28+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 24 </span>29+<span style="color:var(--vt-palette-15);background:var(--vt-palette-8)"> 25 </span>30+untitled<span style="color:var(--vt-palette-8)"> modified</span> <span style="font-weight:bold">B5:B6</span> <span style="color:var(--vt-palette-8)">Sum </span>96 <span style="color:var(--vt-palette-8)">Avg </span>96 <span style="color:var(--vt-palette-8)">Count </span>2</pre>\ No newline at end of file