diff --git a/CHANGES.md b/CHANGES.md index a556e72b..23a7f772 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -92,6 +92,10 @@ Add adwaitaTheme and adwaitaDarkTheme to match their respective GTK themes. + * `XMonad.Prompt.FuzzyMatch` + + Make fuzzy sort show shorter strings first. + ## 0.15 diff --git a/XMonad/Prompt/FuzzyMatch.hs b/XMonad/Prompt/FuzzyMatch.hs index 051e5175..263976c9 100644 --- a/XMonad/Prompt/FuzzyMatch.hs +++ b/XMonad/Prompt/FuzzyMatch.hs @@ -23,7 +23,7 @@ import Data.Function import Data.List -- $usage --- +-- -- This module offers two aspects of fuzzy matching of completions offered by -- XMonad.Prompt. -- @@ -57,7 +57,7 @@ import Data.List -- > myXPConfig = def { searchPredicate = fuzzyMatch -- > , sorter = fuzzySort -- > } --- +-- -- then add this to your keys definition: -- -- > , ((modm .|. shiftMask, xK_g), windowPrompt myXPConfig Goto allWindows) @@ -77,7 +77,7 @@ fuzzyMatch xxs@(x:xs) (y:ys) | toLower x == toLower y = fuzzyMatch xs ys -- measured first by the length of the substring containing the match and second -- by the positions of the matching characters in the string. fuzzySort :: String -> [String] -> [String] -fuzzySort q = map snd . sortBy (compare `on` fst) . map (rankMatch q) +fuzzySort q = map snd . sort . map (rankMatch q) rankMatch :: String -> String -> ((Int, Int), String) rankMatch q s = (minimum $ rankMatches q s, s) @@ -95,7 +95,7 @@ findOccurrences :: String -> Char -> [Int] findOccurrences s c = map snd $ filter ((toLower c ==) . toLower . fst) $ zip s [0..] extendMatches :: [(Int, Int)] -> [Int] -> [(Int, Int)] -extendMatches spans xs = map last $ groupBy ((==) `on` snd) $ extendMatches' spans xs +extendMatches spans = map last . groupBy ((==) `on` snd) . extendMatches' spans extendMatches' :: [(Int, Int)] -> [Int] -> [(Int, Int)] extendMatches' [] _ = []