Просмотр исходного кода

tweak: keep completion options open when trigger is still present (#789)

Aiden Cline 7 месяцев назад
Родитель
Сommit
67765fa47c

+ 12 - 5
packages/tui/internal/components/dialog/complete.go

@@ -2,6 +2,7 @@ package dialog
 
 import (
 	"log/slog"
+	"strings"
 
 	"github.com/charmbracelet/bubbles/v2/key"
 	"github.com/charmbracelet/bubbles/v2/textarea"
@@ -87,6 +88,7 @@ type completionDialogComponent struct {
 	height               int
 	pseudoSearchTextArea textarea.Model
 	list                 list.List[CompletionItemI]
+	trigger              string
 }
 
 type completionDialogKeyMap struct {
@@ -119,8 +121,8 @@ func (c *completionDialogComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 				c.pseudoSearchTextArea, cmd = c.pseudoSearchTextArea.Update(msg)
 				cmds = append(cmds, cmd)
 
-				var query string
-				query = c.pseudoSearchTextArea.Value()
+				fullValue := c.pseudoSearchTextArea.Value()
+				query := strings.TrimPrefix(fullValue, c.trigger)
 
 				if query != c.query {
 					c.query = query
@@ -147,8 +149,9 @@ func (c *completionDialogComponent) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 				}
 				return c, c.complete(item)
 			case key.Matches(msg, completionDialogKeys.Cancel):
-				// Only close on backspace when there are no characters left
-				if msg.String() != "backspace" || len(c.pseudoSearchTextArea.Value()) <= 0 {
+				// Only close on backspace when there are no characters left, unless we're back to just the trigger
+				value := c.pseudoSearchTextArea.Value()
+				if msg.String() != "backspace" || (len(value) <= len(c.trigger) && value != c.trigger) {
 					return c, c.close()
 				}
 			}
@@ -227,7 +230,7 @@ func (c *completionDialogComponent) close() tea.Cmd {
 	return util.CmdHandler(CompletionDialogCloseMsg{})
 }
 
-func NewCompletionDialogComponent(completionProvider CompletionProvider) CompletionDialog {
+func NewCompletionDialogComponent(completionProvider CompletionProvider, trigger string) CompletionDialog {
 	ti := textarea.New()
 
 	li := list.NewListComponent(
@@ -245,10 +248,14 @@ func NewCompletionDialogComponent(completionProvider CompletionProvider) Complet
 		li.SetItems(items)
 	}()
 
+	// Initialize the textarea with the trigger character
+	ti.SetValue(trigger)
+
 	return &completionDialogComponent{
 		query:                "",
 		completionProvider:   completionProvider,
 		pseudoSearchTextArea: ti,
 		list:                 li,
+		trigger:              trigger,
 	}
 }

+ 3 - 3
packages/tui/internal/tui/tui.go

@@ -202,7 +202,7 @@ func (a appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			cmds = append(cmds, cmd)
 
 			// Set command provider for command completion
-			a.completions = dialog.NewCompletionDialogComponent(a.commandProvider)
+			a.completions = dialog.NewCompletionDialogComponent(a.commandProvider, "/")
 			updated, cmd = a.completions.Update(msg)
 			a.completions = updated.(dialog.CompletionDialog)
 			cmds = append(cmds, cmd)
@@ -221,7 +221,7 @@ func (a appModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
 			cmds = append(cmds, cmd)
 
 			// Set file provider for file completion
-			a.completions = dialog.NewCompletionDialogComponent(a.fileProvider)
+			a.completions = dialog.NewCompletionDialogComponent(a.fileProvider, "@")
 			updated, cmd = a.completions.Update(msg)
 			a.completions = updated.(dialog.CompletionDialog)
 			cmds = append(cmds, cmd)
@@ -1034,7 +1034,7 @@ func NewModel(app *app.App) tea.Model {
 
 	messages := chat.NewMessagesComponent(app)
 	editor := chat.NewEditorComponent(app)
-	completions := dialog.NewCompletionDialogComponent(commandProvider)
+	completions := dialog.NewCompletionDialogComponent(commandProvider, "/")
 
 	var leaderBinding *key.Binding
 	if app.Config.Keybinds.Leader != "" {