Skip to content

Commit af114f9

Browse files
committed
Add codeSuggestionTriggerCharacters
1 parent f1df981 commit af114f9

File tree

4 files changed

+64
-1
lines changed

4 files changed

+64
-1
lines changed

Sources/CodeEditSourceEditor/Controller/TextViewController+TextFormation.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ extension TextViewController {
2424
setUpNewlineTabFilters(indentOption: configuration.behavior.indentOption)
2525
setUpDeletePairFilters(pairs: BracketPairs.allValues)
2626
setUpDeleteWhitespaceFilter(indentOption: configuration.behavior.indentOption)
27+
setUpSuggestionsFilter()
2728
}
2829

2930
/// Returns a `TextualIndenter` based on available language configuration.
@@ -120,4 +121,24 @@ extension TextViewController {
120121

121122
return true
122123
}
124+
125+
func setUpSuggestionsFilter() {
126+
textFilters.append(
127+
CodeSuggestionTriggerFilter(
128+
triggerCharacters: configuration.peripherals.codeSuggestionTriggerCharacters,
129+
didTrigger: { [weak self] in
130+
guard let self else { return }
131+
if let completionDelegate = self.completionDelegate,
132+
let position = self.cursorPositions.first {
133+
SuggestionController.shared.cursorsUpdated(
134+
textView: self,
135+
delegate: completionDelegate,
136+
position: position,
137+
presentIfNot: true
138+
)
139+
}
140+
}
141+
)
142+
)
143+
}
123144
}

Sources/CodeEditSourceEditor/Controller/TextViewController.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public class TextViewController: NSViewController {
8585
/// The provided highlight provider.
8686
public var highlightProviders: [HighlightProviding]
8787

88+
public weak var completionDelegate: CodeSuggestionDelegate?
89+
8890
// MARK: - Config Helpers
8991

9092
/// The font to use in the `textView`
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
//
2+
// CodeSuggestionTriggerFilter.swift
3+
// CodeEditSourceEditor
4+
//
5+
// Created by Khan Winter on 7/22/25.
6+
//
7+
8+
import Foundation
9+
import TextFormation
10+
import TextStory
11+
12+
struct CodeSuggestionTriggerFilter: Filter {
13+
let triggerCharacters: Set<String>
14+
let didTrigger: () -> Void
15+
16+
func processMutation(
17+
_ mutation: TextMutation,
18+
in interface: TextInterface,
19+
with providers: WhitespaceProviders
20+
) -> FilterAction {
21+
guard mutation.delta >= 0,
22+
let lastChar = mutation.string.last else {
23+
return .none
24+
}
25+
26+
if triggerCharacters.contains(String(lastChar)) || lastChar.isNumber || lastChar.isLetter {
27+
didTrigger()
28+
}
29+
30+
return .none
31+
}
32+
}

Sources/CodeEditSourceEditor/SourceEditorConfiguration/SourceEditorConfiguration+Peripherals.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,24 @@ extension SourceEditorConfiguration {
2828
/// non-standard quote character: `“ (0x201C)`.
2929
public var warningCharacters: Set<UInt16>
3030

31+
public var codeSuggestionTriggerCharacters: Set<String>
32+
3133
public init(
3234
showGutter: Bool = true,
3335
showMinimap: Bool = true,
3436
showReformattingGuide: Bool = false,
3537
showFoldingRibbon: Bool = true,
3638
invisibleCharactersConfiguration: InvisibleCharactersConfiguration = .empty,
37-
warningCharacters: Set<UInt16> = []
39+
warningCharacters: Set<UInt16> = [],
40+
codeSuggestionTriggerCharacters: Set<String> = []
3841
) {
3942
self.showGutter = showGutter
4043
self.showMinimap = showMinimap
4144
self.showReformattingGuide = showReformattingGuide
4245
self.showFoldingRibbon = showFoldingRibbon
4346
self.invisibleCharactersConfiguration = invisibleCharactersConfiguration
4447
self.warningCharacters = warningCharacters
48+
self.codeSuggestionTriggerCharacters = codeSuggestionTriggerCharacters
4549
}
4650

4751
@MainActor
@@ -79,6 +83,10 @@ extension SourceEditorConfiguration {
7983
controller.updateContentInsets()
8084
controller.updateTextInsets()
8185
}
86+
87+
if oldConfig?.codeSuggestionTriggerCharacters != codeSuggestionTriggerCharacters {
88+
controller.setUpTextFormation()
89+
}
8290
}
8391
}
8492
}

0 commit comments

Comments
 (0)