Skip to content

Commit 78950b7

Browse files
Merge branch 'JumpToBraces' into dev
2 parents 80cd664 + bdc57b4 commit 78950b7

File tree

8 files changed

+126
-16
lines changed

8 files changed

+126
-16
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
> - [Add wrapindent option to allow wrapping and hanging indents #3107](https://github.com/zyedidia/micro/pull/3107)
1010
> - [add next/prev split/tab support for terminal pane #3165](https://github.com/zyedidia/micro/pull/3165)
1111
> - [Escape braces that are in string or comments when finding matching brace #3372](https://github.com/zyedidia/micro/pull/3372)
12-
> - [ Adding selection for ParagraphPrevious and ParagraphNext. #3353](https://github.com/zyedidia/micro/pull/3353)
1312
>
1413
> To see the diff between this and upstream master, click [here](https://github.com/zyedidia/micro/compare/master...Neko-Box-Coder:micro-dev:dev)
1514

internal/action/actions.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1478,6 +1478,28 @@ func (h *BufPane) JumpToMatchingBrace() bool {
14781478
return false
14791479
}
14801480

1481+
// JumpToOpeningBrace moves the cursor to the opening brace in current brace scope
1482+
func (h *BufPane) JumpToOpeningBrace() bool {
1483+
matchingBrace, found := h.Buf.FindOpeningBrace(h.Cursor.Loc)
1484+
if found {
1485+
h.Cursor.GotoLoc(matchingBrace)
1486+
h.Relocate()
1487+
return true
1488+
}
1489+
return false
1490+
}
1491+
1492+
// JumpToClosingBrace moves the cursor to the closing brace in current brace scope
1493+
func (h *BufPane) JumpToClosingBrace() bool {
1494+
matchingBrace, found := h.Buf.FindClosingBrace(h.Cursor.Loc)
1495+
if found {
1496+
h.Cursor.GotoLoc(matchingBrace)
1497+
h.Relocate()
1498+
return true
1499+
}
1500+
return false
1501+
}
1502+
14811503
// SelectAll selects the entire buffer
14821504
func (h *BufPane) SelectAll() bool {
14831505
h.Cursor.SetSelectionStart(h.Buf.Start())

internal/action/bufpane.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,8 @@ var BufKeyActions = map[string]BufKeyAction{
842842
"RemoveAllMultiCursors": (*BufPane).RemoveAllMultiCursors,
843843
"SkipMultiCursor": (*BufPane).SkipMultiCursor,
844844
"JumpToMatchingBrace": (*BufPane).JumpToMatchingBrace,
845+
"JumpToOpeningBrace": (*BufPane).JumpToOpeningBrace,
846+
"JumpToClosingBrace": (*BufPane).JumpToClosingBrace,
845847
"JumpLine": (*BufPane).JumpLine,
846848
"Deselect": (*BufPane).Deselect,
847849
"ClearInfo": (*BufPane).ClearInfo,
@@ -924,4 +926,6 @@ var MultiActions = map[string]bool{
924926
"StartOfTextToggle": true,
925927
"EndOfLine": true,
926928
"JumpToMatchingBrace": true,
929+
"JumpToOpeningBrace": true,
930+
"JumpToClosingBrace": true,
927931
}

internal/action/defaults_darwin.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ var bufdefaults = map[string]string{
7676
"Ctrl-u": "ToggleMacro",
7777
"Ctrl-j": "PlayMacro",
7878
"Insert": "ToggleOverwriteMode",
79+
"Alt-<": "JumpToOpeningBrace",
80+
"Alt->": "JumpToClosingBrace",
7981

8082
// Emacs-style keybindings
8183
"Alt-f": "WordRight",

internal/action/defaults_other.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ var bufdefaults = map[string]string{
7979
"Ctrl-u": "ToggleMacro",
8080
"Ctrl-j": "PlayMacro",
8181
"Insert": "ToggleOverwriteMode",
82+
"Alt-<": "JumpToOpeningBrace",
83+
"Alt->": "JumpToClosingBrace",
8284

8385
// Emacs-style keybindings
8486
"Alt-f": "WordRight",

internal/buffer/buffer.go

Lines changed: 90 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1177,18 +1177,34 @@ func (b *Buffer) isLocInStringOrComment(loc Loc, sortedIndices []int) bool {
11771177
return false
11781178
}
11791179

1180-
func (b *Buffer) FindOpeningBrace(braceType [2]rune, start Loc) (Loc, bool) {
1181-
startChar := []rune(string(b.LineBytes(start.Y)))[start.X]
1182-
var i int
1183-
if startChar == braceType[1] {
1184-
i = 0
1185-
} else {
1186-
i = 1
1180+
func (b *Buffer) findOpeningBrace(braceType [2]rune, start Loc) (Loc, bool) {
1181+
// Bound guard
1182+
start = clamp(start, b.LineArray)
1183+
if len(b.lines) == 0 {
1184+
return start, false
1185+
}
1186+
lineLen := len([]rune(string(b.LineBytes(start.Y))))
1187+
if start.X >= lineLen {
1188+
start.X = lineLen - 1
1189+
}
1190+
if start.X < 0 {
1191+
start.X = 0
1192+
}
1193+
1194+
var i int = 1
1195+
if lineLen > 0 {
1196+
startChar := []rune(string(b.LineBytes(start.Y)))[start.X]
1197+
if startChar == braceType[1] {
1198+
i = 0
1199+
}
11871200
}
11881201
for y := start.Y; y >= 0; y-- {
11891202
var sortedGroups []int
11901203
sortedGroupsPopulated := false
11911204
l := []rune(string(b.lines[y].data))
1205+
if len(l) == 0 {
1206+
continue
1207+
}
11921208
xInit := len(l) - 1
11931209
if y == start.Y {
11941210
xInit = start.X
@@ -1220,13 +1236,49 @@ func (b *Buffer) FindOpeningBrace(braceType [2]rune, start Loc) (Loc, bool) {
12201236
return start, false
12211237
}
12221238

1223-
func (b *Buffer) FindClosingBrace(braceType [2]rune, start Loc) (Loc, bool) {
1224-
startChar := []rune(string(b.LineBytes(start.Y)))[start.X]
1225-
var i int
1226-
if startChar == braceType[0] {
1227-
i = 0
1239+
// Returns the opening brace in current brace scope starting at the start location and a boolean
1240+
// indicating if an opening brace is found
1241+
func (b *Buffer) FindOpeningBrace(start Loc) (Loc, bool) {
1242+
currentDist := -1
1243+
currentMb := Loc{-1, -1}
1244+
for _, bp := range BracePairs {
1245+
mb, found := b.findOpeningBrace(bp, start)
1246+
if found {
1247+
dist := DiffLA(start, mb, b.LineArray)
1248+
if currentDist < 0 || dist < currentDist {
1249+
currentMb = mb
1250+
currentDist = dist
1251+
}
1252+
}
1253+
}
1254+
1255+
if currentDist == -1 {
1256+
return start, false
12281257
} else {
1229-
i = 1
1258+
return currentMb, true
1259+
}
1260+
}
1261+
1262+
func (b *Buffer) findClosingBrace(braceType [2]rune, start Loc) (Loc, bool) {
1263+
// Bound guard
1264+
start = clamp(start, b.LineArray)
1265+
if len(b.lines) == 0 {
1266+
return start, false
1267+
}
1268+
lineLen := len([]rune(string(b.LineBytes(start.Y))))
1269+
if start.X >= lineLen {
1270+
start.X = lineLen - 1
1271+
}
1272+
if start.X < 0 {
1273+
start.X = 0
1274+
}
1275+
1276+
var i int = 1
1277+
if lineLen > 0 {
1278+
startChar := []rune(string(b.LineBytes(start.Y)))[start.X]
1279+
if startChar == braceType[0] {
1280+
i = 0
1281+
}
12301282
}
12311283
for y := start.Y; y < b.LinesNum(); y++ {
12321284
var sortedGroups []int
@@ -1263,14 +1315,37 @@ func (b *Buffer) FindClosingBrace(braceType [2]rune, start Loc) (Loc, bool) {
12631315
return start, false
12641316
}
12651317

1318+
// Returns the closing brace in current brace scope starting at the start location and a boolean
1319+
// indicating if an closing brace is found
1320+
func (b *Buffer) FindClosingBrace(start Loc) (Loc, bool) {
1321+
currentDist := -1
1322+
currentMb := Loc{-1, -1}
1323+
for _, bp := range BracePairs {
1324+
mb, found := b.findClosingBrace(bp, start)
1325+
if found {
1326+
dist := DiffLA(start, mb, b.LineArray)
1327+
if currentDist < 0 || dist < currentDist {
1328+
currentMb = mb
1329+
currentDist = dist
1330+
}
1331+
}
1332+
}
1333+
1334+
if currentDist == -1 {
1335+
return start, false
1336+
} else {
1337+
return currentMb, true
1338+
}
1339+
}
1340+
12661341
func (b *Buffer) findMatchingBrace(braceType [2]rune, start Loc, char rune) (Loc, bool) {
12671342
if b.isLocInStringOrComment(start, nil) {
12681343
return start, false
12691344
}
12701345
if char == braceType[0] {
1271-
return b.FindClosingBrace(braceType, start)
1346+
return b.findClosingBrace(braceType, start)
12721347
} else if char == braceType[1] {
1273-
return b.FindOpeningBrace(braceType, start)
1348+
return b.findOpeningBrace(braceType, start)
12741349
}
12751350
return start, false
12761351
}

runtime/help/defaultkeys.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ can change it!
3333
| PageDown | Move cursor down one page |
3434
| Ctrl-Home or Ctrl-UpArrow | Move cursor to start of document |
3535
| Ctrl-End or Ctrl-DownArrow | Move cursor to end of document |
36+
| Alt-< | Move cursor to opening brace in current brace scope |
37+
| Alt-> | Move cursor to closing brace in current brace scope |
3638
| Ctrl-l | Jump to a line in the file (prompts with #) |
3739
| Ctrl-w | Cycle between splits in the current tab (use `> vsplit` or `> hsplit` to create a split) |
3840

runtime/help/keybindings.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,8 @@ RemoveAllMultiCursors
272272
SkipMultiCursor
273273
None
274274
JumpToMatchingBrace
275+
JumpToOpeningBrace
276+
JumpToClosingBrace
275277
Autocomplete
276278
```
277279

@@ -526,6 +528,8 @@ conventions for text editing defaults.
526528
"Ctrl-u": "ToggleMacro",
527529
"Ctrl-j": "PlayMacro",
528530
"Insert": "ToggleOverwriteMode",
531+
"Alt-<": "JumpToOpeningBrace",
532+
"Alt->": "JumpToClosingBrace",
529533

530534
// Emacs-style keybindings
531535
"Alt-f": "WordRight",

0 commit comments

Comments
 (0)