@@ -36,7 +36,8 @@ type CompletionsOpenedMsg struct{}
36type CloseCompletionsMsg struct{}
36type CloseCompletionsMsg struct{}
38type SelectCompletionMsg struct {
38type SelectCompletionMsg struct {
39− Value any // The value of the selected completion item
39+ Value any // The value of the selected completion item
42type Completions interface {
43type Completions interface {
@@ -115,6 +116,30 @@ func (c *completionsCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
115 d, cmd := c.list.Update(msg)
116 d, cmd := c.list.Update(msg)
116 c.list = d.(list.ListModel)
117 c.list = d.(list.ListModel)
117 return c, cmd
118 return c, cmd
119+ case key.Matches(msg, c.keyMap.UpInsert):
120+ selectedItemInx := c.list.SelectedIndex() - 1
121+ items := c.list.Items()
122+ if selectedItemInx == list.NoSelection || selectedItemInx < 0 {
123+ return c, nil // No item selected, do nothing
125+ selectedItem := items[selectedItemInx].(CompletionItem).Value()
126+ c.list.SetSelected(selectedItemInx)
127+ return c, util.CmdHandler(SelectCompletionMsg{
128+ Value: selectedItem,
131+ case key.Matches(msg, c.keyMap.DownInsert):
132+ selectedItemInx := c.list.SelectedIndex() + 1
133+ items := c.list.Items()
134+ if selectedItemInx == list.NoSelection || selectedItemInx >= len(items) {
135+ return c, nil // No item selected, do nothing
137+ selectedItem := items[selectedItemInx].(CompletionItem).Value()
138+ c.list.SetSelected(selectedItemInx)
139+ return c, util.CmdHandler(SelectCompletionMsg{
140+ Value: selectedItem,
118 case key.Matches(msg, c.keyMap.Select):
143 case key.Matches(msg, c.keyMap.Select):
119 selectedItemInx := c.list.SelectedIndex()
144 selectedItemInx := c.list.SelectedIndex()
120 if selectedItemInx == list.NoSelection {
145 if selectedItemInx == list.NoSelection {