-
Notifications
You must be signed in to change notification settings - Fork 0
/
mode_command_entry.go
122 lines (95 loc) · 2.77 KB
/
mode_command_entry.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package shell
import (
"strings"
"github.com/DomBlack/bubble-shell/pkg/tui/history"
"github.com/charmbracelet/bubbles/key"
tea "github.com/charmbracelet/bubbletea"
)
type CommandEntryMode struct{ KeepInputContent bool }
var _ Mode = (*CommandEntryMode)(nil)
func (c *CommandEntryMode) Enter(m Model) (Model, tea.Cmd) {
if !c.KeepInputContent {
m.input.SetValue(m.lookBackPartial)
}
m.lookBackPartial = ""
m.input.Prompt = m.cfg.PromptFunc()
m.input.CursorEnd()
m.input.Focus()
return m, nil
}
func (c *CommandEntryMode) Leave(m Model) (Model, tea.Cmd) {
m.lookBackPartial = m.input.Value()
m.input.Blur()
return m, nil
}
func (c *CommandEntryMode) Update(m Model, msg tea.Msg) (Model, tea.Cmd) {
switch msg := msg.(type) {
case tea.WindowSizeMsg:
var cmds []tea.Cmd
var cmd tea.Cmd
m.height = msg.Height
m.width = msg.Width
m.input.Width = m.width
m.history, cmd = m.history.Update(tea.WindowSizeMsg{
Width: msg.Width,
Height: msg.Height - 2, // one for the prompt, one for search and autocomplete
})
cmds = append(cmds, cmd)
// We only want to init once we have a window size
m.init = true
return m, tea.Batch(cmds...)
case tea.KeyMsg:
switch {
case key.Matches(msg, m.cfg.KeyMap.ExecuteCommand):
line := strings.TrimSpace(m.input.Value())
if line == "" {
return m, nil
}
if line == "exit" || line == "quit" {
return m, m.Shutdown
}
historyItem := history.NewItem(m.input.Prompt, line, history.RunningStatus)
m.input.SetValue("")
m.input.CursorEnd()
return m, tea.Sequence(
m.Enter(&CommandRunningMode{}),
m.history.AppendItem(historyItem),
m.ExecuteCommand(historyItem),
)
case key.Matches(msg, m.cfg.KeyMap.Up) && len(m.history.Items) > 0:
return m, m.Enter(&HistoryLookbackMode{TriggerMsg: msg})
case key.Matches(msg, m.cfg.KeyMap.SearchHistoryBackwards) && len(m.history.Items) > 0:
return m, m.Enter(&HistorySearchMode{})
case key.Matches(msg, m.cfg.KeyMap.AutoComplete):
return m, m.Enter(&AutoCompleteMode{})
case key.Matches(msg, m.cfg.KeyMap.Cancel):
if m.input.Value() != "" {
m.input.SetValue("")
m.input.CursorEnd()
return m, nil
} else {
return m, m.Shutdown
}
}
}
return m, nil
}
func (c *CommandEntryMode) AdditionalView(m Model) string {
return ""
}
func (c *CommandEntryMode) ShortHelp(m Model, keyMap KeyMap) []key.Binding {
cancel := keyMap.Cancel
if m.input.Value() != "" {
cancel.SetHelp(cancel.Help().Key, "clear input")
} else {
cancel.SetHelp(cancel.Help().Key, "exit")
}
return []key.Binding{
keyMap.Up, keyMap.SearchHistoryBackwards, keyMap.AutoComplete, keyMap.ExecuteCommand, cancel,
}
}
func (c *CommandEntryMode) FullHelp(m Model, keyMap KeyMap) [][]key.Binding {
return [][]key.Binding{
c.ShortHelp(m, keyMap),
}
}