]> git.lizzy.rs Git - micro.git/blobdiff - cmd/micro/search.go
Merge pull request #1201 from Calinou/use-more-ini-highlighting
[micro.git] / cmd / micro / search.go
index 8317fd0a9109a62672a676ea608458ecf6f4e339..7139f844888021615102f6bae94ac0180fa8bff1 100644 (file)
@@ -64,7 +64,12 @@ func HandleSearchEvent(event tcell.Event, v *View) {
                        // Exit the search mode
                        ExitSearch(v)
                        return
-               case tcell.KeyCtrlQ, tcell.KeyCtrlC, tcell.KeyEnter:
+               case tcell.KeyEnter:
+                       // If the user has pressed Enter, they want this to be the lastSearch
+                       lastSearch = messenger.response
+                       EndSearch()
+                       return
+               case tcell.KeyCtrlQ, tcell.KeyCtrlC:
                        // Done
                        EndSearch()
                        return
@@ -93,11 +98,23 @@ func HandleSearchEvent(event tcell.Event, v *View) {
 }
 
 func searchDown(r *regexp.Regexp, v *View, start, end Loc) bool {
+       if start.Y >= v.Buf.NumLines {
+               start.Y = v.Buf.NumLines - 1
+       }
+       if start.Y < 0 {
+               start.Y = 0
+       }
        for i := start.Y; i <= end.Y; i++ {
                var l []byte
                var charPos int
                if i == start.Y {
                        runes := []rune(string(v.Buf.lines[i].data))
+                       if start.X >= len(runes) {
+                               start.X = len(runes) - 1
+                       }
+                       if start.X < 0 {
+                               start.X = 0
+                       }
                        l = []byte(string(runes[start.X:]))
                        charPos = start.X
 
@@ -124,10 +141,22 @@ func searchDown(r *regexp.Regexp, v *View, start, end Loc) bool {
 }
 
 func searchUp(r *regexp.Regexp, v *View, start, end Loc) bool {
+       if start.Y >= v.Buf.NumLines {
+               start.Y = v.Buf.NumLines - 1
+       }
+       if start.Y < 0 {
+               start.Y = 0
+       }
        for i := start.Y; i >= end.Y; i-- {
                var l []byte
                if i == start.Y {
                        runes := []rune(string(v.Buf.lines[i].data))
+                       if start.X >= len(runes) {
+                               start.X = len(runes) - 1
+                       }
+                       if start.X < 0 {
+                               start.X = 0
+                       }
                        l = []byte(string(runes[:start.X]))
 
                        if strings.Contains(r.String(), "$") && start.X != Count(string(l)) {
@@ -179,9 +208,7 @@ func Search(searchStr string, v *View, down bool) {
                        found = searchUp(r, v, v.Buf.End(), searchStart)
                }
        }
-       if found {
-               lastSearch = searchStr
-       } else {
+       if !found {
                v.Cursor.ResetSelection()
        }
 }