diff options
Diffstat (limited to 'lua/telescope/utils.lua')
| -rw-r--r-- | lua/telescope/utils.lua | 142 |
1 files changed, 37 insertions, 105 deletions
diff --git a/lua/telescope/utils.lua b/lua/telescope/utils.lua index 7ddc428..eba24a6 100644 --- a/lua/telescope/utils.lua +++ b/lua/telescope/utils.lua @@ -1,5 +1,25 @@ local utils = {} +utils.if_nil = function(x, was_nil, was_not_nil) + if x == nil then + return was_nil + else + return was_not_nil + end +end + +utils.get_default = function(x, default) + return utils.if_nil(x, default, x) +end + +utils.get_lazy_default = function(x, defaulter, ...) + if x == nil then + return defaulter(...) + else + return x + end +end + local function reversedipairsiter(t, i) i = i - 1 if i ~= 0 then @@ -27,119 +47,31 @@ utils.repeated_table = function(n, val) return empty_lines end - -local NGram = {} -NGram.__index = NGram - -function NGram:new(opts) - -- TODO: Add padding - opts = opts or {} - return setmetatable({ - N = opts.N or 2, - split = opts.split or "/", - _depth = 5, - _grams = setmetatable({}, utils.default_table_mt) - }, self) -end - -local min = math.min - -function NGram:_split(word) - local word_len = #word - - local result = {} - for i = 1, word_len - 1 do - -- for j = i + (self.N - 1), min(i + self._depth - 1, word_len) do - -- table.insert(result, string.sub(word, i, j)) - -- end - table.insert(result, string.sub(word, i, i + self.N - 1)) - end - - return result -end - --- local function pairsByKeys (t, f) --- local a = {} --- for n in pairs(t) do table.insert(a, n) end --- table.sort(a, f) --- local i = 0 -- iterator variable --- local iter = function () -- iterator function --- i = i + 1 --- if a[i] == nil then return nil --- else return a[i], t[a[i]] --- end --- end --- return iter --- end - -function NGram:add(word) - local split_word = self:_split(word) - - for _, k in ipairs(split_word) do - local counts = self._grams[k] - if counts[word] == nil then - counts[word] = 0 - end - - counts[word] = counts[word] + 1 - end -end - -function NGram:_items_sharing_ngrams(query) - local split_query = self:_split(query) - - -- Matched string to number of N-grams shared with the query string. - local shared = {} - - local remaining = {} - - for _, ngram in ipairs(split_query) do - remaining = {} - for match, count in pairs(self._grams[ngram] or {}) do - remaining[match] = remaining[match] or count - - if remaining[match] > 0 then - remaining[match] = remaining[match] - 1 - shared[match] = (shared[match] or 0) + 1 - end - end - end - - return shared -end - -function NGram:search(query, show_values) - local sharing_ngrams = self:_items_sharing_ngrams(query) - +utils.quickfix_items_to_entries = function(locations) local results = {} - for name, count in pairs(sharing_ngrams) do - local allgrams = #query + #name - (2 * self.N) - count + 2 - table.insert(results, {name, count / allgrams}) - end - - table.sort(results, function(left, right) - return left[2] > right[2] - end) - if not show_values then - for k, v in ipairs(results) do - results[k] = v[1] - end + for _, entry in ipairs(locations) do + local vimgrep_str = string.format( + "%s:%s:%s: %s", + vim.fn.fnamemodify(entry.filename, ":."), + entry.lnum, + entry.col, + entry.text + ) + + table.insert(results, { + valid = true, + value = entry, + ordinal = vimgrep_str, + display = vimgrep_str, + }) end return results end -function NGram:find(query) - return self:search(query)[1] -end - -function NGram:score(query) - return (self:search(query, true)[1] or {})[2] or 0 -end - utils.new_ngram = function() - return NGram:new() + return require("telescope._private.NGram"):new() end return utils |
