Skip to content

Commit 28fe801

Browse files
committed
Add auto complete for chat plugins and scopes
1 parent 96a6a0a commit 28fe801

2 files changed

Lines changed: 43 additions & 4 deletions

File tree

Core/Sources/SuggestionWidget/CustomTextEditor.swift

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,25 @@ struct CustomTextEditor: NSViewRepresentable {
88
@Binding var text: String
99
let font: NSFont
1010
let onSubmit: () -> Void
11+
var completions: (_ text: String, _ words: [String], _ range: NSRange)
12+
-> [String] = { _, _, _ in
13+
[]
14+
}
1115

1216
func makeNSView(context: Context) -> NSScrollView {
17+
context.coordinator.completions = completions
1318
let textView = (context.coordinator.theTextView.documentView as! NSTextView)
1419
textView.delegate = context.coordinator
1520
textView.string = text
1621
textView.font = font
1722
textView.allowsUndo = true
1823
textView.drawsBackground = false
19-
24+
2025
return context.coordinator.theTextView
2126
}
2227

2328
func updateNSView(_ nsView: NSScrollView, context: Context) {
29+
context.coordinator.completions = completions
2430
let textView = (context.coordinator.theTextView.documentView as! NSTextView)
2531
guard textView.string != text else { return }
2632
textView.string = text
@@ -32,6 +38,7 @@ extension CustomTextEditor {
3238
var view: CustomTextEditor
3339
var theTextView = NSTextView.scrollableTextView()
3440
var affectedCharRange: NSRange?
41+
var completions: (String, [String], _ range: NSRange) -> [String] = { _, _, _ in [] }
3542

3643
init(_ view: CustomTextEditor) {
3744
self.view = view
@@ -43,13 +50,14 @@ extension CustomTextEditor {
4350
}
4451

4552
view.text = textView.string
53+
textView.complete(nil)
4654
}
4755

4856
func textView(_ textView: NSTextView, doCommandBy commandSelector: Selector) -> Bool {
4957
if commandSelector == #selector(NSTextView.insertNewline(_:)) {
5058
if let event = NSApplication.shared.currentEvent,
5159
!event.modifierFlags.contains(.shift),
52-
event.keyCode == 36
60+
event.keyCode == 36 // enter
5361
{
5462
view.onSubmit()
5563
return true
@@ -66,6 +74,16 @@ extension CustomTextEditor {
6674
) -> Bool {
6775
return true
6876
}
77+
78+
func textView(
79+
_ textView: NSTextView,
80+
completions words: [String],
81+
forPartialWordRange charRange: NSRange,
82+
indexOfSelectedItem index: UnsafeMutablePointer<Int>?
83+
) -> [String] {
84+
index?.pointee = -1
85+
return completions(textView.textStorage?.string ?? "", words, charRange)
86+
}
6987
}
7088
}
7189

Core/Sources/SuggestionWidget/SuggestionPanelContent/ChatPanel.swift

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ struct ChatPanelMessages: View {
8888
}
8989
}
9090
.listItemTint(.clear)
91-
91+
9292
Instruction()
9393

9494
Spacer()
@@ -350,7 +350,28 @@ struct ChatPanelInputArea: View {
350350
CustomTextEditor(
351351
text: $typedMessage,
352352
font: .systemFont(ofSize: 14),
353-
onSubmit: { submitText() }
353+
onSubmit: { submitText() },
354+
completions: { text, _, range in
355+
if text.isEmpty { return [] }
356+
let availableFeatures = [
357+
"/run",
358+
"/airun",
359+
"/math",
360+
"/search",
361+
"@selection",
362+
"@file",
363+
]
364+
return availableFeatures
365+
.filter { $0.hasPrefix(text) && $0 != text }
366+
.compactMap {
367+
guard let index = $0.index(
368+
$0.startIndex,
369+
offsetBy: range.location,
370+
limitedBy: $0.endIndex
371+
) else { return nil }
372+
return String($0[index...])
373+
}
374+
}
354375
)
355376
.padding(.top, 1)
356377
.padding(.bottom, -1)

0 commit comments

Comments
 (0)