summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAiden Cline <[email protected]>2025-07-09 04:42:31 -0500
committerGitHub <[email protected]>2025-07-09 04:42:31 -0500
commit67765fa47c54c0d0b8146fb124c0d412e09bf5e8 (patch)
treebb03ac2d6e72ef1f160ce885fee4b87d6a012f63
parent58b1c58bc59e82ea05dfa5f4dfce8111c4e2995a (diff)
downloadopencode-67765fa47c54c0d0b8146fb124c0d412e09bf5e8.tar.gz
opencode-67765fa47c54c0d0b8146fb124c0d412e09bf5e8.zip
tweak: keep completion options open when trigger is still present (#789)
-rw-r--r--packages/tui/internal/components/dialog/complete.go17
-rw-r--r--packages/tui/internal/tui/tui.go6
2 files changed, 15 insertions, 8 deletions
diff --git a/packages/tui/internal/components/dialog/complete.go b/packages/tui/internal/components/dialog/complete.go
index 7ba91dc5f..8173c8af1 100644
--- a/packages/tui/internal/components/dialog/complete.go
+++ b/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,
}
}
diff --git a/packages/tui/internal/tui/tui.go b/packages/tui/internal/tui/tui.go
index 3dc71140c..73dd01186 100644
--- a/packages/tui/internal/tui/tui.go
+++ b/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 != "" {