@@ -171,6 +171,8 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
171171 }
172172 m.attachments = append(m.attachments, msg.Attachment)
173173 return m, nil
174+ case completions.CompletionsOpenedMsg:
175+ m.isCompletionsOpen = true
174176 case completions.CompletionsClosedMsg:
175177 m.isCompletionsOpen = false
176178 m.currentQuery = ""
@@ -183,9 +185,6 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
183185 // If the selected item is a file, insert its path into the textarea
184186 value := m.textarea.Value()
185187 value = value[:m.completionsStartIndex]
186− if len(value) > 0 && value[len(value)-1] != ' ' {
187− value += " "
188− }
189188 value += item.Path
190189 m.textarea.SetValue(value)
191190 m.isCompletionsOpen = false
@@ -199,37 +198,15 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
199198 case tea.KeyPressMsg:
200199 switch {
201200 // Completions
202− case msg.String() == "/" && !m.isCompletionsOpen:
201+ case msg.String() == "/" && !m.isCompletionsOpen &&
202+ // only show if beginning of prompt, or if previous char is a space:
203+ (len(m.textarea.Value()) == 0 || m.textarea.Value()[len(m.textarea.Value())-1] == ' '):
203204 m.isCompletionsOpen = true
204205 m.currentQuery = ""
205− cmds = append(cmds, m.startCompletions)
206206 m.completionsStartIndex = len(m.textarea.Value())
207− case msg.String() == "space" && m.isCompletionsOpen:
208− m.isCompletionsOpen = false
209− m.currentQuery = ""
210− m.completionsStartIndex = 0
211− cmds = append(cmds, util.CmdHandler(completions.CloseCompletionsMsg{}))
207+ cmds = append(cmds, m.startCompletions)
212208 case m.isCompletionsOpen && m.textarea.Cursor().X <= m.completionsStartIndex:
213209 cmds = append(cmds, util.CmdHandler(completions.CloseCompletionsMsg{}))
214− case msg.String() == "backspace" && m.isCompletionsOpen:
215− if len(m.currentQuery) > 0 {
216− m.currentQuery = m.currentQuery[:len(m.currentQuery)-1]
217− cmds = append(cmds, util.CmdHandler(completions.FilterCompletionsMsg{
218− Query: m.currentQuery,
219− }))
220− } else {
221− m.isCompletionsOpen = false
222− m.currentQuery = ""
223− m.completionsStartIndex = 0
224− cmds = append(cmds, util.CmdHandler(completions.CloseCompletionsMsg{}))
225− }
226− default:
227− if m.isCompletionsOpen {
228− m.currentQuery += msg.String()
229− cmds = append(cmds, util.CmdHandler(completions.FilterCompletionsMsg{
230− Query: m.currentQuery,
231− }))
232− }
233210 }
234211 if key.Matches(msg, DeleteKeyMaps.AttachmentDeleteMode) {
235212 m.deleteMode = true
@@ -281,6 +258,36 @@ func (m *editorCmp) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
281258
282259 m.textarea, cmd = m.textarea.Update(msg)
283260 cmds = append(cmds, cmd)
261+
262+ if m.textarea.Focused() {
263+ kp, ok := msg.(tea.KeyPressMsg)
264+ if ok {
265+ if kp.String() == "space" || m.textarea.Value() == "" {
266+ m.isCompletionsOpen = false
267+ m.currentQuery = ""
268+ m.completionsStartIndex = 0
269+ cmds = append(cmds, util.CmdHandler(completions.CloseCompletionsMsg{}))
270+ } else {
271+ word := m.textarea.Word()
272+ if strings.HasPrefix(word, "/") {
273+ // XXX: wont' work if editing in the middle of the field.
274+ m.completionsStartIndex = strings.LastIndex(m.textarea.Value(), word)
275+ m.currentQuery = word[1:]
276+ m.isCompletionsOpen = true
277+ cmds = append(cmds, util.CmdHandler(completions.FilterCompletionsMsg{
278+ Query: m.currentQuery,
279+ Reopen: m.isCompletionsOpen,
280+ }))
281+ } else {
282+ m.isCompletionsOpen = false
283+ m.currentQuery = ""
284+ m.completionsStartIndex = 0
285+ cmds = append(cmds, util.CmdHandler(completions.CloseCompletionsMsg{}))
286+ }
287+ }
288+ }
289+ }
290+
284291 return m, tea.Batch(cmds...)
285292}
286293