Skip to content

Commit 4bb8488

Browse files
committed
Add completeBrackets flag to Behavior configuration
Add a completeBrackets property to SourceEditorConfiguration.Behavior that controls whether bracket pair completion filters are registered. When false, open-pair and delete-pair filters are skipped in setUpTextFormation(), allowing consumers to disable automatic bracket completion via configuration. Fixes CodeEditApp/CodeEdit#1691
1 parent 1fa4d3c commit 4bb8488

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

Sources/CodeEditSourceEditor/Controller/TextViewController+TextFormation.swift

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@ extension TextViewController {
1818
textFilters = []
1919

2020
// Filters
21-
22-
setUpOpenPairFilters(pairs: BracketPairs.allValues)
21+
if configuration.behavior.completeBrackets {
22+
setUpOpenPairFilters(pairs: BracketPairs.allValues)
23+
}
2324
setUpTagFilter()
2425
setUpNewlineTabFilters(indentOption: configuration.behavior.indentOption)
25-
setUpDeletePairFilters(pairs: BracketPairs.allValues)
26+
if configuration.behavior.completeBrackets {
27+
setUpDeletePairFilters(pairs: BracketPairs.allValues)
28+
}
2629
setUpDeleteWhitespaceFilter(indentOption: configuration.behavior.indentOption)
2730
}
2831

Sources/CodeEditSourceEditor/SourceEditorConfiguration/SourceEditorConfiguration+Behavior.swift

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,23 @@ extension SourceEditorConfiguration {
1919

2020
/// The column to reformat at.
2121
public var reformatAtColumn: Int = 80
22+
23+
/// Controls whether bracket pairs are automatically completed when typing an opening bracket.
24+
/// When `true`, typing `{` will automatically insert `}`. Defaults to `true`.
25+
public var completeBrackets: Bool = true
2226

2327
public init(
2428
isEditable: Bool = true,
2529
isSelectable: Bool = true,
2630
indentOption: IndentOption = .spaces(count: 4),
27-
reformatAtColumn: Int = 80
31+
reformatAtColumn: Int = 80,
32+
completeBrackets: Bool = true
2833
) {
2934
self.isEditable = isEditable
3035
self.isSelectable = isSelectable
3136
self.indentOption = indentOption
3237
self.reformatAtColumn = reformatAtColumn
38+
self.completeBrackets = completeBrackets
3339
}
3440

3541
@MainActor
@@ -57,6 +63,10 @@ extension SourceEditorConfiguration {
5763
controller.reformattingGuideView.updatePosition(in: controller)
5864
controller.view.updateConstraintsForSubtreeIfNeeded()
5965
}
66+
67+
if oldConfig?.completeBrackets != completeBrackets {
68+
controller.setUpTextFormation()
69+
}
6070
}
6171
}
6272
}

Tests/CodeEditSourceEditorTests/Controller/TextViewControllerTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import XCTest
33
import SwiftTreeSitter
44
import AppKit
55
import SwiftUI
6+
import TextFormation
67
import TextStory
78

89
// swiftlint:disable:next type_body_length
@@ -216,6 +217,26 @@ final class TextViewControllerTests: XCTestCase {
216217
XCTAssertEqual(controller.textView.string, String(repeating: " ", count: 1000))
217218
}
218219

220+
// MARK: Bracket Completion
221+
222+
func test_completeBracketsEnabled() {
223+
controller.configuration.behavior.completeBrackets = true
224+
225+
let hasPairFilter = controller.textFilters.contains(where: { $0 is StandardOpenPairFilter })
226+
let hasDeleteFilter = controller.textFilters.contains(where: { $0 is DeleteCloseFilter })
227+
XCTAssertTrue(hasPairFilter, "Should have open pair filters when completeBrackets is enabled")
228+
XCTAssertTrue(hasDeleteFilter, "Should have delete pair filters when completeBrackets is enabled")
229+
}
230+
231+
func test_completeBracketsDisabled() {
232+
controller.configuration.behavior.completeBrackets = false
233+
234+
let hasPairFilter = controller.textFilters.contains(where: { $0 is StandardOpenPairFilter })
235+
let hasDeleteFilter = controller.textFilters.contains(where: { $0 is DeleteCloseFilter })
236+
XCTAssertFalse(hasPairFilter, "Should not have open pair filters when completeBrackets is disabled")
237+
XCTAssertFalse(hasDeleteFilter, "Should not have delete pair filters when completeBrackets is disabled")
238+
}
239+
219240
func test_letterSpacing() throws {
220241
let font: NSFont = .monospacedSystemFont(ofSize: 11, weight: .medium)
221242

0 commit comments

Comments
 (0)