mirror of
https://github.com/Llewellynvdm/fzf.git
synced 2024-11-22 21:05:09 +00:00
Allow ^EqualMatch$
This commit is contained in:
parent
443a80f254
commit
0be4cead20
@ -1,6 +1,7 @@
|
|||||||
package algo
|
package algo
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
"github.com/junegunn/fzf/src/util"
|
"github.com/junegunn/fzf/src/util"
|
||||||
@ -159,3 +160,17 @@ func SuffixMatch(caseSensitive bool, input *[]rune, pattern []rune) (int, int) {
|
|||||||
}
|
}
|
||||||
return trimmedLen - len(pattern), trimmedLen
|
return trimmedLen - len(pattern), trimmedLen
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func EqualMatch(caseSensitive bool, runes *[]rune, pattern []rune) (int, int) {
|
||||||
|
if len(*runes) != len(pattern) {
|
||||||
|
return -1, -1
|
||||||
|
}
|
||||||
|
runesStr := string(*runes)
|
||||||
|
if !caseSensitive {
|
||||||
|
runesStr = strings.ToLower(runesStr)
|
||||||
|
}
|
||||||
|
if runesStr == string(pattern) {
|
||||||
|
return 0, len(pattern)
|
||||||
|
}
|
||||||
|
return -1, -1
|
||||||
|
}
|
||||||
|
@ -24,6 +24,7 @@ const (
|
|||||||
termExact
|
termExact
|
||||||
termPrefix
|
termPrefix
|
||||||
termSuffix
|
termSuffix
|
||||||
|
termEqual
|
||||||
)
|
)
|
||||||
|
|
||||||
type term struct {
|
type term struct {
|
||||||
@ -116,6 +117,7 @@ func BuildPattern(mode Mode, caseMode Case,
|
|||||||
procFun: make(map[termType]func(bool, *[]rune, []rune) (int, int))}
|
procFun: make(map[termType]func(bool, *[]rune, []rune) (int, int))}
|
||||||
|
|
||||||
ptr.procFun[termFuzzy] = algo.FuzzyMatch
|
ptr.procFun[termFuzzy] = algo.FuzzyMatch
|
||||||
|
ptr.procFun[termEqual] = algo.EqualMatch
|
||||||
ptr.procFun[termExact] = algo.ExactMatchNaive
|
ptr.procFun[termExact] = algo.ExactMatchNaive
|
||||||
ptr.procFun[termPrefix] = algo.PrefixMatch
|
ptr.procFun[termPrefix] = algo.PrefixMatch
|
||||||
ptr.procFun[termSuffix] = algo.SuffixMatch
|
ptr.procFun[termSuffix] = algo.SuffixMatch
|
||||||
@ -151,8 +153,13 @@ func parseTerms(mode Mode, caseMode Case, str string) []term {
|
|||||||
text = text[1:]
|
text = text[1:]
|
||||||
}
|
}
|
||||||
} else if strings.HasPrefix(text, "^") {
|
} else if strings.HasPrefix(text, "^") {
|
||||||
typ = termPrefix
|
if strings.HasSuffix(text, "$") {
|
||||||
text = text[1:]
|
typ = termEqual
|
||||||
|
text = text[1 : len(text)-1]
|
||||||
|
} else {
|
||||||
|
typ = termPrefix
|
||||||
|
text = text[1:]
|
||||||
|
}
|
||||||
} else if strings.HasSuffix(text, "$") {
|
} else if strings.HasSuffix(text, "$") {
|
||||||
typ = termSuffix
|
typ = termSuffix
|
||||||
text = text[:len(text)-1]
|
text = text[:len(text)-1]
|
||||||
|
@ -8,8 +8,8 @@ import (
|
|||||||
|
|
||||||
func TestParseTermsExtended(t *testing.T) {
|
func TestParseTermsExtended(t *testing.T) {
|
||||||
terms := parseTerms(ModeExtended, CaseSmart,
|
terms := parseTerms(ModeExtended, CaseSmart,
|
||||||
"aaa 'bbb ^ccc ddd$ !eee !'fff !^ggg !hhh$")
|
"aaa 'bbb ^ccc ddd$ !eee !'fff !^ggg !hhh$ ^iii$")
|
||||||
if len(terms) != 8 ||
|
if len(terms) != 9 ||
|
||||||
terms[0].typ != termFuzzy || terms[0].inv ||
|
terms[0].typ != termFuzzy || terms[0].inv ||
|
||||||
terms[1].typ != termExact || terms[1].inv ||
|
terms[1].typ != termExact || terms[1].inv ||
|
||||||
terms[2].typ != termPrefix || terms[2].inv ||
|
terms[2].typ != termPrefix || terms[2].inv ||
|
||||||
@ -17,7 +17,8 @@ func TestParseTermsExtended(t *testing.T) {
|
|||||||
terms[4].typ != termFuzzy || !terms[4].inv ||
|
terms[4].typ != termFuzzy || !terms[4].inv ||
|
||||||
terms[5].typ != termExact || !terms[5].inv ||
|
terms[5].typ != termExact || !terms[5].inv ||
|
||||||
terms[6].typ != termPrefix || !terms[6].inv ||
|
terms[6].typ != termPrefix || !terms[6].inv ||
|
||||||
terms[7].typ != termSuffix || !terms[7].inv {
|
terms[7].typ != termSuffix || !terms[7].inv ||
|
||||||
|
terms[8].typ != termEqual || terms[8].inv {
|
||||||
t.Errorf("%s", terms)
|
t.Errorf("%s", terms)
|
||||||
}
|
}
|
||||||
for idx, term := range terms {
|
for idx, term := range terms {
|
||||||
@ -65,6 +66,22 @@ func TestExact(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEqual(t *testing.T) {
|
||||||
|
defer clearPatternCache()
|
||||||
|
clearPatternCache()
|
||||||
|
pattern := BuildPattern(ModeExtended, CaseSmart, []Range{}, nil, []rune("^AbC$"))
|
||||||
|
|
||||||
|
match := func(str string, sidxExpected int, eidxExpected int) {
|
||||||
|
runes := []rune(str)
|
||||||
|
sidx, eidx := algo.EqualMatch(pattern.caseSensitive, &runes, pattern.terms[0].text)
|
||||||
|
if sidx != sidxExpected || eidx != eidxExpected {
|
||||||
|
t.Errorf("%s / %d / %d", pattern.terms, sidx, eidx)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match("ABC", -1, -1)
|
||||||
|
match("AbC", 0, 3)
|
||||||
|
}
|
||||||
|
|
||||||
func TestCaseSensitivity(t *testing.T) {
|
func TestCaseSensitivity(t *testing.T) {
|
||||||
defer clearPatternCache()
|
defer clearPatternCache()
|
||||||
clearPatternCache()
|
clearPatternCache()
|
||||||
|
Loading…
Reference in New Issue
Block a user