search_bench_test.go RawHistoryFolder

1package copy
2
3import (
4	"fmt"
5	"strings"
6	"testing"
7
8	vt "github.com/bnema/vev-vt"
9	renderer "github.com/bnema/vev-vt/ansi"
10)
11
12var benchmarkMatchesSink []SearchMatch
13
14// BenchmarkFindMatches12K measures one copy-search keystroke over a full
15// default-sized scrollback (12k rows x 160 columns), with hot and idle
16// (compressed) history pages.
17func BenchmarkFindMatches12K(b *testing.B) {
18	const rows, width = 12_000, 160
19	for _, cold := range []bool{false, true} {
20		b.Run(fmt.Sprintf("cold-%v", cold), func(b *testing.B) {
21			history := vt.NewHistory(vt.HistoryConfig{MaxRows: rows, ChunkRows: 256})
22			words := strings.Fields("build test vet lint daemon client render diff pane tab session snapshot")
23			for i := range rows {
24				var line strings.Builder
25				fmt.Fprintf(&line, "line %06d", i)
26				for j := 0; line.Len() < width-12; j++ {
27					line.WriteString(" " + words[(i+j)%len(words)])
28				}
29				cells := row(line.String())
30				if err := history.Append(cells, vt.LineBound{End: len(cells)}); err != nil {
31					b.Fatal(err)
32				}
33			}
34			if cold {
35				history.SealAndView()
36				for range 2 {
37					if _, err := history.CompressIdle(rows); err != nil {
38						b.Fatal(err)
39					}
40				}
41			}
42			doc := NewDocument(NewSnapshot(history, renderer.NewFrame(width, 45), nil, nil), "")
43			b.ReportAllocs()
44			for b.Loop() {
45				benchmarkMatchesSink = FindMatches(doc, "snapsh")
46			}
47			if len(benchmarkMatchesSink) == 0 {
48				b.Fatal("expected matches")
49			}
50		})
51	}
52}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 12

Tags 11

↑↓ moveenter openesc close