diff --git a/lua/telescope/sorters.lua b/lua/telescope/sorters.lua index 1ac410f..a85a75b 100644 --- a/lua/telescope/sorters.lua +++ b/lua/telescope/sorters.lua @@ -429,4 +429,42 @@ sorters.get_levenshtein_sorter = function() } end +local substr_highlighter = function(_, prompt, display) + local highlights = {} + display = display:lower() + + local search_terms = util.max_split(prompt, "%s") + local hl_start, 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 +end + +sorters.get_substr_matcher = function() + return Sorter:new { + highlighter = substr_highlighter, + scoring_function = function(_, prompt, _, entry) + local display = entry.ordinal:lower() + + local search_terms = util.max_split(prompt, "%s") + local matched = 0 + local total_search_terms = 0 + for _, word in pairs(search_terms) do + total_search_terms = total_search_terms + 1 + if display:find(word, 1, true) then + matched = matched + 1 + end + end + + return matched == total_search_terms and entry.index or -1 + end + } +end + return sorters