textinput.go RawHistoryFolder

1package ui
2
3import (
4	renderer "github.com/bnema/vev-vt"
5	"github.com/bnema/vev/internal/domain"
6)
7
8// TextInput stores editable text as runes for terminal overlay input models.
9type TextInput struct {
10	runes []rune
11}
12
13func (t *TextInput) Insert(r rune) { t.runes = append(t.runes, r) }
14
15func (t *TextInput) Backspace() {
16	if len(t.runes) == 0 {
17		return
18	}
19	t.runes = t.runes[:len(t.runes)-1]
20}
21
22func (t *TextInput) Value() string { return string(t.runes) }
23
24func (t *TextInput) SetValue(value string) { t.runes = []rune(value) }
25
26// DrawInputLine draws prefix + value. The caret is not drawn: the daemon
27// places the real terminal cursor at InputCaret, so client predictive echo
28// can type ahead on the input line.
29func DrawInputLine(f renderer.Frame, y int, prefix, value string, style renderer.Style) {
30	if y < 0 || y >= f.Height {
31		return
32	}
33	DrawText(f, 0, y, f.Width, prefix+value, style)
34}
35
36// InputCaret is the caret column of an input line drawn by DrawInputLine on
37// row 0 of a frame of size inner. It reports false when the frame has no row
38// or prefix + value leaves no room for the caret, so a clipped line never
39// shows a misplaced cursor.
40func InputCaret(inner domain.Size, prefix, value string) (int, bool) {
41	col := 0
42	for _, r := range prefix + value {
43		col += renderer.RuneWidth(r)
44	}
45	return col, inner.Rows > 0 && col < inner.Cols
46}

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