diff --cc m/search.go index 5b67346,e5b580f..0000000 --- m/search.go +++ m/search.go @@@ -10,45 -6,9 +10,79 @@@ import "github.com/walles/moar/m/linenumbers" ) ++<<<<<<< HEAD +func (p *Pager) scrollToSearchHits() { + if p.searchPattern == nil { + // This is not a search + return + } + + lineNumber := p.scrollPosition.lineNumber(p) + if lineNumber == nil { + // No lines to search + return + } + + firstHitPosition := p.findFirstHit(*lineNumber, nil, false) + if firstHitPosition == nil && (*lineNumber != linenumbers.LineNumber{}) { + // Try again from the top + firstHitPosition = p.findFirstHit(linenumbers.LineNumber{}, lineNumber, false) + } + if firstHitPosition == nil { + // No match, give up + return + } + + if firstHitPosition.isVisible(p) { + // Already on-screen, never mind + return + } + + p.scrollPosition = *firstHitPosition +} + +// NOTE: When we search, we do that by looping over the *input lines*, not the +// screen lines. That's why startPosition is a LineNumber rather than a +// scrollPosition. +// +// The `beforePosition` parameter is exclusive, meaning that line will not be +// searched. +// +// For the actual searching, this method will call _findFirstHit() in parallel +// on multiple cores, to help large file search performance. ++||||||| parent of b835e9a (Fix the warnings) ++func (p *Pager) scrollToSearchHits() { ++ if p.searchPattern == nil { ++ // This is not a search ++ return ++ } ++ ++ firstHitPosition := p.findFirstHit(*p.scrollPosition.lineNumber(p), nil, false) ++ if firstHitPosition == nil { ++ // Try again from the top ++ firstHitPosition = p.findFirstHit(linenumbers.LineNumber{}, p.scrollPosition.lineNumber(p), false) ++ } ++ if firstHitPosition == nil { ++ // No match, give up ++ return ++ } ++ ++ if firstHitPosition.isVisible(p) { ++ // Already on-screen, never mind ++ return ++ } ++ ++ p.scrollPosition = *firstHitPosition ++} ++ + // NOTE: When we search, we do that by looping over the *input lines*, not + // the screen lines. That's why we're using a line number rather than a + // scrollPosition for searching. ++======= ++// NOTE: When we search, we do that by looping over the *input lines*, not ++// the screen lines. That's why we're using a line number rather than a ++// scrollPosition for searching. ++>>>>>>> b835e9a (Fix the warnings) // // FIXME: We should take startPosition.deltaScreenLines into account as well! func (p *Pager) findFirstHit(startPosition linenumbers.LineNumber, beforePosition *linenumbers.LineNumber, backwards bool) *scrollPosition {