diff --git a/lua/telescope/_extensions/frecency/sorter.lua b/lua/telescope/_extensions/frecency/sorter.lua index a0f8c4d..a4e798d 100644 --- a/lua/telescope/_extensions/frecency/sorter.lua +++ b/lua/telescope/_extensions/frecency/sorter.lua @@ -2,15 +2,26 @@ local sorters = require "telescope.sorters" local my_sorters = {} +local function split(s, delimiter) + local result = {} + for match in (s .. delimiter):gmatch("(.-)" .. delimiter) do + table.insert(result, match) + end + return result +end local substr_highlighter = function(_, prompt, display) local highlights = {} display = display:lower() + local search_terms = split(prompt, " ") local hl_start, hl_end - hl_start, hl_end = display:find(prompt, 1, true) - if hl_start then - table.insert(highlights, {start = hl_start, finish = hl_end}) + + for _, word in pairs(search_terms) do + hl_start, hl_end = display:find(word, 1, true) + if hl_start then + table.insert(highlights, {start = hl_start, finish = hl_end}) + end end return highlights @@ -22,19 +33,19 @@ my_sorters.get_substr_matcher = function(opts) local substr = sorters:new() substr.highlighter = substr_highlighter substr.scoring_function = function(_, prompt, _, entry) - -- local base_score = frecency:score(prompt, entry) local display = entry.name:lower() - local base_score - -- TODO: split the prompt into components - base_score = display:find(prompt, 1, true) and 1 or -1 - - if base_score == -1 then - return -1 + local search_terms = split(prompt, " ") + local matched + for _, word in pairs(search_terms) do + matched = display:find(word, 1, true) and 1 or -1 + if matched == -1 then goto continue end end - if base_score == 0 then - return entry.index + ::continue:: + + if matched == -1 then + return -1 else return entry.index end