From bcec7dd4b88f006cacb023a4c71b8bf39ea84f3c Mon Sep 17 00:00:00 2001 From: Senghan Bright Date: Thu, 14 Jan 2021 12:24:11 +0100 Subject: [PATCH] add sorter (not working yet) --- lua/telescope/_extensions/frecency.lua | 4 +-- lua/telescope/_extensions/frecency/sorter.lua | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 lua/telescope/_extensions/frecency/sorter.lua diff --git a/lua/telescope/_extensions/frecency.lua b/lua/telescope/_extensions/frecency.lua index 34e358e..99cedfd 100644 --- a/lua/telescope/_extensions/frecency.lua +++ b/lua/telescope/_extensions/frecency.lua @@ -18,7 +18,7 @@ local entry_display = require "telescope.pickers.entry_display" local finders = require "telescope.finders" local pickers = require "telescope.pickers" local previewers = require "telescope.previewers" -local sorters = require "telescope.sorters" +local sorters = require "telescope._extensions.frecency.sorter" local conf = require('telescope.config').values local path = require('telescope.path') local utils = require('telescope.utils') @@ -72,7 +72,7 @@ local frecency = function(opts) end, }, previewer = conf.file_previewer(opts), - sorter = sorters.get_generic_fuzzy_sorter(), -- TODO: do we have to have our own sorter? we only want filtering + sorter = sorters.get_frecency_sorter() }):find() end diff --git a/lua/telescope/_extensions/frecency/sorter.lua b/lua/telescope/_extensions/frecency/sorter.lua new file mode 100644 index 0000000..01732dc --- /dev/null +++ b/lua/telescope/_extensions/frecency/sorter.lua @@ -0,0 +1,29 @@ +local sorters = require "telescope.sorters" + +local my_sorters = {} + +my_sorters.get_frecency_sorter = function(opts) + opts = opts or {} + opts.ngram_len = 2 + + local fuzzy_sorter = sorters.get_generic_fuzzy_sorter(opts) + + local frecency = sorters:new() + frecency.scoring_function = function(_, prompt, _, entry) + local base_score = fuzzy_sorter:score(prompt, entry) + + if base_score == -1 then + return -1 + end + + if base_score == 0 then + return entry.index + else + return math.min(math.pow(entry.index, 0.25), 2) * base_score + end + end + + return frecency +end + +return my_sorters