summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2018-12-19 23:05:29 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2018-12-19 23:05:29 +0900
commit5624a892311e96ffe019786c5507929d9427ad0f (patch)
tree89441a7b04f50989937935bb01071c80ee6de4ff /src
parent63c42b14f24c7b82515cf13d6372dd302f5d11a5 (diff)
downloadfzf-5624a892311e96ffe019786c5507929d9427ad0f.tar.gz
Inverse-only matches should not reorder the remaining results
Fix #1458
Diffstat (limited to 'src')
-rw-r--r--src/core.go1
-rw-r--r--src/matcher.go2
-rw-r--r--src/pattern.go13
3 files changed, 14 insertions, 2 deletions
diff --git a/src/core.go b/src/core.go
index 023f7be7..1653e6fd 100644
--- a/src/core.go
+++ b/src/core.go
@@ -149,6 +149,7 @@ func Run(opts *Options, revision string) {
}
pattern := patternBuilder([]rune(*opts.Filter))
+ matcher.sort = pattern.sortable
found := false
if streamingFilter {
diff --git a/src/matcher.go b/src/matcher.go
index c29f2b6d..3c5dec09 100644
--- a/src/matcher.go
+++ b/src/matcher.go
@@ -230,5 +230,5 @@ func (m *Matcher) Reset(chunks []*Chunk, patternRunes []rune, cancel bool, final
} else {
event = reqRetry
}
- m.reqBox.Set(event, MatchRequest{chunks, pattern, final, sort})
+ m.reqBox.Set(event, MatchRequest{chunks, pattern, final, sort && pattern.sortable})
}
diff --git a/src/pattern.go b/src/pattern.go
index 2627dea6..4880d6e9 100644
--- a/src/pattern.go
+++ b/src/pattern.go
@@ -52,6 +52,7 @@ type Pattern struct {
forward bool
text []rune
termSets []termSet
+ sortable bool
cacheable bool
cacheKey string
delimiter Delimiter
@@ -101,18 +102,27 @@ func BuildPattern(fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case,
}
caseSensitive := true
+ sortable := true
termSets := []termSet{}
if extended {
termSets = parseTerms(fuzzy, caseMode, normalize, asString)
+ // We should not sort the result if there are only inverse search terms
+ sortable = false
Loop:
for _, termSet := range termSets {
for idx, term := range termSet {
+ if !term.inv {
+ sortable = true
+ }
// If the query contains inverse search terms or OR operators,
// we cannot cache the search scope
if !cacheable || idx > 0 || term.inv || fuzzy && term.typ != termFuzzy || !fuzzy && term.typ != termExact {
cacheable = false
- break Loop
+ if sortable {
+ // Can't break until we see at least one non-inverse term
+ break Loop
+ }
}
}
}
@@ -134,6 +144,7 @@ func BuildPattern(fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case,
forward: forward,
text: []rune(asString),
termSets: termSets,
+ sortable: sortable,
cacheable: cacheable,
nth: nth,
delimiter: delimiter,