diff --git a/CHANGES.md b/CHANGES.md index 63dc963321..d698555f57 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -38,6 +38,12 @@ * `XMonad.Actions.MessageHandling` Refresh-performing functions updated to better reflect the new `sendMessage`. + * `XMonad.Prompt` + + Added `sorter` to `XPConfig` used to sort the possible completions by how + well they match the search string (example: `XMonad.Prompt.FuzzyMatch`). + + ## 0.14 ### Breaking Changes diff --git a/XMonad/Prompt.hs b/XMonad/Prompt.hs index 81dec181fd..7ffa8128c7 100644 --- a/XMonad/Prompt.hs +++ b/XMonad/Prompt.hs @@ -156,6 +156,10 @@ data XPConfig = , searchPredicate :: String -> String -> Bool -- ^ Given the typed string and a possible -- completion, is the completion valid? + , sorter :: String -> [String] -> [String] + -- ^ Used to sort the possible completions by how well they + -- match the search string (see X.P.FuzzyMatch for an + -- example). } data XPType = forall p . XPrompt p => XPT p @@ -268,6 +272,7 @@ instance Default XPConfig where , showCompletionOnTab = False , searchPredicate = isPrefixOf , alwaysHighlight = False + , sorter = const id } {-# DEPRECATED defaultXPConfig "Use def (from Data.Default, and re-exported from XMonad.Prompt) instead." #-} defaultXPConfig = def @@ -956,8 +961,10 @@ getCompletionFunction st = case operationMode st of getCompletions :: XP [String] getCompletions = do s <- get - io $ getCompletionFunction s (commandToComplete (currentXPMode s) (command s)) - `E.catch` \(SomeException _) -> return [] + let q = commandToComplete (currentXPMode s) (command s) + compl = getCompletionFunction s + srt = sorter (config s) + io $ (srt q <$> compl q) `E.catch` \(SomeException _) -> return [] setComplWin :: Window -> ComplWindowDim -> XP () setComplWin w wi = diff --git a/XMonad/Prompt/FuzzyMatch.hs b/XMonad/Prompt/FuzzyMatch.hs index 24e306ae2e..a5d37d4ad3 100644 --- a/XMonad/Prompt/FuzzyMatch.hs +++ b/XMonad/Prompt/FuzzyMatch.hs @@ -48,19 +48,19 @@ import Data.List -- 11. "FastSPR" is ranked before "FasterSPR" because its match starts at -- position 5 while the match in "FasterSPR" starts at position 7. -- --- To use these functions in an XPrompt, for example, for windowPromptGoto: +-- To use these functions in an XPrompt, for example, for windowPrompt: -- -- > import XMonad.Prompt --- > import XMonad.Prompt.Window ( windowPromptGoto ) +-- > import XMonad.Prompt.Window ( windowPrompt ) -- > import XMonad.Prompt.FuzzyMatch -- > -- > myXPConfig = def { searchPredicate = fuzzyMatch --- , sorter = fuzzySort --- } +-- > , sorter = fuzzySort +-- > } -- -- then add this to your keys definition: -- --- > , ((modm .|. shiftMask, xK_g), windowPromptGoto myXPConfig) +-- > , ((modm .|. shiftMask, xK_g), windowPrompt myXPConfig Goto allWindows) -- -- For detailed instructions on editing the key bindings, see -- "Xmonad.Doc.Extending#Editing_key_bindings".