r := h.Cursor.RuneUnder(h.Cursor.X)
rl := h.Cursor.RuneUnder(h.Cursor.X - 1)
if r == bp[0] || r == bp[1] || rl == bp[0] || rl == bp[1] {
- matchingBrace, left := h.Buf.FindMatchingBrace(bp, h.Cursor.Loc)
- if left {
- h.Cursor.GotoLoc(matchingBrace)
+ matchingBrace, left, found := h.Buf.FindMatchingBrace(bp, h.Cursor.Loc)
+ if found {
+ if left {
+ h.Cursor.GotoLoc(matchingBrace)
+ } else {
+ h.Cursor.GotoLoc(matchingBrace.Move(1, h.Buf))
+ }
} else {
- h.Cursor.GotoLoc(matchingBrace.Move(1, h.Buf))
+ return false
}
}
}
// returns the location of the matching brace
// if the boolean returned is true then the original matching brace is one character left
// of the starting location
-func (b *Buffer) FindMatchingBrace(braceType [2]rune, start Loc) (Loc, bool) {
+func (b *Buffer) FindMatchingBrace(braceType [2]rune, start Loc) (Loc, bool, bool) {
curLine := []rune(string(b.LineBytes(start.Y)))
startChar := ' '
if start.X >= 0 && start.X < len(curLine) {
i--
if i == 0 {
if startChar == braceType[0] {
- return Loc{x, y}, false
+ return Loc{x, y}, false, true
}
- return Loc{x, y}, true
+ return Loc{x, y}, true, true
}
}
}
i--
if i == 0 {
if leftChar == braceType[1] {
- return Loc{x, y}, true
+ return Loc{x, y}, true, true
}
- return Loc{x, y}, false
+ return Loc{x, y}, false, true
}
} else if r == braceType[1] {
i++
}
}
}
- return start, true
+ return start, true, false
}
// Retab changes all tabs to spaces or vice versa
r := c.RuneUnder(curX)
rl := c.RuneUnder(curX - 1)
if r == bp[0] || r == bp[1] || rl == bp[0] || rl == bp[1] {
- mb, left := b.FindMatchingBrace(bp, curLoc)
- matchingBraces = append(matchingBraces, mb)
- if !left {
- matchingBraces = append(matchingBraces, curLoc)
- } else {
- matchingBraces = append(matchingBraces, curLoc.Move(-1, b))
+ mb, left, found := b.FindMatchingBrace(bp, curLoc)
+ if found {
+ matchingBraces = append(matchingBraces, mb)
+ if !left {
+ matchingBraces = append(matchingBraces, curLoc)
+ } else {
+ matchingBraces = append(matchingBraces, curLoc.Move(-1, b))
+ }
}
}
}