@@ -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+
11811208func (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) {
12421269func (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) {
13211349func (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.
13591388func (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