v0.2.17 323df7f

shell_escape_test.go RawHistoryFolder

1package modes
2
3import (
4	"strings"
5	"testing"
6
7	"github.com/patriceckhart/zot/packages/tui"
8)
9
10func TestShellEscapeCommand(t *testing.T) {
11	cases := []struct {
12		in      string
13		wantCmd string
14		wantOK  bool
15	}{
16		{"!ls -la", "ls -la", true},
17		{"  !pwd", "pwd", true},
18		{"!  go test ./...  ", "go test ./...", true},
19		{"!", "", false},
20		{"!   ", "", false},
21		{"ls -la", "", false},
22		{"/help", "", false},
23		{"hello !world", "", false},
24	}
25	for _, c := range cases {
26		cmd, ok := shellEscapeCommand(c.in)
27		if ok != c.wantOK || cmd != c.wantCmd {
28			t.Errorf("shellEscapeCommand(%q) = (%q,%v); want (%q,%v)",
29				c.in, cmd, ok, c.wantCmd, c.wantOK)
30		}
31	}
32}
33
34func TestRenderShellBlockStylesFooterDimmed(t *testing.T) {
35	i := &Interactive{}
36	i.cfg.Theme = tui.Theme{Tool: 2, Error: 1, Muted: 8}
37
38	ok := i.renderShellBlock("$ echo hi\n\nhi\n\n[exit 0]  Took 0.1s", false)
39	if len(ok) == 0 {
40		t.Fatal("expected non-empty block")
41	}
42	// The success body uses the Tool color; the footer uses Muted.
43	body := strings.Join(ok, "\n")
44	if !strings.Contains(body, "echo hi") || !strings.Contains(body, "[exit 0]") {
45		t.Fatalf("block missing expected content: %q", body)
46	}
47
48	fail := i.renderShellBlock("$ false\n\n[exit 1]  Took 0.0s", true)
49	if len(fail) == 0 {
50		t.Fatal("expected non-empty failure block")
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 1

Tags 477

↑↓ moveenter openesc close