Skip to content

Commit e3eae85

Browse files
Allowing matchbraceleft for finding open and close bracket actions
1 parent d31f1f9 commit e3eae85

File tree

1 file changed

+37
-23
lines changed

1 file changed

+37
-23
lines changed

internal/buffer/buffer.go

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,33 @@ func (b *Buffer) isLocInStringOrComment(loc Loc, sortedIndices []int) bool {
11781178
return false
11791179
}
11801180

1181+
func (b *Buffer) resolveBraceStartLoc(start Loc) Loc {
1182+
var onbrace bool = false
1183+
// TODO: maybe can be more efficient with utf8 package
1184+
curLine := []rune(string(b.LineBytes(start.Y)))
1185+
// See if we are on any brace
1186+
if start.X >= 0 && start.X < len(curLine) {
1187+
startChar := curLine[start.X]
1188+
for _, bp := range BracePairs {
1189+
if startChar == bp[0] || startChar == bp[1] {
1190+
return start
1191+
}
1192+
}
1193+
}
1194+
1195+
if !onbrace && b.Settings["matchbraceleft"].(bool) {
1196+
if start.X-1 >= 0 && start.X-1 < len(curLine) {
1197+
startChar := curLine[start.X-1]
1198+
for _, bp := range BracePairs {
1199+
if startChar == bp[0] || startChar == bp[1] {
1200+
return Loc{start.X - 1, start.Y}
1201+
}
1202+
}
1203+
}
1204+
}
1205+
return start
1206+
}
1207+
11811208
func (b *Buffer) findOpeningBrace(braceType [2]rune, start Loc) (Loc, bool) {
11821209
// Bound guard
11831210
start = clamp(start, b.LineArray)
@@ -1220,7 +1247,7 @@ func (b *Buffer) findOpeningBrace(braceType [2]rune, start Loc) (Loc, bool) {
12201247
if !b.isLocInStringOrComment(Loc{x, y}, sortedGroups) {
12211248
i++
12221249
}
1223-
} else if r == braceType[0]{
1250+
} else if r == braceType[0] {
12241251
if !sortedGroupsPopulated {
12251252
sortedGroups = b.GetSortedSyntaxGroupIndices(y)
12261253
sortedGroupsPopulated = true
@@ -1242,6 +1269,7 @@ func (b *Buffer) findOpeningBrace(braceType [2]rune, start Loc) (Loc, bool) {
12421269
func (b *Buffer) FindOpeningBrace(start Loc) (Loc, bool) {
12431270
currentDist := -1
12441271
currentMb := Loc{-1, -1}
1272+
start = b.resolveBraceStartLoc(start)
12451273
for _, bp := range BracePairs {
12461274
mb, found := b.findOpeningBrace(bp, start)
12471275
if found {
@@ -1321,6 +1349,7 @@ func (b *Buffer) findClosingBrace(braceType [2]rune, start Loc) (Loc, bool) {
13211349
func (b *Buffer) FindClosingBrace(start Loc) (Loc, bool) {
13221350
currentDist := -1
13231351
currentMb := Loc{-1, -1}
1352+
start = b.resolveBraceStartLoc(start)
13241353
for _, bp := range BracePairs {
13251354
mb, found := b.findClosingBrace(bp, start)
13261355
if found {
@@ -1357,36 +1386,21 @@ func (b *Buffer) findMatchingBrace(braceType [2]rune, start Loc, char rune) (Loc
13571386
// for given starting location but it was found for the location one character left
13581387
// of it. The third returned value is true if the matching brace was found at all.
13591388
func (b *Buffer) FindMatchingBrace(start Loc) (Loc, bool, bool) {
1360-
// TODO: maybe can be more efficient with utf8 package
1389+
newstart := b.resolveBraceStartLoc(start)
1390+
var left bool = false
1391+
if start != newstart {
1392+
left = true
1393+
start = newstart
1394+
}
13611395
curLine := []rune(string(b.LineBytes(start.Y)))
13621396

1363-
// first try to find matching brace for the given location (it has higher priority)
13641397
if start.X >= 0 && start.X < len(curLine) {
13651398
startChar := curLine[start.X]
1366-
13671399
for _, bp := range BracePairs {
13681400
if startChar == bp[0] || startChar == bp[1] {
13691401
mb, found := b.findMatchingBrace(bp, start, startChar)
13701402
if found {
1371-
return mb, false, true
1372-
}
1373-
}
1374-
}
1375-
}
1376-
1377-
if b.Settings["matchbraceleft"].(bool) {
1378-
// failed to find matching brace for the given location, so try to find matching
1379-
// brace for the location one character left of it
1380-
if start.X-1 >= 0 && start.X-1 < len(curLine) {
1381-
leftChar := curLine[start.X-1]
1382-
left := Loc{start.X - 1, start.Y}
1383-
1384-
for _, bp := range BracePairs {
1385-
if leftChar == bp[0] || leftChar == bp[1] {
1386-
mb, found := b.findMatchingBrace(bp, left, leftChar)
1387-
if found {
1388-
return mb, true, true
1389-
}
1403+
return mb, left, true
13901404
}
13911405
}
13921406
}

0 commit comments

Comments
 (0)