chore: use stylua for formatting (#1040)
* chore: stylua job and config * reformat with stylua
This commit is contained in:
11
.github/workflows/lint.yml
vendored
11
.github/workflows/lint.yml
vendored
@@ -17,3 +17,14 @@ jobs:
|
||||
|
||||
- name: Lint
|
||||
run: sudo make lint
|
||||
|
||||
stylua:
|
||||
name: stylua
|
||||
runs-on: ubuntu-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: JohnnyMorganz/stylua-action@1.0.0
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
# CLI arguments
|
||||
args: --color always --check lua/
|
||||
|
||||
6
.stylua.toml
Normal file
6
.stylua.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
column_width = 120
|
||||
line_endings = "Unix"
|
||||
indent_type = "Spaces"
|
||||
indent_width = 2
|
||||
quote_style = "AutoPreferDouble"
|
||||
no_call_parentheses = true
|
||||
@@ -1,18 +1,17 @@
|
||||
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local actions = require('telescope.actions')
|
||||
local action_state = require('telescope.actions.state')
|
||||
local finders = require('telescope.finders')
|
||||
local previewers = require('telescope.previewers')
|
||||
local pickers = require('telescope.pickers')
|
||||
local sorters = require('telescope.sorters')
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local actions = require "telescope.actions"
|
||||
local action_state = require "telescope.actions.state"
|
||||
local finders = require "telescope.finders"
|
||||
local previewers = require "telescope.previewers"
|
||||
local pickers = require "telescope.pickers"
|
||||
local sorters = require "telescope.sorters"
|
||||
|
||||
local WIP = {}
|
||||
|
||||
WIP.git_diff = function()
|
||||
local file_picker = pickers.new {
|
||||
previewer = previewers.new_termopen {
|
||||
command = "git diff %s"
|
||||
command = "git diff %s",
|
||||
},
|
||||
}
|
||||
|
||||
@@ -24,13 +23,13 @@ WIP.git_diff = function()
|
||||
|
||||
fn_command = function()
|
||||
return {
|
||||
command = 'git',
|
||||
args = {'ls-files', '-m'}
|
||||
command = "git",
|
||||
args = { "ls-files", "-m" },
|
||||
}
|
||||
end,
|
||||
},
|
||||
|
||||
sorter = sorters.get_norcalli_sorter()
|
||||
sorter = sorters.get_norcalli_sorter(),
|
||||
}
|
||||
end
|
||||
|
||||
@@ -43,12 +42,12 @@ WIP.completion = function(opts)
|
||||
end
|
||||
|
||||
local lsp_reference_finder = finders.new {
|
||||
results = results
|
||||
results = results,
|
||||
}
|
||||
|
||||
-- TODO: Open the help text for the line.
|
||||
local reference_picker = pickers.new(opts, {
|
||||
prompt = 'vim.api Help Reference',
|
||||
prompt = "vim.api Help Reference",
|
||||
finder = lsp_reference_finder,
|
||||
sorter = sorters.get_norcalli_sorter(),
|
||||
previewer = previewers.help,
|
||||
@@ -57,12 +56,11 @@ WIP.completion = function(opts)
|
||||
reference_picker:find {}
|
||||
end
|
||||
|
||||
|
||||
WIP.reloader = function(opts)
|
||||
opts = opts or {}
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt = 'Packages',
|
||||
prompt = "Packages",
|
||||
finder = finders.new_table {
|
||||
results = vim.tbl_keys(package.loaded),
|
||||
entry_maker = make_entry.gen_from_string(opts),
|
||||
@@ -78,11 +76,11 @@ WIP.reloader = function(opts)
|
||||
print(vim.inspect(selection))
|
||||
end
|
||||
|
||||
map('i', '<CR>', reload_package)
|
||||
map('n', '<CR>', reload_package)
|
||||
map("i", "<CR>", reload_package)
|
||||
map("n", "<CR>", reload_package)
|
||||
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ vim.deepcopy = (function()
|
||||
|
||||
return copy
|
||||
end,
|
||||
['function'] = _id or function(orig)
|
||||
["function"] = _id or function(orig)
|
||||
local ok, dumped = pcall(string.dump, orig)
|
||||
if not ok then
|
||||
error(debug.traceback(dumped))
|
||||
@@ -41,7 +41,7 @@ vim.deepcopy = (function()
|
||||
end,
|
||||
number = _id,
|
||||
string = _id,
|
||||
['nil'] = _id,
|
||||
["nil"] = _id,
|
||||
boolean = _id,
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ vim.deepcopy = (function()
|
||||
if f then
|
||||
return f(orig)
|
||||
else
|
||||
error("Cannot deepcopy object of type "..type(orig))
|
||||
error("Cannot deepcopy object of type " .. type(orig))
|
||||
end
|
||||
end
|
||||
end)()
|
||||
|
||||
@@ -6,13 +6,13 @@ extensions._config = {}
|
||||
extensions.manager = setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
-- See if this extension exists.
|
||||
local ok, ext = pcall(require, 'telescope._extensions.' .. k)
|
||||
local ok, ext = pcall(require, "telescope._extensions." .. k)
|
||||
if not ok then
|
||||
error("This extension doesn't exist or is not installed: " .. k .. "\n" .. ext)
|
||||
end
|
||||
|
||||
if ext.setup then
|
||||
ext.setup(extensions._config[k] or {}, require('telescope.config').values)
|
||||
ext.setup(extensions._config[k] or {}, require("telescope.config").values)
|
||||
end
|
||||
|
||||
t[k] = ext.exports or {}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local conf = require('telescope.config').values
|
||||
local Path = require('plenary.path')
|
||||
local conf = require("telescope.config").values
|
||||
local Path = require "plenary.path"
|
||||
|
||||
local uv = vim.loop
|
||||
|
||||
@@ -37,7 +37,9 @@ local write_async = function(path, txt, flag)
|
||||
end)
|
||||
end
|
||||
|
||||
local append_async = function(path, txt) write_async(path, txt, "a") end
|
||||
local append_async = function(path, txt)
|
||||
write_async(path, txt, "a")
|
||||
end
|
||||
|
||||
local histories = {}
|
||||
|
||||
@@ -86,7 +88,9 @@ end
|
||||
|
||||
--- Will reset the history index to the default initial state. Will happen after the picker closed
|
||||
function histories.History:reset()
|
||||
if not self.enabled then return end
|
||||
if not self.enabled then
|
||||
return
|
||||
end
|
||||
self._reset(self)
|
||||
end
|
||||
|
||||
@@ -95,7 +99,9 @@ end
|
||||
---@param picker table: the current picker object
|
||||
---@param no_reset boolean: On default it will reset the state at the end. If you don't want to do this set to true
|
||||
function histories.History:append(line, picker, no_reset)
|
||||
if not self.enabled then return end
|
||||
if not self.enabled then
|
||||
return
|
||||
end
|
||||
self._append(self, line, picker, no_reset)
|
||||
end
|
||||
|
||||
@@ -105,11 +111,15 @@ end
|
||||
---@return string: the next history item
|
||||
function histories.History:get_next(line, picker)
|
||||
if not self.enabled then
|
||||
print("You are cycling to next the history item but history is disabled.",
|
||||
"Read ':help telescope.defaults.history'")
|
||||
print(
|
||||
"You are cycling to next the history item but history is disabled.",
|
||||
"Read ':help telescope.defaults.history'"
|
||||
)
|
||||
return false
|
||||
end
|
||||
if self._pre_get then self._pre_get(self, line, picker) end
|
||||
if self._pre_get then
|
||||
self._pre_get(self, line, picker)
|
||||
end
|
||||
|
||||
local next_idx = self.index + 1
|
||||
if next_idx <= #self.content then
|
||||
@@ -126,15 +136,21 @@ end
|
||||
---@return string: the previous history item
|
||||
function histories.History:get_prev(line, picker)
|
||||
if not self.enabled then
|
||||
print("You are cycling to previous the history item but history is disabled.",
|
||||
"Read ':help telescope.defaults.history'")
|
||||
print(
|
||||
"You are cycling to previous the history item but history is disabled.",
|
||||
"Read ':help telescope.defaults.history'"
|
||||
)
|
||||
return false
|
||||
end
|
||||
if self._pre_get then self._pre_get(self, line, picker) end
|
||||
if self._pre_get then
|
||||
self._pre_get(self, line, picker)
|
||||
end
|
||||
|
||||
local next_idx = self.index - 1
|
||||
if self.index == #self.content + 1 then
|
||||
if line ~= '' then self:append(line, picker, true) end
|
||||
if line ~= "" then
|
||||
self:append(line, picker, true)
|
||||
end
|
||||
end
|
||||
if next_idx >= 1 then
|
||||
self.index = next_idx
|
||||
@@ -147,10 +163,12 @@ end
|
||||
---
|
||||
--- It will keep one unified history across all pickers.
|
||||
histories.get_simple_history = function()
|
||||
return histories.new({
|
||||
return histories.new {
|
||||
init = function(obj)
|
||||
local p = Path:new(obj.path)
|
||||
if not p:exists() then p:touch({ parents = true }) end
|
||||
if not p:exists() then
|
||||
p:touch { parents = true }
|
||||
end
|
||||
|
||||
obj.content = Path:new(obj.path):readlines()
|
||||
obj.index = #obj.content
|
||||
@@ -160,7 +178,7 @@ histories.get_simple_history = function()
|
||||
self.index = #self.content + 1
|
||||
end,
|
||||
append = function(self, line, _, no_reset)
|
||||
if line ~= '' then
|
||||
if line ~= "" then
|
||||
if self.content[#self.content] ~= line then
|
||||
table.insert(self.content, line)
|
||||
|
||||
@@ -170,9 +188,9 @@ histories.get_simple_history = function()
|
||||
for i = diff, 1, -1 do
|
||||
table.remove(self.content, i)
|
||||
end
|
||||
write_async(self.path, table.concat(self.content, '\n') .. '\n', 'w')
|
||||
write_async(self.path, table.concat(self.content, "\n") .. "\n", "w")
|
||||
else
|
||||
append_async(self.path, line .. '\n')
|
||||
append_async(self.path, line .. "\n")
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -180,7 +198,7 @@ histories.get_simple_history = function()
|
||||
self:reset()
|
||||
end
|
||||
end,
|
||||
})
|
||||
}
|
||||
end
|
||||
|
||||
return histories
|
||||
|
||||
@@ -9,30 +9,36 @@
|
||||
|
||||
local a = vim.api
|
||||
|
||||
local log = require('telescope.log')
|
||||
local state = require('telescope.state')
|
||||
local utils = require('telescope.utils')
|
||||
local p_scroller = require('telescope.pickers.scroller')
|
||||
local log = require "telescope.log"
|
||||
local state = require "telescope.state"
|
||||
local utils = require "telescope.utils"
|
||||
local p_scroller = require "telescope.pickers.scroller"
|
||||
|
||||
local action_state = require('telescope.actions.state')
|
||||
local action_utils = require('telescope.actions.utils')
|
||||
local action_set = require('telescope.actions.set')
|
||||
local action_state = require "telescope.actions.state"
|
||||
local action_utils = require "telescope.actions.utils"
|
||||
local action_set = require "telescope.actions.set"
|
||||
|
||||
local transform_mod = require('telescope.actions.mt').transform_mod
|
||||
local transform_mod = require("telescope.actions.mt").transform_mod
|
||||
|
||||
local actions = setmetatable({}, {
|
||||
__index = function(_, k)
|
||||
-- TODO(conni2461): Remove deprecated messages
|
||||
if k:find('goto_file_selection') then
|
||||
error("`" .. k .. "` is removed and no longer usable. " ..
|
||||
"Use `require('telescope.actions').select_` instead. Take a look at developers.md for more Information.")
|
||||
elseif k == '_goto_file_selection' then
|
||||
error("`_goto_file_selection` is deprecated and no longer replaceable. " ..
|
||||
"Use `require('telescope.actions.set').edit` instead. Take a look at developers.md for more Information.")
|
||||
if k:find "goto_file_selection" then
|
||||
error(
|
||||
"`"
|
||||
.. k
|
||||
.. "` is removed and no longer usable. "
|
||||
.. "Use `require('telescope.actions').select_` instead. Take a look at developers.md for more Information."
|
||||
)
|
||||
elseif k == "_goto_file_selection" then
|
||||
error(
|
||||
"`_goto_file_selection` is deprecated and no longer replaceable. "
|
||||
.. "Use `require('telescope.actions.set').edit` instead. Take a look at developers.md for more Information."
|
||||
)
|
||||
end
|
||||
|
||||
error("Key does not exist for 'telescope.actions': " .. tostring(k))
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
-- TODO(conni2461): Remove deprecated messages
|
||||
@@ -40,29 +46,25 @@ local action_is_deprecated = function(name, err)
|
||||
local messager = err and error or log.info
|
||||
|
||||
return messager(
|
||||
string.format("`actions.%s()` is deprecated."
|
||||
.. "Use require('telescope.actions.state').%s() instead",
|
||||
name,
|
||||
name
|
||||
)
|
||||
string.format("`actions.%s()` is deprecated." .. "Use require('telescope.actions.state').%s() instead", name, name)
|
||||
)
|
||||
end
|
||||
|
||||
function actions.get_selected_entry()
|
||||
-- TODO(1.0): Remove
|
||||
action_is_deprecated("get_selected_entry")
|
||||
action_is_deprecated "get_selected_entry"
|
||||
return action_state.get_selected_entry()
|
||||
end
|
||||
|
||||
function actions.get_current_line()
|
||||
-- TODO(1.0): Remove
|
||||
action_is_deprecated("get_current_line")
|
||||
action_is_deprecated "get_current_line"
|
||||
return action_state.get_current_line()
|
||||
end
|
||||
|
||||
function actions.get_current_picker(prompt_bufnr)
|
||||
-- TODO(1.0): Remove
|
||||
action_is_deprecated("get_current_picker")
|
||||
action_is_deprecated "get_current_picker"
|
||||
return action_state.get_current_picker(prompt_bufnr)
|
||||
end
|
||||
|
||||
@@ -96,31 +98,27 @@ end
|
||||
---@param prompt_bufnr number: The prompt bufnr
|
||||
function actions.move_to_top(prompt_bufnr)
|
||||
local current_picker = actions.get_current_picker(prompt_bufnr)
|
||||
current_picker:set_selection(p_scroller.top(current_picker.sorting_strategy,
|
||||
current_picker.max_results,
|
||||
current_picker.manager:num_results()
|
||||
))
|
||||
current_picker:set_selection(
|
||||
p_scroller.top(current_picker.sorting_strategy, current_picker.max_results, current_picker.manager:num_results())
|
||||
)
|
||||
end
|
||||
|
||||
--- Move to the middle of the picker
|
||||
---@param prompt_bufnr number: The prompt bufnr
|
||||
function actions.move_to_middle(prompt_bufnr)
|
||||
local current_picker = actions.get_current_picker(prompt_bufnr)
|
||||
current_picker:set_selection(p_scroller.middle(
|
||||
current_picker.sorting_strategy,
|
||||
current_picker.max_results,
|
||||
current_picker.manager:num_results()
|
||||
))
|
||||
current_picker:set_selection(
|
||||
p_scroller.middle(current_picker.sorting_strategy, current_picker.max_results, current_picker.manager:num_results())
|
||||
)
|
||||
end
|
||||
|
||||
--- Move to the bottom of the picker
|
||||
---@param prompt_bufnr number: The prompt bufnr
|
||||
function actions.move_to_bottom(prompt_bufnr)
|
||||
local current_picker = actions.get_current_picker(prompt_bufnr)
|
||||
current_picker:set_selection(p_scroller.bottom(current_picker.sorting_strategy,
|
||||
current_picker.max_results,
|
||||
current_picker.manager:num_results()
|
||||
))
|
||||
current_picker:set_selection(
|
||||
p_scroller.bottom(current_picker.sorting_strategy, current_picker.max_results, current_picker.manager:num_results())
|
||||
)
|
||||
end
|
||||
|
||||
--- Add current entry to multi select
|
||||
@@ -193,7 +191,7 @@ function actions.preview_scrolling_down(prompt_bufnr)
|
||||
end
|
||||
|
||||
function actions.center(_)
|
||||
vim.cmd(':normal! zz')
|
||||
vim.cmd ":normal! zz"
|
||||
end
|
||||
|
||||
actions.select_default = {
|
||||
@@ -205,7 +203,7 @@ actions.select_default = {
|
||||
end,
|
||||
action = function(prompt_bufnr)
|
||||
return action_set.select(prompt_bufnr, "default")
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
actions.select_horizontal = {
|
||||
@@ -217,7 +215,7 @@ actions.select_horizontal = {
|
||||
end,
|
||||
action = function(prompt_bufnr)
|
||||
return action_set.select(prompt_bufnr, "horizontal")
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
actions.select_vertical = {
|
||||
@@ -229,7 +227,7 @@ actions.select_vertical = {
|
||||
end,
|
||||
action = function(prompt_bufnr)
|
||||
return action_set.select(prompt_bufnr, "vertical")
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
actions.select_tab = {
|
||||
@@ -241,7 +239,7 @@ actions.select_tab = {
|
||||
end,
|
||||
action = function(prompt_bufnr)
|
||||
return action_set.select(prompt_bufnr, "tab")
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
-- TODO: consider adding float!
|
||||
@@ -265,7 +263,7 @@ end
|
||||
|
||||
function actions.close_pum(_)
|
||||
if 0 ~= vim.fn.pumvisible() then
|
||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<c-y>", true, true, true), 'n', true)
|
||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<c-y>", true, true, true), "n", true)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -299,7 +297,7 @@ end
|
||||
actions.edit_command_line = function(prompt_bufnr)
|
||||
local entry = action_state.get_selected_entry(prompt_bufnr)
|
||||
actions.close(prompt_bufnr)
|
||||
a.nvim_feedkeys(a.nvim_replace_termcodes(":" .. entry.value , true, false, true), "t", true)
|
||||
a.nvim_feedkeys(a.nvim_replace_termcodes(":" .. entry.value, true, false, true), "t", true)
|
||||
end
|
||||
|
||||
actions.set_command_line = function(prompt_bufnr)
|
||||
@@ -313,7 +311,7 @@ end
|
||||
actions.edit_search_line = function(prompt_bufnr)
|
||||
local entry = action_state.get_selected_entry(prompt_bufnr)
|
||||
actions.close(prompt_bufnr)
|
||||
a.nvim_feedkeys(a.nvim_replace_termcodes("/" .. entry.value , true, false, true), "t", true)
|
||||
a.nvim_feedkeys(a.nvim_replace_termcodes("/" .. entry.value, true, false, true), "t", true)
|
||||
end
|
||||
|
||||
actions.set_search_line = function(prompt_bufnr)
|
||||
@@ -352,7 +350,7 @@ actions.paste_register = function(prompt_bufnr)
|
||||
|
||||
-- ensure that the buffer can be written to
|
||||
if vim.api.nvim_buf_get_option(vim.api.nvim_get_current_buf(), "modifiable") then
|
||||
print("Paste!")
|
||||
print "Paste!"
|
||||
vim.api.nvim_paste(entry.content, true, -1)
|
||||
end
|
||||
end
|
||||
@@ -361,22 +359,22 @@ actions.run_builtin = function(prompt_bufnr)
|
||||
local entry = action_state.get_selected_entry(prompt_bufnr)
|
||||
|
||||
actions._close(prompt_bufnr, true)
|
||||
if string.match(entry.text," : ") then
|
||||
if string.match(entry.text, " : ") then
|
||||
-- Call appropriate function from extensions
|
||||
local split_string = vim.split(entry.text," : ")
|
||||
local split_string = vim.split(entry.text, " : ")
|
||||
local ext = split_string[1]
|
||||
local func = split_string[2]
|
||||
require('telescope').extensions[ext][func]()
|
||||
require("telescope").extensions[ext][func]()
|
||||
else
|
||||
-- Call appropriate telescope builtin
|
||||
require('telescope.builtin')[entry.text]()
|
||||
require("telescope.builtin")[entry.text]()
|
||||
end
|
||||
end
|
||||
|
||||
actions.insert_symbol = function(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
vim.api.nvim_put({selection.value[1]}, '', true, true)
|
||||
vim.api.nvim_put({ selection.value[1] }, "", true, true)
|
||||
end
|
||||
|
||||
-- TODO: Think about how to do this.
|
||||
@@ -397,25 +395,23 @@ actions.git_create_branch = function(prompt_bufnr)
|
||||
local new_branch = action_state.get_current_line()
|
||||
|
||||
if new_branch == "" then
|
||||
print('Please enter the name of the new branch to create')
|
||||
print "Please enter the name of the new branch to create"
|
||||
else
|
||||
local confirmation = vim.fn.input(string.format('Create new branch "%s"? [y/n]: ', new_branch))
|
||||
if string.len(confirmation) == 0 or string.sub(string.lower(confirmation), 0, 1) ~= 'y' then
|
||||
if string.len(confirmation) == 0 or string.sub(string.lower(confirmation), 0, 1) ~= "y" then
|
||||
print(string.format('Didn\'t create branch "%s"', new_branch))
|
||||
return
|
||||
end
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'checkout', '-b', new_branch }, cwd)
|
||||
local _, ret, stderr = utils.get_os_command_output({ "git", "checkout", "-b", new_branch }, cwd)
|
||||
if ret == 0 then
|
||||
print(string.format('Switched to a new branch: %s', new_branch))
|
||||
print(string.format("Switched to a new branch: %s", new_branch))
|
||||
else
|
||||
print(string.format(
|
||||
'Error when creating new branch: %s Git returned "%s"',
|
||||
new_branch,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
print(
|
||||
string.format('Error when creating new branch: %s Git returned "%s"', new_branch, table.concat(stderr, " "))
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -425,15 +421,11 @@ end
|
||||
actions.git_apply_stash = function(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'stash', 'apply', '--index', selection.value })
|
||||
local _, ret, stderr = utils.get_os_command_output { "git", "stash", "apply", "--index", selection.value }
|
||||
if ret == 0 then
|
||||
print("applied: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when applying: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
print(string.format('Error when applying: %s. Git returned: "%s"', selection.value, table.concat(stderr, " ")))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -443,15 +435,11 @@ actions.git_checkout = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'checkout', selection.value }, cwd)
|
||||
local _, ret, stderr = utils.get_os_command_output({ "git", "checkout", selection.value }, cwd)
|
||||
if ret == 0 then
|
||||
print("Checked out: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when checking out: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
print(string.format('Error when checking out: %s. Git returned: "%s"', selection.value, table.concat(stderr, " ")))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -463,20 +451,16 @@ actions.git_switch_branch = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
local pattern = '^refs/remotes/%w+/'
|
||||
local pattern = "^refs/remotes/%w+/"
|
||||
local branch = selection.value
|
||||
if string.match(selection.refname, pattern) then
|
||||
branch = string.gsub(selection.refname, pattern, '')
|
||||
branch = string.gsub(selection.refname, pattern, "")
|
||||
end
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'switch', branch }, cwd)
|
||||
local _, ret, stderr = utils.get_os_command_output({ "git", "switch", branch }, cwd)
|
||||
if ret == 0 then
|
||||
print("Switched to: " .. branch)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when switching to: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
print(string.format('Error when switching to: %s. Git returned: "%s"', selection.value, table.concat(stderr, " ")))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -486,15 +470,13 @@ actions.git_track_branch = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'checkout', '--track', selection.value }, cwd)
|
||||
local _, ret, stderr = utils.get_os_command_output({ "git", "checkout", "--track", selection.value }, cwd)
|
||||
if ret == 0 then
|
||||
print("Tracking branch: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when tracking branch: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
print(
|
||||
string.format('Error when tracking branch: %s. Git returned: "%s"', selection.value, table.concat(stderr, " "))
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -504,19 +486,19 @@ actions.git_delete_branch = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
|
||||
local confirmation = vim.fn.input('Do you really wanna delete branch ' .. selection.value .. '? [Y/n] ')
|
||||
if confirmation ~= '' and string.lower(confirmation) ~= 'y' then return end
|
||||
local confirmation = vim.fn.input("Do you really wanna delete branch " .. selection.value .. "? [Y/n] ")
|
||||
if confirmation ~= "" and string.lower(confirmation) ~= "y" then
|
||||
return
|
||||
end
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'branch', '-D', selection.value }, cwd)
|
||||
local _, ret, stderr = utils.get_os_command_output({ "git", "branch", "-D", selection.value }, cwd)
|
||||
if ret == 0 then
|
||||
print("Deleted branch: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when deleting branch: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
print(
|
||||
string.format('Error when deleting branch: %s. Git returned: "%s"', selection.value, table.concat(stderr, " "))
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -526,19 +508,19 @@ actions.git_rebase_branch = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
|
||||
local confirmation = vim.fn.input('Do you really wanna rebase branch ' .. selection.value .. '? [Y/n] ')
|
||||
if confirmation ~= '' and string.lower(confirmation) ~= 'y' then return end
|
||||
local confirmation = vim.fn.input("Do you really wanna rebase branch " .. selection.value .. "? [Y/n] ")
|
||||
if confirmation ~= "" and string.lower(confirmation) ~= "y" then
|
||||
return
|
||||
end
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
local _, ret, stderr = utils.get_os_command_output({ 'git', 'rebase', selection.value }, cwd)
|
||||
local _, ret, stderr = utils.get_os_command_output({ "git", "rebase", selection.value }, cwd)
|
||||
if ret == 0 then
|
||||
print("Rebased branch: " .. selection.value)
|
||||
else
|
||||
print(string.format(
|
||||
'Error when rebasing branch: %s. Git returned: "%s"',
|
||||
selection.value,
|
||||
table.concat(stderr, ' ')
|
||||
))
|
||||
print(
|
||||
string.format('Error when rebasing branch: %s. Git returned: "%s"', selection.value, table.concat(stderr, " "))
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -546,7 +528,7 @@ actions.git_checkout_current_buffer = function(prompt_bufnr)
|
||||
local cwd = actions.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = actions.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
utils.get_os_command_output({ 'git', 'checkout', selection.value, '--', selection.file }, cwd)
|
||||
utils.get_os_command_output({ "git", "checkout", selection.value, "--", selection.file }, cwd)
|
||||
end
|
||||
|
||||
--- Stage/unstage selected file
|
||||
@@ -555,10 +537,10 @@ actions.git_staging_toggle = function(prompt_bufnr)
|
||||
local cwd = action_state.get_current_picker(prompt_bufnr).cwd
|
||||
local selection = action_state.get_selected_entry()
|
||||
|
||||
if selection.status:sub(2) == ' ' then
|
||||
utils.get_os_command_output({ 'git', 'restore', '--staged', selection.value }, cwd)
|
||||
if selection.status:sub(2) == " " then
|
||||
utils.get_os_command_output({ "git", "restore", "--staged", selection.value }, cwd)
|
||||
else
|
||||
utils.get_os_command_output({ 'git', 'add', selection.value }, cwd)
|
||||
utils.get_os_command_output({ "git", "add", selection.value }, cwd)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -582,7 +564,7 @@ local send_selected_to_qf = function(prompt_bufnr, mode, target)
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
|
||||
if target == 'loclist' then
|
||||
if target == "loclist" then
|
||||
vim.fn.setloclist(picker.original_win_id, qf_entries, mode)
|
||||
else
|
||||
vim.fn.setqflist(qf_entries, mode)
|
||||
@@ -600,7 +582,7 @@ local send_all_to_qf = function(prompt_bufnr, mode, target)
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
|
||||
if target == 'loclist' then
|
||||
if target == "loclist" then
|
||||
vim.fn.setloclist(picker.original_win_id, qf_entries, mode)
|
||||
else
|
||||
vim.fn.setqflist(qf_entries, mode)
|
||||
@@ -609,42 +591,42 @@ end
|
||||
|
||||
--- Sends the selected entries to the quickfix list, replacing the previous entries.
|
||||
actions.send_selected_to_qflist = function(prompt_bufnr)
|
||||
send_selected_to_qf(prompt_bufnr, 'r')
|
||||
send_selected_to_qf(prompt_bufnr, "r")
|
||||
end
|
||||
|
||||
--- Adds the selected entries to the quickfix list, keeping the previous entries.
|
||||
actions.add_selected_to_qflist = function(prompt_bufnr)
|
||||
send_selected_to_qf(prompt_bufnr, 'a')
|
||||
send_selected_to_qf(prompt_bufnr, "a")
|
||||
end
|
||||
|
||||
--- Sends all entries to the quickfix list, replacing the previous entries.
|
||||
actions.send_to_qflist = function(prompt_bufnr)
|
||||
send_all_to_qf(prompt_bufnr, 'r')
|
||||
send_all_to_qf(prompt_bufnr, "r")
|
||||
end
|
||||
|
||||
--- Adds all entries to the quickfix list, keeping the previous entries.
|
||||
actions.add_to_qflist = function(prompt_bufnr)
|
||||
send_all_to_qf(prompt_bufnr, 'a')
|
||||
send_all_to_qf(prompt_bufnr, "a")
|
||||
end
|
||||
|
||||
--- Sends the selected entries to the location list, replacing the previous entries.
|
||||
--- Sends the selected entries to the location list, replacing the previous entries.
|
||||
actions.send_selected_to_loclist = function(prompt_bufnr)
|
||||
send_selected_to_qf(prompt_bufnr, 'r', 'loclist')
|
||||
send_selected_to_qf(prompt_bufnr, "r", "loclist")
|
||||
end
|
||||
|
||||
--- Adds the selected entries to the location list, keeping the previous entries.
|
||||
--- Adds the selected entries to the location list, keeping the previous entries.
|
||||
actions.add_selected_to_loclist = function(prompt_bufnr)
|
||||
send_selected_to_qf(prompt_bufnr, 'a', 'loclist')
|
||||
send_selected_to_qf(prompt_bufnr, "a", "loclist")
|
||||
end
|
||||
|
||||
--- Sends all entries to the location list, replacing the previous entries.
|
||||
--- Sends all entries to the location list, replacing the previous entries.
|
||||
actions.send_to_loclist = function(prompt_bufnr)
|
||||
send_all_to_qf(prompt_bufnr, 'r', 'loclist')
|
||||
send_all_to_qf(prompt_bufnr, "r", "loclist")
|
||||
end
|
||||
|
||||
--- Adds all entries to the location list, keeping the previous entries.
|
||||
--- Adds all entries to the location list, keeping the previous entries.
|
||||
actions.add_to_loclist = function(prompt_bufnr)
|
||||
send_all_to_qf(prompt_bufnr, 'a', 'loclist')
|
||||
send_all_to_qf(prompt_bufnr, "a", "loclist")
|
||||
end
|
||||
|
||||
local smart_send = function(prompt_bufnr, mode, target)
|
||||
@@ -659,25 +641,25 @@ end
|
||||
--- Sends the selected entries to the quickfix list, replacing the previous entries.
|
||||
--- If no entry was selected, sends all entries.
|
||||
actions.smart_send_to_qflist = function(prompt_bufnr)
|
||||
smart_send(prompt_bufnr, 'r')
|
||||
smart_send(prompt_bufnr, "r")
|
||||
end
|
||||
|
||||
--- Adds the selected entries to the quickfix list, keeping the previous entries.
|
||||
--- If no entry was selected, adds all entries.
|
||||
actions.smart_add_to_qflist = function(prompt_bufnr)
|
||||
smart_send(prompt_bufnr, 'a')
|
||||
smart_send(prompt_bufnr, "a")
|
||||
end
|
||||
|
||||
--- Sends the selected entries to the location list, replacing the previous entries.
|
||||
--- If no entry was selected, sends all entries.
|
||||
actions.smart_send_to_loclist = function(prompt_bufnr)
|
||||
smart_send(prompt_bufnr, 'r', 'loclist')
|
||||
smart_send(prompt_bufnr, "r", "loclist")
|
||||
end
|
||||
|
||||
--- Adds the selected entries to the location list, keeping the previous entries.
|
||||
--- If no entry was selected, adds all entries.
|
||||
actions.smart_add_to_loclist = function(prompt_bufnr)
|
||||
smart_send(prompt_bufnr, 'a', 'loclist')
|
||||
smart_send(prompt_bufnr, "a", "loclist")
|
||||
end
|
||||
|
||||
actions.complete_tag = function(prompt_bufnr)
|
||||
@@ -686,14 +668,14 @@ actions.complete_tag = function(prompt_bufnr)
|
||||
local delimiter = current_picker.sorter._delimiter
|
||||
|
||||
if not tags then
|
||||
print('No tag pre-filtering set for this picker')
|
||||
print "No tag pre-filtering set for this picker"
|
||||
return
|
||||
end
|
||||
|
||||
-- format tags to match filter_function
|
||||
local prefilter_tags = {}
|
||||
for tag, _ in pairs(tags) do
|
||||
table.insert(prefilter_tags, string.format('%s%s%s ', delimiter, tag:lower(), delimiter))
|
||||
table.insert(prefilter_tags, string.format("%s%s%s ", delimiter, tag:lower(), delimiter))
|
||||
end
|
||||
|
||||
local line = action_state.get_current_line()
|
||||
@@ -713,14 +695,13 @@ actions.complete_tag = function(prompt_bufnr)
|
||||
end
|
||||
|
||||
if vim.tbl_isempty(filtered_tags) then
|
||||
print('No matches found')
|
||||
print "No matches found"
|
||||
return
|
||||
end
|
||||
|
||||
-- incremental completion by substituting string starting from col - #line byte offset
|
||||
local col = vim.api.nvim_win_get_cursor(0)[2] + 1
|
||||
vim.fn.complete(col - #line, filtered_tags)
|
||||
|
||||
end
|
||||
|
||||
actions.cycle_history_next = function(prompt_bufnr)
|
||||
@@ -729,7 +710,9 @@ actions.cycle_history_next = function(prompt_bufnr)
|
||||
local line = action_state.get_current_line()
|
||||
|
||||
local entry = history:get_next(line, current_picker)
|
||||
if entry == false then return end
|
||||
if entry == false then
|
||||
return
|
||||
end
|
||||
|
||||
current_picker:reset_prompt()
|
||||
if entry ~= nil then
|
||||
@@ -743,7 +726,9 @@ actions.cycle_history_prev = function(prompt_bufnr)
|
||||
local line = action_state.get_current_line()
|
||||
|
||||
local entry = history:get_prev(line, current_picker)
|
||||
if entry == false then return end
|
||||
if entry == false then
|
||||
return
|
||||
end
|
||||
if entry ~= nil then
|
||||
current_picker:reset_prompt()
|
||||
current_picker:set_prompt(entry)
|
||||
|
||||
@@ -27,11 +27,7 @@ action_mt.create = function(mod)
|
||||
end
|
||||
|
||||
local result = {
|
||||
run_replace_or_original(
|
||||
t._replacements[action_name],
|
||||
mod[action_name],
|
||||
...
|
||||
)
|
||||
run_replace_or_original(t._replacements[action_name], mod[action_name], ...),
|
||||
}
|
||||
for _, res in ipairs(result) do
|
||||
table.insert(values, res)
|
||||
@@ -128,7 +124,7 @@ action_mt.create = function(mod)
|
||||
end
|
||||
|
||||
action_mt.transform = function(k, mt, mod, v)
|
||||
local res = setmetatable({k}, mt)
|
||||
local res = setmetatable({ k }, mt)
|
||||
if type(v) == "table" then
|
||||
res._static_pre[k] = v.pre
|
||||
res._static_post[k] = v.post
|
||||
|
||||
@@ -12,18 +12,18 @@
|
||||
|
||||
local a = vim.api
|
||||
|
||||
local log = require('telescope.log')
|
||||
local Path = require('plenary.path')
|
||||
local state = require('telescope.state')
|
||||
local log = require "telescope.log"
|
||||
local Path = require "plenary.path"
|
||||
local state = require "telescope.state"
|
||||
|
||||
local action_state = require('telescope.actions.state')
|
||||
local action_state = require "telescope.actions.state"
|
||||
|
||||
local transform_mod = require('telescope.actions.mt').transform_mod
|
||||
local transform_mod = require("telescope.actions.mt").transform_mod
|
||||
|
||||
local action_set = setmetatable({}, {
|
||||
__index = function(_, k)
|
||||
error("'telescope.actions.set' does not have a value: " .. tostring(k))
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
--- Move the current selection of a picker {change} rows.
|
||||
@@ -65,16 +65,16 @@ end
|
||||
local edit_buffer
|
||||
do
|
||||
local map = {
|
||||
edit = 'buffer',
|
||||
new = 'sbuffer',
|
||||
vnew = 'vert sbuffer',
|
||||
tabedit = 'tab sb',
|
||||
edit = "buffer",
|
||||
new = "sbuffer",
|
||||
vnew = "vert sbuffer",
|
||||
tabedit = "tab sb",
|
||||
}
|
||||
|
||||
edit_buffer = function(command, bufnr)
|
||||
command = map[command]
|
||||
if command == nil then
|
||||
error('There was no associated buffer command')
|
||||
error "There was no associated buffer command"
|
||||
end
|
||||
vim.cmd(string.format("%s %d", command, bufnr))
|
||||
end
|
||||
@@ -88,7 +88,7 @@ action_set.edit = function(prompt_bufnr, command)
|
||||
local entry = action_state.get_selected_entry()
|
||||
|
||||
if not entry then
|
||||
print("[telescope] Nothing currently selected")
|
||||
print "[telescope] Nothing currently selected"
|
||||
return
|
||||
end
|
||||
|
||||
@@ -105,7 +105,7 @@ action_set.edit = function(prompt_bufnr, command)
|
||||
-- to put stuff into `filename`
|
||||
local value = entry.value
|
||||
if not value then
|
||||
print("Could not do anything with blank line...")
|
||||
print "Could not do anything with blank line..."
|
||||
return
|
||||
end
|
||||
|
||||
@@ -122,7 +122,7 @@ action_set.edit = function(prompt_bufnr, command)
|
||||
|
||||
local entry_bufnr = entry.bufnr
|
||||
|
||||
require('telescope.actions').close(prompt_bufnr)
|
||||
require("telescope.actions").close(prompt_bufnr)
|
||||
|
||||
if entry_bufnr then
|
||||
edit_buffer(command, entry_bufnr)
|
||||
@@ -136,7 +136,7 @@ action_set.edit = function(prompt_bufnr, command)
|
||||
end
|
||||
|
||||
if row and col then
|
||||
local ok, err_msg = pcall(a.nvim_win_set_cursor, 0, {row, col})
|
||||
local ok, err_msg = pcall(a.nvim_win_set_cursor, 0, { row, col })
|
||||
if not ok then
|
||||
log.debug("Failed to move to cursor:", err_msg, row, col)
|
||||
end
|
||||
@@ -147,11 +147,11 @@ end
|
||||
---@param prompt_bufnr number: The prompt bufnr
|
||||
---@param direction number: The direction of the scrolling
|
||||
-- Valid directions include: "1", "-1"
|
||||
action_set.scroll_previewer = function (prompt_bufnr, direction)
|
||||
action_set.scroll_previewer = function(prompt_bufnr, direction)
|
||||
local previewer = action_state.get_current_picker(prompt_bufnr).previewer
|
||||
|
||||
-- Check if we actually have a previewer
|
||||
if (type(previewer) ~= "table" or previewer.scroll_fn == nil) then
|
||||
if type(previewer) ~= "table" or previewer.scroll_fn == nil then
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
@@ -6,19 +6,19 @@
|
||||
--- Generally used from within other |telescope.actions|
|
||||
---@brief ]]
|
||||
|
||||
local global_state = require('telescope.state')
|
||||
local conf = require('telescope.config').values
|
||||
local global_state = require "telescope.state"
|
||||
local conf = require("telescope.config").values
|
||||
|
||||
local action_state = {}
|
||||
|
||||
--- Get the current entry
|
||||
function action_state.get_selected_entry()
|
||||
return global_state.get_global_key('selected_entry')
|
||||
return global_state.get_global_key "selected_entry"
|
||||
end
|
||||
|
||||
--- Gets the current line
|
||||
function action_state.get_current_line()
|
||||
return global_state.get_global_key('current_line')
|
||||
return global_state.get_global_key "current_line"
|
||||
end
|
||||
|
||||
--- Gets the current picker
|
||||
@@ -38,10 +38,10 @@ function action_state.select_key_to_edit_key(type)
|
||||
end
|
||||
|
||||
function action_state.get_current_history()
|
||||
local history = global_state.get_global_key("history")
|
||||
local history = global_state.get_global_key "history"
|
||||
if not history then
|
||||
if conf.history == false or type(conf.history) ~= "table" then
|
||||
history = require('telescope.actions.history').get_simple_history()
|
||||
history = require("telescope.actions.history").get_simple_history()
|
||||
global_state.set_global_key("history", history)
|
||||
else
|
||||
history = conf.history.handler()
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
--- Generally used from within other |telescope.actions|
|
||||
---@brief ]]
|
||||
|
||||
local action_state = require('telescope.actions.state')
|
||||
local action_state = require "telescope.actions.state"
|
||||
|
||||
local utils = {}
|
||||
|
||||
@@ -33,12 +33,12 @@ local utils = {}
|
||||
---@param prompt_bufnr number: The prompt bufnr
|
||||
---@param f function: Function to map onto entries of picker that takes (entry, index, row) as viable arguments
|
||||
function utils.map_entries(prompt_bufnr, f)
|
||||
vim.validate{
|
||||
f = {f, "function"}
|
||||
vim.validate {
|
||||
f = { f, "function" },
|
||||
}
|
||||
local current_picker = action_state.get_current_picker(prompt_bufnr)
|
||||
local index = 1
|
||||
-- indices are 1-indexed, rows are 0-indexed
|
||||
-- indices are 1-indexed, rows are 0-indexed
|
||||
for entry in current_picker.manager:iter() do
|
||||
local row = current_picker:get_row(index)
|
||||
f(entry, index, row)
|
||||
@@ -69,8 +69,8 @@ end
|
||||
---@param prompt_bufnr number: The prompt bufnr
|
||||
---@param f function: Function to map onto selection of picker that takes (selection) as a viable argument
|
||||
function utils.map_selections(prompt_bufnr, f)
|
||||
vim.validate{
|
||||
f = {f, "function"}
|
||||
vim.validate {
|
||||
f = { f, "function" },
|
||||
}
|
||||
local current_picker = action_state.get_current_picker(prompt_bufnr)
|
||||
for _, selection in ipairs(current_picker:get_multi_selection()) do
|
||||
|
||||
@@ -7,12 +7,12 @@
|
||||
-- > matches on consecutive letters and starts of words. This allows matching
|
||||
-- > using acronyms or different parts of the path." - J Hawthorn
|
||||
|
||||
local has_path, Path = pcall(require, 'plenary.path')
|
||||
local has_path, Path = pcall(require, "plenary.path")
|
||||
if not has_path then
|
||||
Path = {
|
||||
path = {
|
||||
separator = '/'
|
||||
}
|
||||
separator = "/",
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
@@ -48,11 +48,11 @@ function fzy.has_match(needle, haystack)
|
||||
end
|
||||
|
||||
local function is_lower(c)
|
||||
return c:match("%l")
|
||||
return c:match "%l"
|
||||
end
|
||||
|
||||
local function is_upper(c)
|
||||
return c:match("%u")
|
||||
return c:match "%u"
|
||||
end
|
||||
|
||||
local function precompute_bonus(haystack)
|
||||
@@ -93,7 +93,7 @@ local function compute(needle, haystack, D, M)
|
||||
haystack_chars[i] = lower_haystack:sub(i, i)
|
||||
end
|
||||
|
||||
for i=1,n do
|
||||
for i = 1, n do
|
||||
D[i] = {}
|
||||
M[i] = {}
|
||||
|
||||
@@ -147,7 +147,7 @@ function fzy.positions(needle, haystack)
|
||||
return {}
|
||||
elseif n == m then
|
||||
local consecutive = {}
|
||||
for i=1,n do
|
||||
for i = 1, n do
|
||||
consecutive[i] = i
|
||||
end
|
||||
return consecutive
|
||||
@@ -160,11 +160,10 @@ function fzy.positions(needle, haystack)
|
||||
local positions = {}
|
||||
local match_required = false
|
||||
local j = m
|
||||
for i=n,1,-1 do
|
||||
for i = n, 1, -1 do
|
||||
while j >= 1 do
|
||||
if D[i][j] ~= SCORE_MIN and (match_required or D[i][j] == M[i][j]) then
|
||||
match_required = (i ~= 1) and (j ~= 1) and (
|
||||
M[i][j] == D[i - 1][j - 1] + SCORE_MATCH_CONSECUTIVE)
|
||||
match_required = (i ~= 1) and (j ~= 1) and (M[i][j] == D[i - 1][j - 1] + SCORE_MATCH_CONSECUTIVE)
|
||||
positions[i] = j
|
||||
j = j - 1
|
||||
break
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
local LinkedList = {}
|
||||
LinkedList.__index = LinkedList
|
||||
|
||||
@@ -27,7 +26,7 @@ end
|
||||
|
||||
local create_node = function(item)
|
||||
return {
|
||||
item = item
|
||||
item = item,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -122,7 +121,6 @@ function LinkedList:place_after(index, node, item)
|
||||
new_node.next.prev = new_node
|
||||
end
|
||||
|
||||
|
||||
if self.track_at then
|
||||
if index == self.track_at then
|
||||
self._tracked_node = new_node
|
||||
@@ -166,7 +164,6 @@ function LinkedList:place_before(index, node, item)
|
||||
new_node.next.prev = new_node
|
||||
end
|
||||
|
||||
|
||||
if self.track_at then
|
||||
if index == self.track_at - 1 then
|
||||
self._tracked_node = node
|
||||
@@ -176,7 +173,7 @@ function LinkedList:place_before(index, node, item)
|
||||
elseif final_size > self.track_at then
|
||||
self._tracked_node = self._tracked_node.prev
|
||||
else
|
||||
return
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
@@ -184,7 +181,6 @@ function LinkedList:place_before(index, node, item)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- Do you even do this in linked lists...?
|
||||
-- function LinkedList:remove(item)
|
||||
-- end
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
|
||||
local function min(a, b, c)
|
||||
local min_val = a
|
||||
|
||||
if b < min_val then min_val = b end
|
||||
if c < min_val then min_val = c end
|
||||
if b < min_val then
|
||||
min_val = b
|
||||
end
|
||||
if c < min_val then
|
||||
min_val = c
|
||||
end
|
||||
|
||||
return min_val
|
||||
|
||||
end
|
||||
|
||||
----------------------------------
|
||||
@@ -16,34 +18,35 @@ end
|
||||
-- @treturn number the levenshtein distance
|
||||
-- @within Metrics
|
||||
return function(s1, s2)
|
||||
if s1 == s2 then return 0 end
|
||||
if s1:len() == 0 then return s2:len() end
|
||||
if s2:len() == 0 then return s1:len() end
|
||||
if s1:len() < s2:len() then s1, s2 = s2, s1 end
|
||||
|
||||
local t = {}
|
||||
for i=1, #s1+1 do
|
||||
t[i] = {i-1}
|
||||
if s1 == s2 then
|
||||
return 0
|
||||
end
|
||||
if s1:len() == 0 then
|
||||
return s2:len()
|
||||
end
|
||||
if s2:len() == 0 then
|
||||
return s1:len()
|
||||
end
|
||||
if s1:len() < s2:len() then
|
||||
s1, s2 = s2, s1
|
||||
end
|
||||
|
||||
for i=1, #s2+1 do
|
||||
t[1][i] = i-1
|
||||
local t = {}
|
||||
for i = 1, #s1 + 1 do
|
||||
t[i] = { i - 1 }
|
||||
end
|
||||
|
||||
for i = 1, #s2 + 1 do
|
||||
t[1][i] = i - 1
|
||||
end
|
||||
|
||||
local cost
|
||||
for i=2, #s1+1 do
|
||||
|
||||
for j=2, #s2+1 do
|
||||
cost = (s1:sub(i-1,i-1) == s2:sub(j-1,j-1) and 0) or 1
|
||||
t[i][j] = min(
|
||||
t[i-1][j] + 1,
|
||||
t[i][j-1] + 1,
|
||||
t[i-1][j-1] + cost)
|
||||
for i = 2, #s1 + 1 do
|
||||
for j = 2, #s2 + 1 do
|
||||
cost = (s1:sub(i - 1, i - 1) == s2:sub(j - 1, j - 1) and 0) or 1
|
||||
t[i][j] = min(t[i - 1][j] + 1, t[i][j - 1] + 1, t[i - 1][j - 1] + cost)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
return t[#s1+1][#s2+1]
|
||||
|
||||
return t[#s1 + 1][#s2 + 1]
|
||||
end
|
||||
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
local actions = require('telescope.actions')
|
||||
local action_state = require('telescope.actions.state')
|
||||
local action_set = require('telescope.actions.set')
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local pickers = require('telescope.pickers')
|
||||
local previewers = require('telescope.previewers')
|
||||
local utils = require('telescope.utils')
|
||||
local conf = require('telescope.config').values
|
||||
local log = require('telescope.log')
|
||||
local actions = require "telescope.actions"
|
||||
local action_state = require "telescope.actions.state"
|
||||
local action_set = require "telescope.actions.set"
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local pickers = require "telescope.pickers"
|
||||
local previewers = require "telescope.previewers"
|
||||
local utils = require "telescope.utils"
|
||||
local conf = require("telescope.config").values
|
||||
local log = require "telescope.log"
|
||||
|
||||
local scan = require('plenary.scandir')
|
||||
local Path = require('plenary.path')
|
||||
local scan = require "plenary.scandir"
|
||||
local Path = require "plenary.path"
|
||||
local os_sep = Path.path.sep
|
||||
|
||||
local flatten = vim.tbl_flatten
|
||||
@@ -19,13 +19,19 @@ local filter = vim.tbl_filter
|
||||
local files = {}
|
||||
|
||||
local escape_chars = function(string)
|
||||
return string.gsub(string, "[%(|%)|\\|%[|%]|%-|%{%}|%?|%+|%*|%^|%$]", {
|
||||
["\\"] = "\\\\", ["-"] = "\\-",
|
||||
["("] = "\\(", [")"] = "\\)",
|
||||
["["] = "\\[", ["]"] = "\\]",
|
||||
["{"] = "\\{", ["}"] = "\\}",
|
||||
["?"] = "\\?", ["+"] = "\\+",
|
||||
["*"] = "\\*", ["^"] = "\\^",
|
||||
return string.gsub(string, "[%(|%)|\\|%[|%]|%-|%{%}|%?|%+|%*|%^|%$]", {
|
||||
["\\"] = "\\\\",
|
||||
["-"] = "\\-",
|
||||
["("] = "\\(",
|
||||
[")"] = "\\)",
|
||||
["["] = "\\[",
|
||||
["]"] = "\\]",
|
||||
["{"] = "\\{",
|
||||
["}"] = "\\}",
|
||||
["?"] = "\\?",
|
||||
["+"] = "\\+",
|
||||
["*"] = "\\*",
|
||||
["^"] = "\\^",
|
||||
["$"] = "\\$",
|
||||
})
|
||||
end
|
||||
@@ -42,11 +48,15 @@ files.live_grep = function(opts)
|
||||
local filelist = {}
|
||||
|
||||
if grep_open_files then
|
||||
local bufnrs = filter(function(b)
|
||||
if 1 ~= vim.fn.buflisted(b) then return false end
|
||||
local bufnrs = filter(function(b)
|
||||
if 1 ~= vim.fn.buflisted(b) then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end, vim.api.nvim_list_bufs())
|
||||
if not next(bufnrs) then return end
|
||||
if not next(bufnrs) then
|
||||
return
|
||||
end
|
||||
|
||||
for _, bufnr in ipairs(bufnrs) do
|
||||
local file = vim.api.nvim_buf_get_name(bufnr)
|
||||
@@ -59,35 +69,33 @@ files.live_grep = function(opts)
|
||||
end
|
||||
|
||||
local live_grepper = finders.new_job(function(prompt)
|
||||
-- TODO: Probably could add some options for smart case and whatever else rg offers.
|
||||
-- TODO: Probably could add some options for smart case and whatever else rg offers.
|
||||
|
||||
if not prompt or prompt == "" then
|
||||
return nil
|
||||
end
|
||||
if not prompt or prompt == "" then
|
||||
return nil
|
||||
end
|
||||
|
||||
prompt = escape_chars(prompt)
|
||||
prompt = escape_chars(prompt)
|
||||
|
||||
local search_list = {}
|
||||
local search_list = {}
|
||||
|
||||
if search_dirs then
|
||||
table.insert(search_list, search_dirs)
|
||||
else
|
||||
table.insert(search_list, '.')
|
||||
end
|
||||
if search_dirs then
|
||||
table.insert(search_list, search_dirs)
|
||||
else
|
||||
table.insert(search_list, ".")
|
||||
end
|
||||
|
||||
if grep_open_files then
|
||||
search_list = filelist
|
||||
end
|
||||
if grep_open_files then
|
||||
search_list = filelist
|
||||
end
|
||||
|
||||
return flatten { vimgrep_arguments, prompt, search_list }
|
||||
end,
|
||||
opts.entry_maker or make_entry.gen_from_vimgrep(opts),
|
||||
opts.max_results,
|
||||
opts.cwd
|
||||
)
|
||||
return flatten { vimgrep_arguments, prompt, search_list }
|
||||
end, opts.entry_maker or make_entry.gen_from_vimgrep(
|
||||
opts
|
||||
), opts.max_results, opts.cwd)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Live Grep',
|
||||
prompt_title = "Live Grep",
|
||||
finder = live_grepper,
|
||||
previewer = conf.grep_previewer(opts),
|
||||
sorter = conf.generic_sorter(opts),
|
||||
@@ -103,7 +111,7 @@ files.grep_string = function(opts)
|
||||
|
||||
local vimgrep_arguments = opts.vimgrep_arguments or conf.vimgrep_arguments
|
||||
local search_dirs = opts.search_dirs
|
||||
local word = opts.search or vim.fn.expand("<cword>")
|
||||
local word = opts.search or vim.fn.expand "<cword>"
|
||||
local search = opts.use_regex and word or escape_chars(word)
|
||||
local word_match = opts.word_match
|
||||
opts.entry_maker = opts.entry_maker or make_entry.gen_from_vimgrep(opts)
|
||||
@@ -119,11 +127,11 @@ files.grep_string = function(opts)
|
||||
table.insert(args, vim.fn.expand(path))
|
||||
end
|
||||
else
|
||||
table.insert(args, '.')
|
||||
table.insert(args, ".")
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Find Word',
|
||||
prompt_title = "Find Word",
|
||||
finder = finders.new_oneshot_job(args, opts),
|
||||
previewer = conf.grep_previewer(opts),
|
||||
sorter = conf.generic_sorter(opts),
|
||||
@@ -139,71 +147,87 @@ files.find_files = function(opts)
|
||||
local search_dirs = opts.search_dirs
|
||||
|
||||
if search_dirs then
|
||||
for k,v in pairs(search_dirs) do
|
||||
for k, v in pairs(search_dirs) do
|
||||
search_dirs[k] = vim.fn.expand(v)
|
||||
end
|
||||
end
|
||||
|
||||
if not find_command then
|
||||
if 1 == vim.fn.executable("fd") then
|
||||
find_command = { 'fd', '--type', 'f' }
|
||||
if hidden then table.insert(find_command, '--hidden') end
|
||||
if follow then table.insert(find_command, '-L') end
|
||||
if 1 == vim.fn.executable "fd" then
|
||||
find_command = { "fd", "--type", "f" }
|
||||
if hidden then
|
||||
table.insert(find_command, "--hidden")
|
||||
end
|
||||
if follow then
|
||||
table.insert(find_command, "-L")
|
||||
end
|
||||
if search_dirs then
|
||||
table.insert(find_command, '.')
|
||||
for _,v in pairs(search_dirs) do
|
||||
table.insert(find_command, ".")
|
||||
for _, v in pairs(search_dirs) do
|
||||
table.insert(find_command, v)
|
||||
end
|
||||
end
|
||||
elseif 1 == vim.fn.executable("fdfind") then
|
||||
find_command = { 'fdfind', '--type', 'f' }
|
||||
if hidden then table.insert(find_command, '--hidden') end
|
||||
if follow then table.insert(find_command, '-L') end
|
||||
elseif 1 == vim.fn.executable "fdfind" then
|
||||
find_command = { "fdfind", "--type", "f" }
|
||||
if hidden then
|
||||
table.insert(find_command, "--hidden")
|
||||
end
|
||||
if follow then
|
||||
table.insert(find_command, "-L")
|
||||
end
|
||||
if search_dirs then
|
||||
table.insert(find_command, '.')
|
||||
for _,v in pairs(search_dirs) do
|
||||
table.insert(find_command, ".")
|
||||
for _, v in pairs(search_dirs) do
|
||||
table.insert(find_command, v)
|
||||
end
|
||||
end
|
||||
elseif 1 == vim.fn.executable("rg") then
|
||||
find_command = { 'rg', '--files' }
|
||||
if hidden then table.insert(find_command, '--hidden') end
|
||||
if follow then table.insert(find_command, '-L') end
|
||||
elseif 1 == vim.fn.executable "rg" then
|
||||
find_command = { "rg", "--files" }
|
||||
if hidden then
|
||||
table.insert(find_command, "--hidden")
|
||||
end
|
||||
if follow then
|
||||
table.insert(find_command, "-L")
|
||||
end
|
||||
if search_dirs then
|
||||
for _,v in pairs(search_dirs) do
|
||||
for _, v in pairs(search_dirs) do
|
||||
table.insert(find_command, v)
|
||||
end
|
||||
end
|
||||
elseif 1 == vim.fn.executable("find") and vim.fn.has('win32') == 0 then
|
||||
find_command = { 'find', '.', '-type', 'f' }
|
||||
elseif 1 == vim.fn.executable "find" and vim.fn.has "win32" == 0 then
|
||||
find_command = { "find", ".", "-type", "f" }
|
||||
if not hidden then
|
||||
table.insert(find_command, { '-not', '-path', "*/.*" })
|
||||
table.insert(find_command, { "-not", "-path", "*/.*" })
|
||||
find_command = flatten(find_command)
|
||||
end
|
||||
if follow then table.insert(find_command, '-L') end
|
||||
if follow then
|
||||
table.insert(find_command, "-L")
|
||||
end
|
||||
if search_dirs then
|
||||
table.remove(find_command, 2)
|
||||
for _,v in pairs(search_dirs) do
|
||||
for _, v in pairs(search_dirs) do
|
||||
table.insert(find_command, 2, v)
|
||||
end
|
||||
end
|
||||
elseif 1 == vim.fn.executable("where") then
|
||||
find_command = { 'where', '/r', '.', '*'}
|
||||
elseif 1 == vim.fn.executable "where" then
|
||||
find_command = { "where", "/r", ".", "*" }
|
||||
if hidden ~= nil then
|
||||
log.warn('The `hidden` key is not available for the Windows `where` command in `find_files`.')
|
||||
log.warn "The `hidden` key is not available for the Windows `where` command in `find_files`."
|
||||
end
|
||||
if follow ~= nil then
|
||||
log.warn('The `follow` key is not available for the Windows `where` command in `find_files`.')
|
||||
log.warn "The `follow` key is not available for the Windows `where` command in `find_files`."
|
||||
end
|
||||
if search_dirs ~= nil then
|
||||
log.warn('The `search_dirs` key is not available for the Windows `where` command in `find_files`.')
|
||||
log.warn "The `search_dirs` key is not available for the Windows `where` command in `find_files`."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if not find_command then
|
||||
print("You need to install either find, fd, or rg. " ..
|
||||
"You can also submit a PR to add support for another file finder :)")
|
||||
print(
|
||||
"You need to install either find, fd, or rg. "
|
||||
.. "You can also submit a PR to add support for another file finder :)"
|
||||
)
|
||||
return
|
||||
end
|
||||
|
||||
@@ -214,11 +238,8 @@ files.find_files = function(opts)
|
||||
opts.entry_maker = opts.entry_maker or make_entry.gen_from_file(opts)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Find Files',
|
||||
finder = finders.new_oneshot_job(
|
||||
find_command,
|
||||
opts
|
||||
),
|
||||
prompt_title = "Find Files",
|
||||
finder = finders.new_oneshot_job(find_command, opts),
|
||||
previewer = conf.file_previewer(opts),
|
||||
sorter = conf.file_sorter(opts),
|
||||
}):find()
|
||||
@@ -228,11 +249,11 @@ local function prepare_match(entry, kind)
|
||||
local entries = {}
|
||||
|
||||
if entry.node then
|
||||
entry["kind"] = kind
|
||||
table.insert(entries, entry)
|
||||
entry["kind"] = kind
|
||||
table.insert(entries, entry)
|
||||
else
|
||||
for name, item in pairs(entry) do
|
||||
vim.list_extend(entries, prepare_match(item, name))
|
||||
vim.list_extend(entries, prepare_match(item, name))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -248,71 +269,76 @@ files.file_browser = function(opts)
|
||||
|
||||
opts.depth = opts.depth or 1
|
||||
opts.cwd = opts.cwd and vim.fn.expand(opts.cwd) or vim.loop.cwd()
|
||||
opts.new_finder = opts.new_finder or function(path)
|
||||
opts.cwd = path
|
||||
local data = {}
|
||||
opts.new_finder = opts.new_finder
|
||||
or function(path)
|
||||
opts.cwd = path
|
||||
local data = {}
|
||||
|
||||
scan.scan_dir(path, {
|
||||
hidden = opts.hidden or false,
|
||||
add_dirs = true,
|
||||
depth = opts.depth,
|
||||
on_insert = function(entry, typ)
|
||||
table.insert(data, typ == 'directory' and (entry .. os_sep) or entry)
|
||||
end
|
||||
})
|
||||
table.insert(data, 1, '..' .. os_sep)
|
||||
scan.scan_dir(path, {
|
||||
hidden = opts.hidden or false,
|
||||
add_dirs = true,
|
||||
depth = opts.depth,
|
||||
on_insert = function(entry, typ)
|
||||
table.insert(data, typ == "directory" and (entry .. os_sep) or entry)
|
||||
end,
|
||||
})
|
||||
table.insert(data, 1, ".." .. os_sep)
|
||||
|
||||
local maker = function()
|
||||
local mt = {}
|
||||
mt.cwd = opts.cwd
|
||||
mt.display = function(entry)
|
||||
local hl_group
|
||||
local display = utils.transform_path(opts, entry.value)
|
||||
if is_dir(entry.value) then
|
||||
display = display .. os_sep
|
||||
if not opts.disable_devicons then
|
||||
display = (opts.dir_icon or "") .. " " .. display
|
||||
hl_group = "Default"
|
||||
local maker = function()
|
||||
local mt = {}
|
||||
mt.cwd = opts.cwd
|
||||
mt.display = function(entry)
|
||||
local hl_group
|
||||
local display = utils.transform_path(opts, entry.value)
|
||||
if is_dir(entry.value) then
|
||||
display = display .. os_sep
|
||||
if not opts.disable_devicons then
|
||||
display = (opts.dir_icon or "") .. " " .. display
|
||||
hl_group = "Default"
|
||||
end
|
||||
else
|
||||
display, hl_group = utils.transform_devicons(entry.value, display, opts.disable_devicons)
|
||||
end
|
||||
else
|
||||
display, hl_group = utils.transform_devicons(entry.value, display, opts.disable_devicons)
|
||||
end
|
||||
|
||||
if hl_group then
|
||||
return display, { { {1, 3}, hl_group } }
|
||||
else
|
||||
return display
|
||||
end
|
||||
end
|
||||
|
||||
mt.__index = function(t, k)
|
||||
local raw = rawget(mt, k)
|
||||
if raw then return raw end
|
||||
|
||||
if k == "path" then
|
||||
local retpath = Path:new({t.cwd, t.value}):absolute()
|
||||
if not vim.loop.fs_access(retpath, "R", nil) then
|
||||
retpath = t.value
|
||||
if hl_group then
|
||||
return display, { { { 1, 3 }, hl_group } }
|
||||
else
|
||||
return display
|
||||
end
|
||||
if is_dir(t.value) then retpath = retpath .. os_sep end
|
||||
return retpath
|
||||
end
|
||||
|
||||
return rawget(t, rawget({ value = 1 }, k))
|
||||
mt.__index = function(t, k)
|
||||
local raw = rawget(mt, k)
|
||||
if raw then
|
||||
return raw
|
||||
end
|
||||
|
||||
if k == "path" then
|
||||
local retpath = Path:new({ t.cwd, t.value }):absolute()
|
||||
if not vim.loop.fs_access(retpath, "R", nil) then
|
||||
retpath = t.value
|
||||
end
|
||||
if is_dir(t.value) then
|
||||
retpath = retpath .. os_sep
|
||||
end
|
||||
return retpath
|
||||
end
|
||||
|
||||
return rawget(t, rawget({ value = 1 }, k))
|
||||
end
|
||||
|
||||
return function(line)
|
||||
local tbl = { line }
|
||||
tbl.ordinal = Path:new(line):make_relative(opts.cwd)
|
||||
return setmetatable(tbl, mt)
|
||||
end
|
||||
end
|
||||
|
||||
return function(line)
|
||||
local tbl = {line}
|
||||
tbl.ordinal = Path:new(line):make_relative(opts.cwd)
|
||||
return setmetatable(tbl, mt)
|
||||
end
|
||||
return finders.new_table { results = data, entry_maker = maker() }
|
||||
end
|
||||
|
||||
return finders.new_table { results = data, entry_maker = maker() }
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'File Browser',
|
||||
prompt_title = "File Browser",
|
||||
finder = opts.new_finder(opts.cwd),
|
||||
previewer = conf.file_previewer(opts),
|
||||
sorter = conf.file_sorter(opts),
|
||||
@@ -330,28 +356,38 @@ files.file_browser = function(opts)
|
||||
local current_picker = action_state.get_current_picker(prompt_bufnr)
|
||||
local file = action_state.get_current_line()
|
||||
if file == "" then
|
||||
print('To create a new file or directory(add ' .. os_sep .. ' at the end of file) ' ..
|
||||
'write the desired new into the prompt and press <C-e>. ' ..
|
||||
'It works for not existing nested input as well.' ..
|
||||
'Example: this' .. os_sep .. 'is' .. os_sep .. 'a' .. os_sep .. 'new_file.lua')
|
||||
print(
|
||||
"To create a new file or directory(add "
|
||||
.. os_sep
|
||||
.. " at the end of file) "
|
||||
.. "write the desired new into the prompt and press <C-e>. "
|
||||
.. "It works for not existing nested input as well."
|
||||
.. "Example: this"
|
||||
.. os_sep
|
||||
.. "is"
|
||||
.. os_sep
|
||||
.. "a"
|
||||
.. os_sep
|
||||
.. "new_file.lua"
|
||||
)
|
||||
return
|
||||
end
|
||||
|
||||
local fpath = current_picker.cwd .. os_sep .. file
|
||||
if not is_dir(fpath) then
|
||||
actions.close(prompt_bufnr)
|
||||
Path:new(fpath):touch({ parents = true })
|
||||
vim.cmd(string.format(':e %s', fpath))
|
||||
Path:new(fpath):touch { parents = true }
|
||||
vim.cmd(string.format(":e %s", fpath))
|
||||
else
|
||||
Path:new(fpath:sub(1, -2)):mkdir({ parents = true })
|
||||
Path:new(fpath:sub(1, -2)):mkdir { parents = true }
|
||||
local new_cwd = vim.fn.expand(fpath)
|
||||
current_picker.cwd = new_cwd
|
||||
current_picker:refresh(opts.new_finder(new_cwd), { reset_prompt = true })
|
||||
end
|
||||
end
|
||||
|
||||
map('i', '<C-e>', create_new_file)
|
||||
map('n', '<C-e>', create_new_file)
|
||||
map("i", "<C-e>", create_new_file)
|
||||
map("n", "<C-e>", create_new_file)
|
||||
return true
|
||||
end,
|
||||
}):find()
|
||||
@@ -361,19 +397,19 @@ end
|
||||
files.treesitter = function(opts)
|
||||
opts.show_line = utils.get_default(opts.show_line, true)
|
||||
|
||||
local has_nvim_treesitter, _ = pcall(require, 'nvim-treesitter')
|
||||
local has_nvim_treesitter, _ = pcall(require, "nvim-treesitter")
|
||||
if not has_nvim_treesitter then
|
||||
print('You need to install nvim-treesitter')
|
||||
print "You need to install nvim-treesitter"
|
||||
return
|
||||
end
|
||||
|
||||
local parsers = require('nvim-treesitter.parsers')
|
||||
local parsers = require "nvim-treesitter.parsers"
|
||||
if not parsers.has_parser() then
|
||||
print('No parser for the current buffer')
|
||||
print "No parser for the current buffer"
|
||||
return
|
||||
end
|
||||
|
||||
local ts_locals = require('nvim-treesitter.locals')
|
||||
local ts_locals = require "nvim-treesitter.locals"
|
||||
local bufnr = opts.bufnr or vim.api.nvim_get_current_buf()
|
||||
|
||||
local results = {}
|
||||
@@ -389,16 +425,16 @@ files.treesitter = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Treesitter Symbols',
|
||||
finder = finders.new_table {
|
||||
prompt_title = "Treesitter Symbols",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_treesitter(opts)
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_treesitter(opts),
|
||||
},
|
||||
previewer = conf.grep_previewer(opts),
|
||||
sorter = conf.prefilter_sorter{
|
||||
sorter = conf.prefilter_sorter {
|
||||
tag = "kind",
|
||||
sorter = conf.generic_sorter(opts)
|
||||
}
|
||||
sorter = conf.generic_sorter(opts),
|
||||
},
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -420,7 +456,7 @@ files.current_buffer_fuzzy_find = function(opts)
|
||||
})
|
||||
end
|
||||
|
||||
local ts_ok, ts_parsers = pcall(require, 'nvim-treesitter.parsers')
|
||||
local ts_ok, ts_parsers = pcall(require, "nvim-treesitter.parsers")
|
||||
if ts_ok then
|
||||
filetype = ts_parsers.ft_to_lang(filetype)
|
||||
end
|
||||
@@ -454,7 +490,7 @@ files.current_buffer_fuzzy_find = function(opts)
|
||||
else
|
||||
local row = row1 + 1
|
||||
for index = col1, #lines[row] do
|
||||
line_highlights[row][index] = hl
|
||||
line_highlights[row][index] = hl
|
||||
end
|
||||
|
||||
while row < row2 + 1 do
|
||||
@@ -472,7 +508,7 @@ files.current_buffer_fuzzy_find = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Current Buffer Fuzzy',
|
||||
prompt_title = "Current Buffer Fuzzy",
|
||||
finder = finders.new_table {
|
||||
results = lines_with_numbers,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_buffer_lines(opts),
|
||||
@@ -488,15 +524,15 @@ files.current_buffer_fuzzy_find = function(opts)
|
||||
}
|
||||
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
files.tags = function(opts)
|
||||
local ctags_file = opts.ctags_file or 'tags'
|
||||
local ctags_file = opts.ctags_file or "tags"
|
||||
|
||||
if not vim.loop.fs_open(vim.fn.expand(ctags_file, true), "r", 438) then
|
||||
print('Tags file does not exists. Create one with ctags -R')
|
||||
print "Tags file does not exists. Create one with ctags -R"
|
||||
return
|
||||
end
|
||||
|
||||
@@ -505,10 +541,10 @@ files.tags = function(opts)
|
||||
local data = assert(vim.loop.fs_read(fd, stat.size, 0))
|
||||
assert(vim.loop.fs_close(fd))
|
||||
|
||||
local results = vim.split(data, '\n')
|
||||
local results = vim.split(data, "\n")
|
||||
|
||||
pickers.new(opts,{
|
||||
prompt_title = 'Tags',
|
||||
pickers.new(opts, {
|
||||
prompt_title = "Tags",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_ctags(opts),
|
||||
@@ -521,29 +557,29 @@ files.tags = function(opts)
|
||||
local selection = action_state.get_selected_entry()
|
||||
|
||||
if selection.scode then
|
||||
local scode = string.gsub(selection.scode, '[$]$', '')
|
||||
local scode = string.gsub(selection.scode, "[$]$", "")
|
||||
scode = string.gsub(scode, [[\\]], [[\]])
|
||||
scode = string.gsub(scode, [[\/]], [[/]])
|
||||
scode = string.gsub(scode, '[*]', [[\*]])
|
||||
scode = string.gsub(scode, "[*]", [[\*]])
|
||||
|
||||
vim.cmd('norm! gg')
|
||||
vim.cmd "norm! gg"
|
||||
vim.fn.search(scode)
|
||||
vim.cmd('norm! zz')
|
||||
vim.cmd "norm! zz"
|
||||
else
|
||||
vim.api.nvim_win_set_cursor(0, {selection.lnum, 0})
|
||||
vim.api.nvim_win_set_cursor(0, { selection.lnum, 0 })
|
||||
end
|
||||
end,
|
||||
}
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
files.current_buffer_tags = function(opts)
|
||||
return files.tags(vim.tbl_extend("force", {
|
||||
prompt_title = 'Current Buffer Tags',
|
||||
prompt_title = "Current Buffer Tags",
|
||||
only_current_file = true,
|
||||
path_display = 'hidden',
|
||||
path_display = "hidden",
|
||||
}, opts))
|
||||
end
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
local actions = require('telescope.actions')
|
||||
local action_state = require('telescope.actions.state')
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local pickers = require('telescope.pickers')
|
||||
local previewers = require('telescope.previewers')
|
||||
local utils = require('telescope.utils')
|
||||
local entry_display = require('telescope.pickers.entry_display')
|
||||
local strings = require('plenary.strings')
|
||||
local Path = require('plenary.path')
|
||||
local actions = require "telescope.actions"
|
||||
local action_state = require "telescope.actions.state"
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local pickers = require "telescope.pickers"
|
||||
local previewers = require "telescope.previewers"
|
||||
local utils = require "telescope.utils"
|
||||
local entry_display = require "telescope.pickers.entry_display"
|
||||
local strings = require "plenary.strings"
|
||||
local Path = require "plenary.path"
|
||||
|
||||
local conf = require('telescope.config').values
|
||||
local conf = require("telescope.config").values
|
||||
|
||||
local git = {}
|
||||
|
||||
@@ -17,7 +17,7 @@ git.files = function(opts)
|
||||
local show_untracked = utils.get_default(opts.show_untracked, true)
|
||||
local recurse_submodules = utils.get_default(opts.recurse_submodules, false)
|
||||
if show_untracked and recurse_submodules then
|
||||
error("Git does not support both --others and --recurse-submodules")
|
||||
error "Git does not support both --others and --recurse-submodules"
|
||||
end
|
||||
|
||||
-- By creating the entry maker after the cwd options,
|
||||
@@ -25,13 +25,16 @@ git.files = function(opts)
|
||||
opts.entry_maker = opts.entry_maker or make_entry.gen_from_file(opts)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Git Files',
|
||||
prompt_title = "Git Files",
|
||||
finder = finders.new_oneshot_job(
|
||||
vim.tbl_flatten( {
|
||||
"git", "ls-files", "--exclude-standard", "--cached",
|
||||
vim.tbl_flatten {
|
||||
"git",
|
||||
"ls-files",
|
||||
"--exclude-standard",
|
||||
"--cached",
|
||||
show_untracked and "--others" or nil,
|
||||
recurse_submodules and "--recurse-submodules" or nil
|
||||
} ),
|
||||
recurse_submodules and "--recurse-submodules" or nil,
|
||||
},
|
||||
opts
|
||||
),
|
||||
previewer = conf.file_previewer(opts),
|
||||
@@ -41,11 +44,16 @@ end
|
||||
|
||||
git.commits = function(opts)
|
||||
local results = utils.get_os_command_output({
|
||||
'git', 'log', '--pretty=oneline', '--abbrev-commit', '--', '.'
|
||||
"git",
|
||||
"log",
|
||||
"--pretty=oneline",
|
||||
"--abbrev-commit",
|
||||
"--",
|
||||
".",
|
||||
}, opts.cwd)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Git Commits',
|
||||
prompt_title = "Git Commits",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_git_commits(opts),
|
||||
@@ -60,17 +68,20 @@ git.commits = function(opts)
|
||||
attach_mappings = function()
|
||||
actions.select_default:replace(actions.git_checkout)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
git.stash = function(opts)
|
||||
local results = utils.get_os_command_output({
|
||||
'git', '--no-pager', 'stash', 'list',
|
||||
"git",
|
||||
"--no-pager",
|
||||
"stash",
|
||||
"list",
|
||||
}, opts.cwd)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Git Stash',
|
||||
prompt_title = "Git Stash",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_git_stash(),
|
||||
@@ -80,7 +91,7 @@ git.stash = function(opts)
|
||||
attach_mappings = function()
|
||||
actions.select_default:replace(actions.git_apply_stash)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -90,14 +101,18 @@ local get_current_buf_line = function(winnr)
|
||||
end
|
||||
|
||||
git.bcommits = function(opts)
|
||||
opts.current_line = (not opts.current_file) and get_current_buf_line(0) or nil
|
||||
opts.current_file = opts.current_file or vim.fn.expand('%')
|
||||
opts.current_line = not opts.current_file and get_current_buf_line(0) or nil
|
||||
opts.current_file = opts.current_file or vim.fn.expand "%"
|
||||
local results = utils.get_os_command_output({
|
||||
'git', 'log', '--pretty=oneline', '--abbrev-commit', opts.current_file
|
||||
"git",
|
||||
"log",
|
||||
"--pretty=oneline",
|
||||
"--abbrev-commit",
|
||||
opts.current_file,
|
||||
}, opts.cwd)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Git BCommits',
|
||||
prompt_title = "Git BCommits",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_git_commits(opts),
|
||||
@@ -112,64 +127,67 @@ git.bcommits = function(opts)
|
||||
attach_mappings = function()
|
||||
actions.select_default:replace(actions.git_checkout_current_buffer)
|
||||
local transfrom_file = function()
|
||||
return opts.current_file and Path:new(opts.current_file):make_relative(opts.cwd) or ''
|
||||
return opts.current_file and Path:new(opts.current_file):make_relative(opts.cwd) or ""
|
||||
end
|
||||
|
||||
local get_buffer_of_orig = function(selection)
|
||||
local value = selection.value .. ':' .. transfrom_file()
|
||||
local content = utils.get_os_command_output({ 'git', '--no-pager', 'show', value }, opts.cwd)
|
||||
local value = selection.value .. ":" .. transfrom_file()
|
||||
local content = utils.get_os_command_output({ "git", "--no-pager", "show", value }, opts.cwd)
|
||||
|
||||
local bufnr = vim.api.nvim_create_buf(false, true)
|
||||
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, content)
|
||||
vim.api.nvim_buf_set_name(bufnr, 'Original')
|
||||
vim.api.nvim_buf_set_name(bufnr, "Original")
|
||||
return bufnr
|
||||
end
|
||||
|
||||
local vimdiff = function(selection, command)
|
||||
local ft = vim.bo.filetype
|
||||
vim.cmd("diffthis")
|
||||
vim.cmd "diffthis"
|
||||
|
||||
local bufnr = get_buffer_of_orig(selection)
|
||||
vim.cmd(string.format("%s %s", command, bufnr))
|
||||
vim.bo.filetype = ft
|
||||
vim.cmd("diffthis")
|
||||
vim.cmd "diffthis"
|
||||
|
||||
vim.cmd(string.format(
|
||||
"autocmd WinClosed <buffer=%s> ++nested ++once :lua vim.api.nvim_buf_delete(%s, { force = true })",
|
||||
bufnr,
|
||||
bufnr))
|
||||
vim.cmd(
|
||||
string.format(
|
||||
"autocmd WinClosed <buffer=%s> ++nested ++once :lua vim.api.nvim_buf_delete(%s, { force = true })",
|
||||
bufnr,
|
||||
bufnr
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
actions.select_vertical:replace(function(prompt_bufnr)
|
||||
actions.close(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
vimdiff(selection, 'leftabove vert sbuffer')
|
||||
vimdiff(selection, "leftabove vert sbuffer")
|
||||
end)
|
||||
|
||||
actions.select_horizontal:replace(function(prompt_bufnr)
|
||||
actions.close(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
vimdiff(selection, 'belowright sbuffer')
|
||||
vimdiff(selection, "belowright sbuffer")
|
||||
end)
|
||||
|
||||
actions.select_tab:replace(function(prompt_bufnr)
|
||||
actions.close(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
vim.cmd('tabedit ' .. transfrom_file())
|
||||
vimdiff(selection, 'leftabove vert sbuffer')
|
||||
vim.cmd("tabedit " .. transfrom_file())
|
||||
vimdiff(selection, "leftabove vert sbuffer")
|
||||
end)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
git.branches = function(opts)
|
||||
local format = '%(HEAD)'
|
||||
.. '%(refname)'
|
||||
.. '%(authorname)'
|
||||
.. '%(upstream:lstrip=2)'
|
||||
.. '%(committerdate:format-local:%Y/%m/%d%H:%M:%S)'
|
||||
local output = utils.get_os_command_output({ 'git', 'for-each-ref', '--perl', '--format', format }, opts.cwd)
|
||||
local format = "%(HEAD)"
|
||||
.. "%(refname)"
|
||||
.. "%(authorname)"
|
||||
.. "%(upstream:lstrip=2)"
|
||||
.. "%(committerdate:format-local:%Y/%m/%d%H:%M:%S)"
|
||||
local output = utils.get_os_command_output({ "git", "for-each-ref", "--perl", "--format", format }, opts.cwd)
|
||||
|
||||
local results = {}
|
||||
local widths = {
|
||||
@@ -179,7 +197,7 @@ git.branches = function(opts)
|
||||
committerdate = 0,
|
||||
}
|
||||
local unescape_single_quote = function(v)
|
||||
return string.gsub(v, "\\([\\'])", "%1")
|
||||
return string.gsub(v, "\\([\\'])", "%1")
|
||||
end
|
||||
local parse_line = function(line)
|
||||
local fields = vim.split(string.sub(line, 2, -2), "''", true)
|
||||
@@ -191,21 +209,21 @@ git.branches = function(opts)
|
||||
committerdate = fields[5],
|
||||
}
|
||||
local prefix
|
||||
if vim.startswith(entry.refname, 'refs/remotes/') then
|
||||
prefix = 'refs/remotes/'
|
||||
elseif vim.startswith(entry.refname, 'refs/heads/') then
|
||||
prefix = 'refs/heads/'
|
||||
if vim.startswith(entry.refname, "refs/remotes/") then
|
||||
prefix = "refs/remotes/"
|
||||
elseif vim.startswith(entry.refname, "refs/heads/") then
|
||||
prefix = "refs/heads/"
|
||||
else
|
||||
return
|
||||
end
|
||||
local index = 1
|
||||
if entry.head ~= '*' then
|
||||
if entry.head ~= "*" then
|
||||
index = #results + 1
|
||||
end
|
||||
|
||||
entry.name = string.sub(entry.refname, string.len(prefix)+1)
|
||||
entry.name = string.sub(entry.refname, string.len(prefix) + 1)
|
||||
for key, value in pairs(widths) do
|
||||
widths[key] = math.max(value, strings.strdisplaywidth(entry[key] or ''))
|
||||
widths[key] = math.max(value, strings.strdisplaywidth(entry[key] or ""))
|
||||
end
|
||||
if string.len(entry.upstream) > 0 then
|
||||
widths.upstream_indicator = 2
|
||||
@@ -228,22 +246,22 @@ git.branches = function(opts)
|
||||
{ width = widths.upstream_indicator },
|
||||
{ width = widths.upstream },
|
||||
{ width = widths.committerdate },
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
local make_display = function(entry)
|
||||
return displayer {
|
||||
{entry.head},
|
||||
{entry.name, 'TelescopeResultsIdentifier'},
|
||||
{entry.authorname},
|
||||
{string.len(entry.upstream) > 0 and '=>' or ''},
|
||||
{entry.upstream, 'TelescopeResultsIdentifier'},
|
||||
{entry.committerdate}
|
||||
{ entry.head },
|
||||
{ entry.name, "TelescopeResultsIdentifier" },
|
||||
{ entry.authorname },
|
||||
{ string.len(entry.upstream) > 0 and "=>" or "" },
|
||||
{ entry.upstream, "TelescopeResultsIdentifier" },
|
||||
{ entry.committerdate },
|
||||
}
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Git Branches',
|
||||
prompt_title = "Git Branches",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = function(entry)
|
||||
@@ -251,58 +269,60 @@ git.branches = function(opts)
|
||||
entry.ordinal = entry.name
|
||||
entry.display = make_display
|
||||
return entry
|
||||
end
|
||||
end,
|
||||
},
|
||||
previewer = previewers.git_branch_log.new(opts),
|
||||
sorter = conf.file_sorter(opts),
|
||||
attach_mappings = function(_, map)
|
||||
actions.select_default:replace(actions.git_checkout)
|
||||
map('i', '<c-t>', actions.git_track_branch)
|
||||
map('n', '<c-t>', actions.git_track_branch)
|
||||
map("i", "<c-t>", actions.git_track_branch)
|
||||
map("n", "<c-t>", actions.git_track_branch)
|
||||
|
||||
map('i', '<c-r>', actions.git_rebase_branch)
|
||||
map('n', '<c-r>', actions.git_rebase_branch)
|
||||
map("i", "<c-r>", actions.git_rebase_branch)
|
||||
map("n", "<c-r>", actions.git_rebase_branch)
|
||||
|
||||
map('i', '<c-a>', actions.git_create_branch)
|
||||
map('n', '<c-a>', actions.git_create_branch)
|
||||
map("i", "<c-a>", actions.git_create_branch)
|
||||
map("n", "<c-a>", actions.git_create_branch)
|
||||
|
||||
map('i', '<c-s>', actions.git_switch_branch)
|
||||
map('n', '<c-s>', actions.git_switch_branch)
|
||||
map("i", "<c-s>", actions.git_switch_branch)
|
||||
map("n", "<c-s>", actions.git_switch_branch)
|
||||
|
||||
map('i', '<c-d>', actions.git_delete_branch)
|
||||
map('n', '<c-d>', actions.git_delete_branch)
|
||||
map("i", "<c-d>", actions.git_delete_branch)
|
||||
map("n", "<c-d>", actions.git_delete_branch)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
git.status = function(opts)
|
||||
local gen_new_finder = function()
|
||||
local expand_dir = utils.if_nil(opts.expand_dir, true, opts.expand_dir)
|
||||
local git_cmd = {'git', 'status', '-s', '--', '.'}
|
||||
local git_cmd = { "git", "status", "-s", "--", "." }
|
||||
|
||||
if expand_dir then
|
||||
table.insert(git_cmd, table.getn(git_cmd) - 1, '-u')
|
||||
table.insert(git_cmd, table.getn(git_cmd) - 1, "-u")
|
||||
end
|
||||
|
||||
local output = utils.get_os_command_output(git_cmd, opts.cwd)
|
||||
|
||||
if table.getn(output) == 0 then
|
||||
print('No changes found')
|
||||
print "No changes found"
|
||||
return
|
||||
end
|
||||
|
||||
return finders.new_table {
|
||||
results = output,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_git_status(opts)
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_git_status(opts),
|
||||
}
|
||||
end
|
||||
|
||||
local initial_finder = gen_new_finder()
|
||||
if not initial_finder then return end
|
||||
if not initial_finder then
|
||||
return
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Git Status',
|
||||
prompt_title = "Git Status",
|
||||
finder = initial_finder,
|
||||
previewer = previewers.git_file_diff.new(opts),
|
||||
sorter = conf.file_sorter(opts),
|
||||
@@ -313,10 +333,10 @@ git.status = function(opts)
|
||||
end,
|
||||
}
|
||||
|
||||
map('i', '<tab>', actions.git_staging_toggle)
|
||||
map('n', '<tab>', actions.git_staging_toggle)
|
||||
map("i", "<tab>", actions.git_staging_toggle)
|
||||
map("n", "<tab>", actions.git_staging_toggle)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -334,7 +354,7 @@ local set_opts_cwd = function(opts)
|
||||
if ret ~= 0 then
|
||||
local output = utils.get_os_command_output({ "git", "rev-parse", "--is-inside-work-tree" }, opts.cwd)
|
||||
if output[1] ~= "true" then
|
||||
error(opts.cwd .. ' is not a git directory')
|
||||
error(opts.cwd .. " is not a git directory")
|
||||
end
|
||||
else
|
||||
if use_git_root then
|
||||
|
||||
@@ -52,9 +52,9 @@
|
||||
--- This will use the default configuration options. Other configuration options are still in flux at the moment
|
||||
---@brief ]]
|
||||
|
||||
if 1 ~= vim.fn.has('nvim-0.5') then
|
||||
vim.api.nvim_err_writeln("This plugins requires neovim 0.5")
|
||||
vim.api.nvim_err_writeln("Please update your neovim.")
|
||||
if 1 ~= vim.fn.has "nvim-0.5" then
|
||||
vim.api.nvim_err_writeln "This plugins requires neovim 0.5"
|
||||
vim.api.nvim_err_writeln "Please update your neovim."
|
||||
return
|
||||
end
|
||||
|
||||
@@ -70,14 +70,14 @@ local builtin = {}
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field grep_open_files boolean: if true, restrict search to open files only, mutually exclusive with `search_dirs`
|
||||
---@field search_dirs table: directory/directories to search in, mutually exclusive with `grep_open_files`
|
||||
builtin.live_grep = require('telescope.builtin.files').live_grep
|
||||
builtin.live_grep = require("telescope.builtin.files").live_grep
|
||||
|
||||
--- Searches for the string under your cursor in your current working directory
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field search string: the query to search
|
||||
---@field search_dirs table: directory/directories to search in
|
||||
---@field use_regex boolean: if true, special characters won't be escaped, allows for using regex (default is false)
|
||||
builtin.grep_string = require('telescope.builtin.files').grep_string
|
||||
builtin.grep_string = require("telescope.builtin.files").grep_string
|
||||
|
||||
--- Lists files in your current working directory, respects .gitignore
|
||||
---@param opts table: options to pass to the picker
|
||||
@@ -85,7 +85,7 @@ builtin.grep_string = require('telescope.builtin.files').grep_string
|
||||
---@field follow boolean: if true, follows symlinks (i.e. uses `-L` flag for the `find` command)
|
||||
---@field hidden boolean: determines whether to show hidden files or not (default is false)
|
||||
---@field search_dirs table: directory/directories to search in
|
||||
builtin.find_files = require('telescope.builtin.files').find_files
|
||||
builtin.find_files = require("telescope.builtin.files").find_files
|
||||
|
||||
--- This is an alias for the `find_files` picker
|
||||
builtin.fd = builtin.find_files
|
||||
@@ -102,28 +102,28 @@ builtin.fd = builtin.find_files
|
||||
---@field cwd string: directory path to browse (default is cwd)
|
||||
---@field depth number: file tree depth to display (default is 1)
|
||||
---@field dir_icon string: change the icon for a directory. default:
|
||||
builtin.file_browser = require('telescope.builtin.files').file_browser
|
||||
builtin.file_browser = require("telescope.builtin.files").file_browser
|
||||
|
||||
--- Lists function names, variables, and other symbols from treesitter queries
|
||||
--- - Default keymaps:
|
||||
--- - `<C-l>`: show autocompletion menu to prefilter your query by kind of ts node you want to see (i.e. `:var:`)
|
||||
---@field show_line boolean: if true, shows the row:column that the result is found at (default is true)
|
||||
builtin.treesitter = require('telescope.builtin.files').treesitter
|
||||
builtin.treesitter = require("telescope.builtin.files").treesitter
|
||||
|
||||
--- Live fuzzy search inside of the currently open buffer
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.current_buffer_fuzzy_find = require('telescope.builtin.files').current_buffer_fuzzy_find
|
||||
builtin.current_buffer_fuzzy_find = require("telescope.builtin.files").current_buffer_fuzzy_find
|
||||
|
||||
--- Lists tags in current directory with tag location file preview (users are required to run ctags -R to generate tags
|
||||
--- or update when introducing new changes)
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field ctags_file string: specify a particular ctags file to use
|
||||
---@field show_line boolean: if true, shows the content of the line the tag is found on in the picker (default is true)
|
||||
builtin.tags = require('telescope.builtin.files').tags
|
||||
builtin.tags = require("telescope.builtin.files").tags
|
||||
|
||||
--- Lists all of the tags for the currently open buffer, with a preview
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.current_buffer_tags = require('telescope.builtin.files').current_buffer_tags
|
||||
builtin.current_buffer_tags = require("telescope.builtin.files").current_buffer_tags
|
||||
|
||||
--
|
||||
--
|
||||
@@ -138,14 +138,14 @@ builtin.current_buffer_tags = require('telescope.builtin.files').current_buffer_
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field show_untracked boolean: if true, adds `--others` flag to command and shows untracked files (default is true)
|
||||
---@field recurse_submodules boolean: if true, adds the `--recurse-submodules` flag to command (default is false)
|
||||
builtin.git_files = require('telescope.builtin.git').files
|
||||
builtin.git_files = require("telescope.builtin.git").files
|
||||
|
||||
--- Lists commits for current directory with diff preview
|
||||
--- - Default keymaps:
|
||||
--- - `<cr>`: checks out the currently selected commit
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field cwd string: specify the path of the repo
|
||||
builtin.git_commits = require('telescope.builtin.git').commits
|
||||
builtin.git_commits = require("telescope.builtin.git").commits
|
||||
|
||||
--- Lists commits for current buffer with diff preview
|
||||
--- - Default keymaps or your overriden `select_` keys:
|
||||
@@ -156,7 +156,7 @@ builtin.git_commits = require('telescope.builtin.git').commits
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field cwd string: specify the path of the repo
|
||||
---@field current_file string: specify the current file that should be used for bcommits (default: current buffer)
|
||||
builtin.git_bcommits = require('telescope.builtin.git').bcommits
|
||||
builtin.git_bcommits = require("telescope.builtin.git").bcommits
|
||||
|
||||
--- List branches for current directory, with output from `git log --oneline` shown in the preview window
|
||||
--- - Default keymaps:
|
||||
@@ -166,20 +166,20 @@ builtin.git_bcommits = require('telescope.builtin.git').bcommits
|
||||
--- - `<C-a>`: creates a new branch, with confirmation prompt before creation
|
||||
--- - `<C-d>`: deletes the currently selected branch, with confirmation prompt before deletion
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.git_branches = require('telescope.builtin.git').branches
|
||||
builtin.git_branches = require("telescope.builtin.git").branches
|
||||
|
||||
--- Lists git status for current directory
|
||||
--- - Default keymaps:
|
||||
--- - `<Tab>`: stages or unstages the currently selected file
|
||||
--- - `<cr>`: opens the currently selected file
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.git_status = require('telescope.builtin.git').status
|
||||
builtin.git_status = require("telescope.builtin.git").status
|
||||
|
||||
--- Lists stash items in current repository
|
||||
--- - Default keymaps:
|
||||
--- - `<cr>`: runs `git apply` for currently selected stash
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.git_stash = require('telescope.builtin.git').stash
|
||||
builtin.git_stash = require("telescope.builtin.git").stash
|
||||
|
||||
--
|
||||
--
|
||||
@@ -189,59 +189,59 @@ builtin.git_stash = require('telescope.builtin.git').stash
|
||||
|
||||
--- Lists all of the community maintained pickers built into Telescope
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.builtin = require('telescope.builtin.internal').builtin
|
||||
builtin.builtin = require("telescope.builtin.internal").builtin
|
||||
|
||||
--- Use the telescope...
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.planets = require('telescope.builtin.internal').planets
|
||||
builtin.planets = require("telescope.builtin.internal").planets
|
||||
|
||||
--- Lists symbols inside of data/telescope-sources/*.json found in your runtime path. Check README for more info
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.symbols = require('telescope.builtin.internal').symbols
|
||||
builtin.symbols = require("telescope.builtin.internal").symbols
|
||||
|
||||
--- Lists available plugin/user commands and runs them on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.commands = require('telescope.builtin.internal').commands
|
||||
builtin.commands = require("telescope.builtin.internal").commands
|
||||
|
||||
--- Lists items in the quickfix list, jumps to location on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.quickfix = require('telescope.builtin.internal').quickfix
|
||||
builtin.quickfix = require("telescope.builtin.internal").quickfix
|
||||
|
||||
--- Lists items from the current window's location list, jumps to location on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.loclist = require('telescope.builtin.internal').loclist
|
||||
builtin.loclist = require("telescope.builtin.internal").loclist
|
||||
|
||||
--- Lists previously open files, opens on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.oldfiles = require('telescope.builtin.internal').oldfiles
|
||||
builtin.oldfiles = require("telescope.builtin.internal").oldfiles
|
||||
|
||||
--- Lists commands that were executed recently, and reruns them on `<cr>`
|
||||
--- - Default keymaps:
|
||||
--- - `<C-e>`: open the command line with the text of the currently selected result populated in it
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.command_history = require('telescope.builtin.internal').command_history
|
||||
builtin.command_history = require("telescope.builtin.internal").command_history
|
||||
|
||||
--- Lists searches that were executed recently, and reruns them on `<cr>`
|
||||
--- - Default keymaps:
|
||||
--- - `<C-e>`: open a search window with the text of the currently selected search result populated in it
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.search_history = require('telescope.builtin.internal').search_history
|
||||
builtin.search_history = require("telescope.builtin.internal").search_history
|
||||
|
||||
--- Lists vim options, allows you to edit the current value on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.vim_options = require('telescope.builtin.internal').vim_options
|
||||
builtin.vim_options = require("telescope.builtin.internal").vim_options
|
||||
|
||||
--- Lists available help tags and opens a new window with the relevant help info on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.help_tags = require('telescope.builtin.internal').help_tags
|
||||
builtin.help_tags = require("telescope.builtin.internal").help_tags
|
||||
|
||||
--- Lists manpage entries, opens them in a help window on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.man_pages = require('telescope.builtin.internal').man_pages
|
||||
builtin.man_pages = require("telescope.builtin.internal").man_pages
|
||||
|
||||
--- Lists lua modules and reloads them on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.reloader = require('telescope.builtin.internal').reloader
|
||||
builtin.reloader = require("telescope.builtin.internal").reloader
|
||||
|
||||
--- Lists open buffers in current neovim instance, opens selected buffer on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
@@ -251,50 +251,50 @@ builtin.reloader = require('telescope.builtin.internal').reloader
|
||||
---@field sort_lastused boolean: Sorts current and last buffer to the top and selects the lastused (default false)
|
||||
---@field sort_mru boolean: Sorts all buffers after most recent used. Not just the current and last one (default false)
|
||||
---@field bufnr_width number: Defines the width of the buffer numbers in front of the filenames
|
||||
builtin.buffers = require('telescope.builtin.internal').buffers
|
||||
builtin.buffers = require("telescope.builtin.internal").buffers
|
||||
|
||||
--- Lists available colorschemes and applies them on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field enable_preview boolean: if true, will preview the selected color
|
||||
builtin.colorscheme = require('telescope.builtin.internal').colorscheme
|
||||
builtin.colorscheme = require("telescope.builtin.internal").colorscheme
|
||||
|
||||
--- Lists vim marks and their value, jumps to the mark on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.marks = require('telescope.builtin.internal').marks
|
||||
builtin.marks = require("telescope.builtin.internal").marks
|
||||
|
||||
--- Lists vim registers, pastes the contents of the register on `<cr>`
|
||||
--- - Default keymaps:
|
||||
--- - `<C-e>`: edit the contents of the currently selected register
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.registers = require('telescope.builtin.internal').registers
|
||||
builtin.registers = require("telescope.builtin.internal").registers
|
||||
|
||||
--- Lists normal mode keymappings, runs the selected keymap on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.keymaps = require('telescope.builtin.internal').keymaps
|
||||
builtin.keymaps = require("telescope.builtin.internal").keymaps
|
||||
|
||||
--- Lists all available filetypes, sets currently open buffer's filetype to selected filetype in Telescope on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.filetypes = require('telescope.builtin.internal').filetypes
|
||||
builtin.filetypes = require("telescope.builtin.internal").filetypes
|
||||
|
||||
--- Lists all available highlights
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.highlights = require('telescope.builtin.internal').highlights
|
||||
builtin.highlights = require("telescope.builtin.internal").highlights
|
||||
|
||||
--- Lists vim autocommands and goes to their declaration on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.autocommands = require('telescope.builtin.internal').autocommands
|
||||
builtin.autocommands = require("telescope.builtin.internal").autocommands
|
||||
|
||||
--- Lists spelling suggestions for the current word under the cursor, replaces word with selected suggestion on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.spell_suggest = require('telescope.builtin.internal').spell_suggest
|
||||
builtin.spell_suggest = require("telescope.builtin.internal").spell_suggest
|
||||
|
||||
--- Lists the tag stack for the current window, jumps to tag on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.tagstack = require('telescope.builtin.internal').tagstack
|
||||
builtin.tagstack = require("telescope.builtin.internal").tagstack
|
||||
|
||||
--- Lists items from Vim's jumplist, jumps to location on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.jumplist = require('telescope.builtin.internal').jumplist
|
||||
builtin.jumplist = require("telescope.builtin.internal").jumplist
|
||||
|
||||
--
|
||||
--
|
||||
@@ -304,23 +304,23 @@ builtin.jumplist = require('telescope.builtin.internal').jumplist
|
||||
|
||||
--- Lists LSP references for word under the cursor, jumps to reference on `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.lsp_references = require('telescope.builtin.lsp').references
|
||||
builtin.lsp_references = require("telescope.builtin.lsp").references
|
||||
|
||||
--- Goto the definition of the word under the cursor, if there's only one, otherwise show all options in Telescope
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.lsp_definitions = require('telescope.builtin.lsp').definitions
|
||||
builtin.lsp_definitions = require("telescope.builtin.lsp").definitions
|
||||
|
||||
--- Goto the implementation of the word under the cursor if there's only one, otherwise show all options in Telescope
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.lsp_implementations = require('telescope.builtin.lsp').implementations
|
||||
builtin.lsp_implementations = require("telescope.builtin.lsp").implementations
|
||||
|
||||
--- Lists any LSP actions for the word under the cursor which can be triggered with `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.lsp_code_actions = require('telescope.builtin.lsp').code_actions
|
||||
builtin.lsp_code_actions = require("telescope.builtin.lsp").code_actions
|
||||
|
||||
--- Lists any LSP actions for a given range, that can be triggered with `<cr>`
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.lsp_range_code_actions = require('telescope.builtin.lsp').range_code_actions
|
||||
builtin.lsp_range_code_actions = require("telescope.builtin.lsp").range_code_actions
|
||||
|
||||
--- Lists LSP document symbols in the current buffer
|
||||
--- - Default keymaps:
|
||||
@@ -328,7 +328,7 @@ builtin.lsp_range_code_actions = require('telescope.builtin.lsp').range_code_act
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field ignore_filename type: string with file to ignore
|
||||
---@field symbols string|table: filter results by symbol kind(s)
|
||||
builtin.lsp_document_symbols = require('telescope.builtin.lsp').document_symbols
|
||||
builtin.lsp_document_symbols = require("telescope.builtin.lsp").document_symbols
|
||||
|
||||
--- Lists LSP document symbols in the current workspace
|
||||
--- - Default keymaps:
|
||||
@@ -336,13 +336,13 @@ builtin.lsp_document_symbols = require('telescope.builtin.lsp').document_symbols
|
||||
---@param opts table: options to pass to the picker
|
||||
---@field ignore_filename string: file(s) to ignore
|
||||
---@field symbols string|table: filter results by symbol kind(s)
|
||||
builtin.lsp_workspace_symbols = require('telescope.builtin.lsp').workspace_symbols
|
||||
builtin.lsp_workspace_symbols = require("telescope.builtin.lsp").workspace_symbols
|
||||
|
||||
--- Dynamically lists LSP for all workspace symbols
|
||||
--- - Default keymaps:
|
||||
--- - `<C-l>`: show autocompletion menu to prefilter your query by type of symbol you want to see (i.e. `:variable:`)
|
||||
---@param opts table: options to pass to the picker
|
||||
builtin.lsp_dynamic_workspace_symbols = require('telescope.builtin.lsp').dynamic_workspace_symbols
|
||||
builtin.lsp_dynamic_workspace_symbols = require("telescope.builtin.lsp").dynamic_workspace_symbols
|
||||
|
||||
--- Lists LSP diagnostics for the current buffer
|
||||
--- - Fields:
|
||||
@@ -355,7 +355,7 @@ builtin.lsp_dynamic_workspace_symbols = require('telescope.builtin.lsp').dynamic
|
||||
---@field severity_bound string|number: keep diagnostics equal or less severe wrt severity name (string) or id (number)
|
||||
---@field no_sign bool: hide LspDiagnosticSigns from Results (default is false)
|
||||
---@field line_width number: set length of diagnostic entry text in Results
|
||||
builtin.lsp_document_diagnostics = require('telescope.builtin.lsp').diagnostics
|
||||
builtin.lsp_document_diagnostics = require("telescope.builtin.lsp").diagnostics
|
||||
|
||||
--- Lists LSP diagnostics for the current workspace if supported, otherwise searches in all open buffers
|
||||
--- - Fields:
|
||||
@@ -368,10 +368,10 @@ builtin.lsp_document_diagnostics = require('telescope.builtin.lsp').diagnostics
|
||||
---@field severity_bound string|number: keep diagnostics equal or less severe wrt severity name (string) or id (number)
|
||||
---@field no_sign bool: hide LspDiagnosticSigns from Results (default is false)
|
||||
---@field line_width number: set length of diagnostic entry text in Results
|
||||
builtin.lsp_workspace_diagnostics = require('telescope.builtin.lsp').workspace_diagnostics
|
||||
builtin.lsp_workspace_diagnostics = require("telescope.builtin.lsp").workspace_diagnostics
|
||||
|
||||
local apply_config = function(mod)
|
||||
local pickers_conf = require('telescope.config').pickers
|
||||
local pickers_conf = require("telescope.config").pickers
|
||||
for k, v in pairs(mod) do
|
||||
local pconf = vim.deepcopy(pickers_conf[k] or {})
|
||||
if pconf.theme then
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
local actions = require('telescope.actions')
|
||||
local action_set = require('telescope.actions.set')
|
||||
local action_state = require('telescope.actions.state')
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local Path = require('plenary.path')
|
||||
local pickers = require('telescope.pickers')
|
||||
local previewers = require('telescope.previewers')
|
||||
local sorters = require('telescope.sorters')
|
||||
local utils = require('telescope.utils')
|
||||
local actions = require "telescope.actions"
|
||||
local action_set = require "telescope.actions.set"
|
||||
local action_state = require "telescope.actions.state"
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local Path = require "plenary.path"
|
||||
local pickers = require "telescope.pickers"
|
||||
local previewers = require "telescope.previewers"
|
||||
local sorters = require "telescope.sorters"
|
||||
local utils = require "telescope.utils"
|
||||
|
||||
local conf = require('telescope.config').values
|
||||
local conf = require("telescope.config").values
|
||||
|
||||
local filter = vim.tbl_filter
|
||||
|
||||
@@ -25,7 +25,7 @@ internal.builtin = function(opts)
|
||||
|
||||
local objs = {}
|
||||
|
||||
for k, v in pairs(require'telescope.builtin') do
|
||||
for k, v in pairs(require "telescope.builtin") do
|
||||
local debug_info = debug.getinfo(v)
|
||||
table.insert(objs, {
|
||||
filename = string.sub(debug_info.source, 2),
|
||||
@@ -33,11 +33,11 @@ internal.builtin = function(opts)
|
||||
})
|
||||
end
|
||||
|
||||
local title = 'Telescope Builtin'
|
||||
local title = "Telescope Builtin"
|
||||
|
||||
if opts.include_extensions then
|
||||
title = 'Telescope Pickers'
|
||||
for ext, funcs in pairs(require'telescope'.extensions) do
|
||||
title = "Telescope Pickers"
|
||||
for ext, funcs in pairs(require("telescope").extensions) do
|
||||
for func_name, func_obj in pairs(funcs) do
|
||||
local debug_info = debug.getinfo(func_obj)
|
||||
table.insert(objs, {
|
||||
@@ -50,7 +50,7 @@ internal.builtin = function(opts)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = title,
|
||||
finder = finders.new_table {
|
||||
finder = finders.new_table {
|
||||
results = objs,
|
||||
entry_maker = function(entry)
|
||||
return {
|
||||
@@ -58,44 +58,44 @@ internal.builtin = function(opts)
|
||||
text = entry.text,
|
||||
display = entry.text,
|
||||
ordinal = entry.text,
|
||||
filename = entry.filename
|
||||
filename = entry.filename,
|
||||
}
|
||||
end
|
||||
end,
|
||||
},
|
||||
previewer = previewers.builtin.new(opts),
|
||||
sorter = conf.generic_sorter(opts),
|
||||
attach_mappings = function(_)
|
||||
actions.select_default:replace(actions.run_builtin)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
internal.planets = function(opts)
|
||||
local show_pluto = opts.show_pluto or false
|
||||
|
||||
local sourced_file = require('plenary.debug_utils').sourced_filepath()
|
||||
local sourced_file = require("plenary.debug_utils").sourced_filepath()
|
||||
local base_directory = vim.fn.fnamemodify(sourced_file, ":h:h:h:h")
|
||||
|
||||
local globbed_files = vim.fn.globpath(base_directory .. '/data/memes/planets/', '*', true, true)
|
||||
local globbed_files = vim.fn.globpath(base_directory .. "/data/memes/planets/", "*", true, true)
|
||||
local acceptable_files = {}
|
||||
for _, v in ipairs(globbed_files) do
|
||||
if show_pluto or not v:find("pluto") then
|
||||
table.insert(acceptable_files,vim.fn.fnamemodify(v, ':t'))
|
||||
if show_pluto or not v:find "pluto" then
|
||||
table.insert(acceptable_files, vim.fn.fnamemodify(v, ":t"))
|
||||
end
|
||||
end
|
||||
|
||||
pickers.new {
|
||||
prompt_title = 'Planets',
|
||||
pickers.new({
|
||||
prompt_title = "Planets",
|
||||
finder = finders.new_table {
|
||||
results = acceptable_files,
|
||||
entry_maker = function(line)
|
||||
return {
|
||||
ordinal = line,
|
||||
display = line,
|
||||
filename = base_directory .. '/data/memes/planets/' .. line,
|
||||
filename = base_directory .. "/data/memes/planets/" .. line,
|
||||
}
|
||||
end
|
||||
end,
|
||||
},
|
||||
previewer = previewers.cat.new(opts),
|
||||
sorter = conf.generic_sorter(opts),
|
||||
@@ -109,14 +109,16 @@ internal.planets = function(opts)
|
||||
|
||||
return true
|
||||
end,
|
||||
}:find()
|
||||
}):find()
|
||||
end
|
||||
|
||||
internal.symbols = function(opts)
|
||||
local files = vim.api.nvim_get_runtime_file('data/telescope-sources/*.json', true)
|
||||
local files = vim.api.nvim_get_runtime_file("data/telescope-sources/*.json", true)
|
||||
if table.getn(files) == 0 then
|
||||
print("No sources found! Check out https://github.com/nvim-telescope/telescope-symbols.nvim " ..
|
||||
"for some prebuild symbols or how to create you own symbol source.")
|
||||
print(
|
||||
"No sources found! Check out https://github.com/nvim-telescope/telescope-symbols.nvim "
|
||||
.. "for some prebuild symbols or how to create you own symbol source."
|
||||
)
|
||||
return
|
||||
end
|
||||
|
||||
@@ -142,31 +144,31 @@ internal.symbols = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Symbols',
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
prompt_title = "Symbols",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = function(entry)
|
||||
return {
|
||||
value = entry,
|
||||
ordinal = entry[1] .. ' ' .. entry[2],
|
||||
display = entry[1] .. ' ' .. entry[2],
|
||||
ordinal = entry[1] .. " " .. entry[2],
|
||||
display = entry[1] .. " " .. entry[2],
|
||||
}
|
||||
end
|
||||
end,
|
||||
},
|
||||
sorter = conf.generic_sorter(opts),
|
||||
attach_mappings = function(_)
|
||||
actions.select_default:replace(actions.insert_symbol)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
internal.commands = function(opts)
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Commands',
|
||||
prompt_title = "Commands",
|
||||
finder = finders.new_table {
|
||||
results = (function()
|
||||
local command_iter = vim.api.nvim_get_commands({})
|
||||
local command_iter = vim.api.nvim_get_commands {}
|
||||
local commands = {}
|
||||
|
||||
for _, cmd in pairs(command_iter) do
|
||||
@@ -195,7 +197,7 @@ internal.commands = function(opts)
|
||||
end)
|
||||
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -207,9 +209,9 @@ internal.quickfix = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Quickfix',
|
||||
finder = finders.new_table {
|
||||
results = locations,
|
||||
prompt_title = "Quickfix",
|
||||
finder = finders.new_table {
|
||||
results = locations,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts),
|
||||
},
|
||||
previewer = conf.qflist_previewer(opts),
|
||||
@@ -230,9 +232,9 @@ internal.loclist = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Loclist',
|
||||
finder = finders.new_table {
|
||||
results = locations,
|
||||
prompt_title = "Loclist",
|
||||
finder = finders.new_table {
|
||||
results = locations,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts),
|
||||
},
|
||||
previewer = conf.qflist_previewer(opts),
|
||||
@@ -248,8 +250,8 @@ internal.oldfiles = function(opts)
|
||||
local results = {}
|
||||
|
||||
if opts.include_current_session then
|
||||
for _, buffer in ipairs(vim.split(vim.fn.execute(':buffers! t'), "\n")) do
|
||||
local match = tonumber(string.match(buffer, '%s*(%d+)'))
|
||||
for _, buffer in ipairs(vim.split(vim.fn.execute ":buffers! t", "\n")) do
|
||||
local match = tonumber(string.match(buffer, "%s*(%d+)"))
|
||||
if match then
|
||||
local file = vim.api.nvim_buf_get_name(match)
|
||||
if vim.loop.fs_stat(file) and match ~= current_buffer then
|
||||
@@ -267,15 +269,15 @@ internal.oldfiles = function(opts)
|
||||
|
||||
if opts.cwd_only then
|
||||
local cwd = vim.loop.cwd()
|
||||
cwd = cwd:gsub([[\]],[[\\]])
|
||||
cwd = cwd:gsub([[\]], [[\\]])
|
||||
results = vim.tbl_filter(function(file)
|
||||
return vim.fn.matchstrpos(file, cwd)[2] ~= -1
|
||||
end, results)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Oldfiles',
|
||||
finder = finders.new_table{
|
||||
prompt_title = "Oldfiles",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_file(opts),
|
||||
},
|
||||
@@ -285,7 +287,7 @@ internal.oldfiles = function(opts)
|
||||
end
|
||||
|
||||
internal.command_history = function(opts)
|
||||
local history_string = vim.fn.execute('history cmd')
|
||||
local history_string = vim.fn.execute "history cmd"
|
||||
local history_list = vim.split(history_string, "\n")
|
||||
|
||||
local results = {}
|
||||
@@ -296,15 +298,15 @@ internal.command_history = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Command History',
|
||||
prompt_title = "Command History",
|
||||
finder = finders.new_table(results),
|
||||
sorter = conf.generic_sorter(opts),
|
||||
|
||||
attach_mappings = function(_, map)
|
||||
map('i', '<CR>', actions.set_command_line)
|
||||
map('n', '<CR>', actions.set_command_line)
|
||||
map('n', '<C-e>', actions.edit_command_line)
|
||||
map('i', '<C-e>', actions.edit_command_line)
|
||||
map("i", "<CR>", actions.set_command_line)
|
||||
map("n", "<CR>", actions.set_command_line)
|
||||
map("n", "<C-e>", actions.edit_command_line)
|
||||
map("i", "<C-e>", actions.edit_command_line)
|
||||
|
||||
-- TODO: Find a way to insert the text... it seems hard.
|
||||
-- map('i', '<C-i>', actions.insert_value, { expr = true })
|
||||
@@ -315,7 +317,7 @@ internal.command_history = function(opts)
|
||||
end
|
||||
|
||||
internal.search_history = function(opts)
|
||||
local search_string = vim.fn.execute('history search')
|
||||
local search_string = vim.fn.execute "history search"
|
||||
local search_list = vim.split(search_string, "\n")
|
||||
|
||||
local results = {}
|
||||
@@ -326,15 +328,15 @@ internal.search_history = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Search History',
|
||||
prompt_title = "Search History",
|
||||
finder = finders.new_table(results),
|
||||
sorter = conf.generic_sorter(opts),
|
||||
|
||||
attach_mappings = function(_, map)
|
||||
map('i', '<CR>', actions.set_search_line)
|
||||
map('n', '<CR>', actions.set_search_line)
|
||||
map('n', '<C-e>', actions.edit_search_line)
|
||||
map('i', '<C-e>', actions.edit_search_line)
|
||||
map("i", "<CR>", actions.set_search_line)
|
||||
map("n", "<CR>", actions.set_search_line)
|
||||
map("n", "<C-e>", actions.edit_search_line)
|
||||
map("i", "<C-e>", actions.edit_search_line)
|
||||
|
||||
-- TODO: Find a way to insert the text... it seems hard.
|
||||
-- map('i', '<C-i>', actions.insert_value, { expr = true })
|
||||
@@ -346,12 +348,10 @@ end
|
||||
|
||||
internal.vim_options = function(opts)
|
||||
-- Load vim options.
|
||||
local vim_opts = loadfile(
|
||||
Path:new({utils.data_directory(), 'options', 'options.lua'}):absolute()
|
||||
)().options
|
||||
local vim_opts = loadfile(Path:new({ utils.data_directory(), "options", "options.lua" }):absolute())().options
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'options',
|
||||
prompt_title = "options",
|
||||
finder = finders.new_table {
|
||||
results = vim_opts,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_vimoptions(opts),
|
||||
@@ -403,7 +403,7 @@ internal.vim_options = function(opts)
|
||||
end)
|
||||
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -411,9 +411,9 @@ internal.help_tags = function(opts)
|
||||
opts.lang = utils.get_default(opts.lang, vim.o.helplang)
|
||||
opts.fallback = utils.get_default(opts.fallback, true)
|
||||
|
||||
local langs = vim.split(opts.lang, ',', true)
|
||||
if opts.fallback and not vim.tbl_contains(langs, 'en') then
|
||||
table.insert(langs, 'en')
|
||||
local langs = vim.split(opts.lang, ",", true)
|
||||
if opts.fallback and not vim.tbl_contains(langs, "en") then
|
||||
table.insert(langs, "en")
|
||||
end
|
||||
local langs_map = {}
|
||||
for _, lang in ipairs(langs) do
|
||||
@@ -426,18 +426,18 @@ internal.help_tags = function(opts)
|
||||
if tag_files[lang] then
|
||||
table.insert(tag_files[lang], file)
|
||||
else
|
||||
tag_files[lang] = {file}
|
||||
tag_files[lang] = { file }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local help_files = {}
|
||||
local all_files = vim.fn.globpath(vim.o.runtimepath, 'doc/*', 1, 1)
|
||||
local all_files = vim.fn.globpath(vim.o.runtimepath, "doc/*", 1, 1)
|
||||
for _, fullpath in ipairs(all_files) do
|
||||
local file = utils.path_tail(fullpath)
|
||||
if file == 'tags' then
|
||||
add_tag_file('en', fullpath)
|
||||
elseif file:match('^tags%-..$') then
|
||||
if file == "tags" then
|
||||
add_tag_file("en", fullpath)
|
||||
elseif file:match "^tags%-..$" then
|
||||
local lang = file:sub(-2)
|
||||
add_tag_file(lang, fullpath)
|
||||
else
|
||||
@@ -450,10 +450,10 @@ internal.help_tags = function(opts)
|
||||
local delimiter = string.char(9)
|
||||
for _, lang in ipairs(langs) do
|
||||
for _, file in ipairs(tag_files[lang] or {}) do
|
||||
local lines = vim.split(Path:new(file):read(), '\n', true)
|
||||
local lines = vim.split(Path:new(file):read(), "\n", true)
|
||||
for _, line in ipairs(lines) do
|
||||
-- TODO: also ignore tagComment starting with ';'
|
||||
if not line:match'^!_TAG_' then
|
||||
if not line:match "^!_TAG_" then
|
||||
local fields = vim.split(line, delimiter, true)
|
||||
if #fields == 3 and not tags_map[fields[1]] then
|
||||
table.insert(tags, {
|
||||
@@ -470,16 +470,16 @@ internal.help_tags = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Help',
|
||||
prompt_title = "Help",
|
||||
finder = finders.new_table {
|
||||
results = tags,
|
||||
entry_maker = function(entry)
|
||||
return {
|
||||
value = entry.name .. '@' .. entry.lang,
|
||||
value = entry.name .. "@" .. entry.lang,
|
||||
display = entry.name,
|
||||
ordinal = entry.name,
|
||||
filename = entry.filename,
|
||||
cmd = entry.cmd
|
||||
cmd = entry.cmd,
|
||||
}
|
||||
end,
|
||||
},
|
||||
@@ -489,51 +489,51 @@ internal.help_tags = function(opts)
|
||||
action_set.select:replace(function(_, cmd)
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
if cmd == 'default' or cmd == 'horizontal' then
|
||||
vim.cmd('help ' .. selection.value)
|
||||
elseif cmd == 'vertical' then
|
||||
vim.cmd('vert bo help ' .. selection.value)
|
||||
elseif cmd == 'tab' then
|
||||
vim.cmd('tab help ' .. selection.value)
|
||||
if cmd == "default" or cmd == "horizontal" then
|
||||
vim.cmd("help " .. selection.value)
|
||||
elseif cmd == "vertical" then
|
||||
vim.cmd("vert bo help " .. selection.value)
|
||||
elseif cmd == "tab" then
|
||||
vim.cmd("tab help " .. selection.value)
|
||||
end
|
||||
end)
|
||||
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
internal.man_pages = function(opts)
|
||||
opts.sections = utils.get_default(opts.sections, {'1'})
|
||||
assert(vim.tbl_islist(opts.sections), 'sections should be a list')
|
||||
opts.sections = utils.get_default(opts.sections, { "1" })
|
||||
assert(vim.tbl_islist(opts.sections), "sections should be a list")
|
||||
opts.man_cmd = utils.get_lazy_default(opts.man_cmd, function()
|
||||
local is_darwin = vim.loop.os_uname().sysname == 'Darwin'
|
||||
return is_darwin and {'apropos', ' '} or {'apropos', ''}
|
||||
local is_darwin = vim.loop.os_uname().sysname == "Darwin"
|
||||
return is_darwin and { "apropos", " " } or { "apropos", "" }
|
||||
end)
|
||||
opts.entry_maker = opts.entry_maker or make_entry.gen_from_apropos(opts)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Man',
|
||||
finder = finders.new_oneshot_job(opts.man_cmd, opts),
|
||||
prompt_title = "Man",
|
||||
finder = finders.new_oneshot_job(opts.man_cmd, opts),
|
||||
previewer = previewers.man.new(opts),
|
||||
sorter = conf.generic_sorter(opts),
|
||||
attach_mappings = function(prompt_bufnr)
|
||||
action_set.select:replace(function(_, cmd)
|
||||
local selection = action_state.get_selected_entry()
|
||||
local args = selection.section .. ' ' .. selection.value
|
||||
local args = selection.section .. " " .. selection.value
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
if cmd == 'default' or cmd == 'horizontal' then
|
||||
vim.cmd('Man ' .. args)
|
||||
elseif cmd == 'vertical' then
|
||||
vim.cmd('vert bo Man ' .. args)
|
||||
elseif cmd == 'tab' then
|
||||
vim.cmd('tab Man ' .. args)
|
||||
if cmd == "default" or cmd == "horizontal" then
|
||||
vim.cmd("Man " .. args)
|
||||
elseif cmd == "vertical" then
|
||||
vim.cmd("vert bo Man " .. args)
|
||||
elseif cmd == "tab" then
|
||||
vim.cmd("tab Man " .. args)
|
||||
end
|
||||
end)
|
||||
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -543,9 +543,11 @@ internal.reloader = function(opts)
|
||||
-- filter out packages we don't want and track the longest package name
|
||||
opts.column_len = 0
|
||||
for index, module_name in pairs(package_list) do
|
||||
if type(require(module_name)) ~= 'table' or
|
||||
module_name:sub(1,1) == "_" or
|
||||
package.searchpath(module_name, package.path) == nil then
|
||||
if
|
||||
type(require(module_name)) ~= "table"
|
||||
or module_name:sub(1, 1) == "_"
|
||||
or package.searchpath(module_name, package.path) == nil
|
||||
then
|
||||
table.remove(package_list, index)
|
||||
elseif #module_name > opts.column_len then
|
||||
opts.column_len = #module_name
|
||||
@@ -553,7 +555,7 @@ internal.reloader = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Packages',
|
||||
prompt_title = "Packages",
|
||||
finder = finders.new_table {
|
||||
results = package_list,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_packages(opts),
|
||||
@@ -566,19 +568,19 @@ internal.reloader = function(opts)
|
||||
local selection = action_state.get_selected_entry()
|
||||
|
||||
actions.close(prompt_bufnr)
|
||||
require('plenary.reload').reload_module(selection.value)
|
||||
require("plenary.reload").reload_module(selection.value)
|
||||
print(string.format("[%s] - module reloaded", selection.value))
|
||||
end)
|
||||
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
internal.buffers = function(opts)
|
||||
local bufnrs = filter(function(b)
|
||||
if 1 ~= vim.fn.buflisted(b) then
|
||||
return false
|
||||
return false
|
||||
end
|
||||
-- only hide unloaded buffers if opts.show_all_buffers is false, keep them listed if true or nil
|
||||
if opts.show_all_buffers == false and not vim.api.nvim_buf_is_loaded(b) then
|
||||
@@ -592,7 +594,9 @@ internal.buffers = function(opts)
|
||||
end
|
||||
return true
|
||||
end, vim.api.nvim_list_bufs())
|
||||
if not next(bufnrs) then return end
|
||||
if not next(bufnrs) then
|
||||
return
|
||||
end
|
||||
if opts.sort_mru then
|
||||
table.sort(bufnrs, function(a, b)
|
||||
return vim.fn.getbufinfo(a)[1].lastused > vim.fn.getbufinfo(b)[1].lastused
|
||||
@@ -602,7 +606,7 @@ internal.buffers = function(opts)
|
||||
local buffers = {}
|
||||
local default_selection_idx = 1
|
||||
for _, bufnr in ipairs(bufnrs) do
|
||||
local flag = bufnr == vim.fn.bufnr('') and '%' or (bufnr == vim.fn.bufnr('#') and '#' or ' ')
|
||||
local flag = bufnr == vim.fn.bufnr "" and "%" or (bufnr == vim.fn.bufnr "#" and "#" or " ")
|
||||
|
||||
if opts.sort_lastused and not opts.ignore_current_buffer and flag == "#" then
|
||||
default_selection_idx = 2
|
||||
@@ -628,10 +632,10 @@ internal.buffers = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Buffers',
|
||||
finder = finders.new_table {
|
||||
prompt_title = "Buffers",
|
||||
finder = finders.new_table {
|
||||
results = buffers,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_buffer(opts)
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_buffer(opts),
|
||||
},
|
||||
previewer = conf.grep_previewer(opts),
|
||||
sorter = conf.generic_sorter(opts),
|
||||
@@ -640,7 +644,7 @@ internal.buffers = function(opts)
|
||||
end
|
||||
|
||||
internal.colorscheme = function(opts)
|
||||
local before_color = vim.api.nvim_exec('colorscheme', true)
|
||||
local before_color = vim.api.nvim_exec("colorscheme", true)
|
||||
local need_restore = true
|
||||
|
||||
local colors = opts.colors or { before_color }
|
||||
@@ -652,10 +656,7 @@ internal.colorscheme = function(opts)
|
||||
colors,
|
||||
vim.tbl_filter(function(color)
|
||||
return color ~= before_color
|
||||
end, vim.fn.getcompletion(
|
||||
'',
|
||||
'color'
|
||||
))
|
||||
end, vim.fn.getcompletion("", "color"))
|
||||
)
|
||||
|
||||
local previewer
|
||||
@@ -681,7 +682,7 @@ internal.colorscheme = function(opts)
|
||||
del_win(status.preview_win)
|
||||
del_win(status.preview_border_win)
|
||||
end
|
||||
vim.cmd('colorscheme ' .. entry.value)
|
||||
vim.cmd("colorscheme " .. entry.value)
|
||||
end,
|
||||
}
|
||||
else
|
||||
@@ -697,14 +698,14 @@ internal.colorscheme = function(opts)
|
||||
local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)
|
||||
vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, lines)
|
||||
end
|
||||
vim.cmd('colorscheme ' .. entry.value)
|
||||
vim.cmd("colorscheme " .. entry.value)
|
||||
end,
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
local picker = pickers.new(opts, {
|
||||
prompt_title = 'Change Colorscheme',
|
||||
prompt_title = "Change Colorscheme",
|
||||
finder = finders.new_table {
|
||||
results = colors,
|
||||
},
|
||||
@@ -716,7 +717,7 @@ internal.colorscheme = function(opts)
|
||||
actions.close(prompt_bufnr)
|
||||
|
||||
need_restore = false
|
||||
vim.cmd('colorscheme ' .. selection.value)
|
||||
vim.cmd("colorscheme " .. selection.value)
|
||||
end)
|
||||
|
||||
return true
|
||||
@@ -729,7 +730,7 @@ internal.colorscheme = function(opts)
|
||||
picker.close_windows = function(status)
|
||||
close_windows(status)
|
||||
if need_restore then
|
||||
vim.cmd('colorscheme ' .. before_color)
|
||||
vim.cmd("colorscheme " .. before_color)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -744,8 +745,8 @@ internal.marks = function(opts)
|
||||
-- Pop off the header.
|
||||
table.remove(marks_table, 1)
|
||||
|
||||
pickers.new(opts,{
|
||||
prompt_title = 'Marks',
|
||||
pickers.new(opts, {
|
||||
prompt_title = "Marks",
|
||||
finder = finders.new_table {
|
||||
results = marks_table,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_marks(opts),
|
||||
@@ -756,7 +757,7 @@ internal.marks = function(opts)
|
||||
end
|
||||
|
||||
internal.registers = function(opts)
|
||||
local registers_table = {"\"", "_", "#", "=", "_", "/", "*", "+", ":", ".", "%"}
|
||||
local registers_table = { '"', "_", "#", "=", "_", "/", "*", "+", ":", ".", "%" }
|
||||
|
||||
-- named
|
||||
for i = 0, 9 do
|
||||
@@ -768,8 +769,8 @@ internal.registers = function(opts)
|
||||
table.insert(registers_table, string.char(i))
|
||||
end
|
||||
|
||||
pickers.new(opts,{
|
||||
prompt_title = 'Registers',
|
||||
pickers.new(opts, {
|
||||
prompt_title = "Registers",
|
||||
finder = finders.new_table {
|
||||
results = registers_table,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_registers(opts),
|
||||
@@ -778,7 +779,7 @@ internal.registers = function(opts)
|
||||
sorter = sorters.get_levenshtein_sorter(),
|
||||
attach_mappings = function(_, map)
|
||||
actions.select_default:replace(actions.paste_register)
|
||||
map('i', '<C-e>', actions.edit_register)
|
||||
map("i", "<C-e>", actions.edit_register)
|
||||
|
||||
return true
|
||||
end,
|
||||
@@ -787,7 +788,7 @@ end
|
||||
|
||||
-- TODO: make filtering include the mapping and the action
|
||||
internal.keymaps = function(opts)
|
||||
local modes = {"n", "i", "c"}
|
||||
local modes = { "n", "i", "c" }
|
||||
local keymaps_table = {}
|
||||
|
||||
for _, mode in pairs(modes) do
|
||||
@@ -802,7 +803,7 @@ internal.keymaps = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Key Maps',
|
||||
prompt_title = "Key Maps",
|
||||
finder = finders.new_table {
|
||||
results = keymaps_table,
|
||||
entry_maker = function(line)
|
||||
@@ -810,29 +811,27 @@ internal.keymaps = function(opts)
|
||||
valid = line ~= "",
|
||||
value = line,
|
||||
ordinal = utils.display_termcodes(line.lhs) .. line.rhs,
|
||||
display = line.mode .. ' ' .. utils.display_termcodes(line.lhs) .. ' ' .. line.rhs
|
||||
display = line.mode .. " " .. utils.display_termcodes(line.lhs) .. " " .. line.rhs,
|
||||
}
|
||||
end
|
||||
end,
|
||||
},
|
||||
sorter = conf.generic_sorter(opts),
|
||||
attach_mappings = function(prompt_bufnr)
|
||||
actions.select_default:replace(function()
|
||||
local selection = action_state.get_selected_entry()
|
||||
vim.api.nvim_feedkeys(
|
||||
vim.api.nvim_replace_termcodes(selection.value.lhs, true, false, true),
|
||||
"t", true)
|
||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(selection.value.lhs, true, false, true), "t", true)
|
||||
return actions.close(prompt_bufnr)
|
||||
end)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
internal.filetypes = function(opts)
|
||||
local filetypes = vim.fn.getcompletion('', 'filetype')
|
||||
local filetypes = vim.fn.getcompletion("", "filetype")
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Filetypes',
|
||||
prompt_title = "Filetypes",
|
||||
finder = finders.new_table {
|
||||
results = filetypes,
|
||||
},
|
||||
@@ -841,28 +840,28 @@ internal.filetypes = function(opts)
|
||||
actions.select_default:replace(function()
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
vim.cmd('setfiletype ' .. selection[1])
|
||||
vim.cmd("setfiletype " .. selection[1])
|
||||
end)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
internal.highlights = function(opts)
|
||||
local highlights = vim.fn.getcompletion('', 'highlight')
|
||||
local highlights = vim.fn.getcompletion("", "highlight")
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Highlights',
|
||||
prompt_title = "Highlights",
|
||||
finder = finders.new_table {
|
||||
results = highlights,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_highlights(opts)
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_highlights(opts),
|
||||
},
|
||||
sorter = conf.generic_sorter(opts),
|
||||
attach_mappings = function(prompt_bufnr)
|
||||
actions.select_default:replace(function()
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
vim.cmd('hi ' .. selection.value)
|
||||
vim.cmd("hi " .. selection.value)
|
||||
end)
|
||||
return true
|
||||
end,
|
||||
@@ -873,10 +872,10 @@ end
|
||||
internal.autocommands = function(opts)
|
||||
local autocmd_table = {}
|
||||
|
||||
local pattern = {}
|
||||
local pattern = {}
|
||||
pattern.BUFFER = "<buffer=%d+>"
|
||||
pattern.EVENT = "[%a]+"
|
||||
pattern.GROUP = "[%a%d_:]+"
|
||||
pattern.EVENT = "[%a]+"
|
||||
pattern.GROUP = "[%a%d_:]+"
|
||||
pattern.INDENT = "^%s%s%s%s" -- match indentation of 4 spaces
|
||||
|
||||
local event, group, ft_pat, cmd, source_file, source_lnum
|
||||
@@ -902,7 +901,7 @@ internal.autocommands = function(opts)
|
||||
-- non event/group lines
|
||||
ft_pat = line:match(pattern.INDENT .. "(%S+)")
|
||||
if ft_pat then
|
||||
if ft_pat:match("^%d+") then
|
||||
if ft_pat:match "^%d+" then
|
||||
ft_pat = "<buffer=" .. ft_pat .. ">"
|
||||
end
|
||||
current_ft = ft_pat
|
||||
@@ -920,13 +919,13 @@ internal.autocommands = function(opts)
|
||||
end
|
||||
|
||||
if current_ft and cmd then
|
||||
source_file, source_lnum = line:match("Last set from (.*) line (.*)")
|
||||
source_file, source_lnum = line:match "Last set from (.*) line (.*)"
|
||||
if source_file then
|
||||
local autocmd = {}
|
||||
autocmd.event = current_event
|
||||
autocmd.group = current_group
|
||||
autocmd.ft_pattern = current_ft
|
||||
autocmd.command = cmd
|
||||
autocmd.event = current_event
|
||||
autocmd.group = current_group
|
||||
autocmd.ft_pattern = current_ft
|
||||
autocmd.command = cmd
|
||||
autocmd.source_file = source_file
|
||||
autocmd.source_lnum = source_lnum
|
||||
table.insert(autocmd_table, autocmd)
|
||||
@@ -937,12 +936,12 @@ internal.autocommands = function(opts)
|
||||
end
|
||||
|
||||
local cmd_output = vim.fn.execute("verb autocmd *", "silent")
|
||||
for line in cmd_output:gmatch("[^\r\n]+") do
|
||||
for line in cmd_output:gmatch "[^\r\n]+" do
|
||||
inner_loop(line)
|
||||
end
|
||||
|
||||
pickers.new(opts,{
|
||||
prompt_title = 'autocommands',
|
||||
pickers.new(opts, {
|
||||
prompt_title = "autocommands",
|
||||
finder = finders.new_table {
|
||||
results = autocmd_table,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_autocommands(opts),
|
||||
@@ -953,22 +952,24 @@ internal.autocommands = function(opts)
|
||||
action_set.select:replace(function(_, type)
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
vim.cmd(action_state.select_key_to_edit_key(type) .. ' ' .. selection.value)
|
||||
vim.cmd(action_state.select_key_to_edit_key(type) .. " " .. selection.value)
|
||||
end)
|
||||
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
internal.spell_suggest = function(opts)
|
||||
if not vim.wo.spell then return false end
|
||||
if not vim.wo.spell then
|
||||
return false
|
||||
end
|
||||
|
||||
local cursor_word = vim.fn.expand("<cword>")
|
||||
local cursor_word = vim.fn.expand "<cword>"
|
||||
local suggestions = vim.fn.spellsuggest(cursor_word)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Spelling Suggestions',
|
||||
prompt_title = "Spelling Suggestions",
|
||||
finder = finders.new_table {
|
||||
results = suggestions,
|
||||
},
|
||||
@@ -977,11 +978,11 @@ internal.spell_suggest = function(opts)
|
||||
actions.select_default:replace(function()
|
||||
local selection = action_state.get_selected_entry()
|
||||
actions.close(prompt_bufnr)
|
||||
vim.cmd('normal! ciw' .. selection[1])
|
||||
vim.cmd('stopinsert')
|
||||
vim.cmd("normal! ciw" .. selection[1])
|
||||
vim.cmd "stopinsert"
|
||||
end)
|
||||
return true
|
||||
end
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -999,22 +1000,17 @@ internal.tagstack = function(opts)
|
||||
tag.lnum = tag.from[2]
|
||||
tag.col = tag.from[3]
|
||||
|
||||
tag.text = vim.api.nvim_buf_get_lines(
|
||||
tag.bufnr,
|
||||
tag.lnum - 1,
|
||||
tag.lnum,
|
||||
false
|
||||
)[1] or ''
|
||||
tag.text = vim.api.nvim_buf_get_lines(tag.bufnr, tag.lnum - 1, tag.lnum, false)[1] or ""
|
||||
end
|
||||
end
|
||||
|
||||
if vim.tbl_isempty(tags) then
|
||||
print("No tagstack available")
|
||||
print "No tagstack available"
|
||||
return
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'TagStack',
|
||||
prompt_title = "TagStack",
|
||||
finder = finders.new_table {
|
||||
results = tags,
|
||||
entry_maker = make_entry.gen_from_quickfix(opts),
|
||||
@@ -1032,14 +1028,14 @@ internal.jumplist = function(opts)
|
||||
local sorted_jumplist = {}
|
||||
for i = #jumplist, 1, -1 do
|
||||
if vim.api.nvim_buf_is_valid(jumplist[i].bufnr) then
|
||||
jumplist[i].text = vim.api.nvim_buf_get_lines(jumplist[i].bufnr, jumplist[i].lnum, jumplist[i].lnum+1,
|
||||
false)[1] or ''
|
||||
jumplist[i].text = vim.api.nvim_buf_get_lines(jumplist[i].bufnr, jumplist[i].lnum, jumplist[i].lnum + 1, false)[1]
|
||||
or ""
|
||||
table.insert(sorted_jumplist, jumplist[i])
|
||||
end
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'Jumplist',
|
||||
prompt_title = "Jumplist",
|
||||
finder = finders.new_table {
|
||||
results = sorted_jumplist,
|
||||
entry_maker = make_entry.gen_from_quickfix(opts),
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
local actions = require('telescope.actions')
|
||||
local action_state = require('telescope.actions.state')
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local pickers = require('telescope.pickers')
|
||||
local entry_display = require('telescope.pickers.entry_display')
|
||||
local utils = require('telescope.utils')
|
||||
local strings = require('plenary.strings')
|
||||
local a = require('plenary.async_lib')
|
||||
local actions = require "telescope.actions"
|
||||
local action_state = require "telescope.actions.state"
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local pickers = require "telescope.pickers"
|
||||
local entry_display = require "telescope.pickers.entry_display"
|
||||
local utils = require "telescope.utils"
|
||||
local strings = require "plenary.strings"
|
||||
local a = require "plenary.async_lib"
|
||||
local async, await = a.async, a.await
|
||||
local channel = a.util.channel
|
||||
|
||||
local conf = require('telescope.config').values
|
||||
local conf = require("telescope.config").values
|
||||
|
||||
local lsp = {}
|
||||
|
||||
@@ -36,8 +36,8 @@ lsp.references = function(opts)
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'LSP References',
|
||||
finder = finders.new_table {
|
||||
prompt_title = "LSP References",
|
||||
finder = finders.new_table {
|
||||
results = locations,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_quickfix(opts),
|
||||
},
|
||||
@@ -81,11 +81,11 @@ local function list_or_jump(action, title, opts)
|
||||
end
|
||||
|
||||
lsp.definitions = function(opts)
|
||||
return list_or_jump("textDocument/definition", 'LSP Definitions', opts)
|
||||
return list_or_jump("textDocument/definition", "LSP Definitions", opts)
|
||||
end
|
||||
|
||||
lsp.implementations = function(opts)
|
||||
return list_or_jump("textDocument/implementation", 'LSP Implementations', opts)
|
||||
return list_or_jump("textDocument/implementation", "LSP Implementations", opts)
|
||||
end
|
||||
|
||||
lsp.document_symbols = function(opts)
|
||||
@@ -97,7 +97,7 @@ lsp.document_symbols = function(opts)
|
||||
end
|
||||
|
||||
if not results_lsp or vim.tbl_isempty(results_lsp) then
|
||||
print("No results from textDocument/documentSymbol")
|
||||
print "No results from textDocument/documentSymbol"
|
||||
return
|
||||
end
|
||||
|
||||
@@ -118,16 +118,16 @@ lsp.document_symbols = function(opts)
|
||||
|
||||
opts.ignore_filename = opts.ignore_filename or true
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'LSP Document Symbols',
|
||||
finder = finders.new_table {
|
||||
prompt_title = "LSP Document Symbols",
|
||||
finder = finders.new_table {
|
||||
results = locations,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts)
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts),
|
||||
},
|
||||
previewer = conf.qflist_previewer(opts),
|
||||
sorter = conf.prefilter_sorter{
|
||||
sorter = conf.prefilter_sorter {
|
||||
tag = "symbol_type",
|
||||
sorter = conf.generic_sorter(opts)
|
||||
}
|
||||
sorter = conf.generic_sorter(opts),
|
||||
},
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -135,7 +135,7 @@ lsp.code_actions = function(opts)
|
||||
local params = opts.params or vim.lsp.util.make_range_params()
|
||||
|
||||
params.context = {
|
||||
diagnostics = vim.lsp.diagnostic.get_line_diagnostics()
|
||||
diagnostics = vim.lsp.diagnostic.get_line_diagnostics(),
|
||||
}
|
||||
|
||||
local results_lsp, err = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, opts.timeout or 10000)
|
||||
@@ -146,7 +146,7 @@ lsp.code_actions = function(opts)
|
||||
end
|
||||
|
||||
if not results_lsp or vim.tbl_isempty(results_lsp) then
|
||||
print("No results from textDocument/codeAction")
|
||||
print "No results from textDocument/codeAction"
|
||||
return
|
||||
end
|
||||
|
||||
@@ -181,7 +181,7 @@ lsp.code_actions = function(opts)
|
||||
end
|
||||
|
||||
if #results == 0 then
|
||||
print("No code actions available")
|
||||
print "No code actions available"
|
||||
return
|
||||
end
|
||||
|
||||
@@ -196,15 +196,15 @@ lsp.code_actions = function(opts)
|
||||
|
||||
local function make_display(entry)
|
||||
return displayer {
|
||||
{entry.idx .. ":", "TelescopePromptPrefix"},
|
||||
{entry.command_title},
|
||||
{entry.client_name, "TelescopeResultsComment"},
|
||||
{ entry.idx .. ":", "TelescopePromptPrefix" },
|
||||
{ entry.command_title },
|
||||
{ entry.client_name, "TelescopeResultsComment" },
|
||||
}
|
||||
end
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'LSP Code Actions',
|
||||
finder = finders.new_table {
|
||||
prompt_title = "LSP Code Actions",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
entry_maker = function(line)
|
||||
return {
|
||||
@@ -216,7 +216,7 @@ lsp.code_actions = function(opts)
|
||||
client_name = line.client_name,
|
||||
display = make_display,
|
||||
}
|
||||
end
|
||||
end,
|
||||
},
|
||||
attach_mappings = function(prompt_bufnr)
|
||||
actions.select_default:replace(function()
|
||||
@@ -243,12 +243,12 @@ lsp.code_actions = function(opts)
|
||||
end
|
||||
|
||||
lsp.range_code_actions = function(opts)
|
||||
opts.params = vim.lsp.util.make_given_range_params()
|
||||
lsp.code_actions(opts)
|
||||
opts.params = vim.lsp.util.make_given_range_params()
|
||||
lsp.code_actions(opts)
|
||||
end
|
||||
|
||||
lsp.workspace_symbols = function(opts)
|
||||
local params = {query = opts.query or ''}
|
||||
local params = { query = opts.query or "" }
|
||||
local results_lsp, err = vim.lsp.buf_request_sync(0, "workspace/symbol", params, opts.timeout or 10000)
|
||||
if err then
|
||||
vim.api.nvim_err_writeln("Error when finding workspace symbols: " .. err)
|
||||
@@ -273,24 +273,26 @@ lsp.workspace_symbols = function(opts)
|
||||
end
|
||||
|
||||
if vim.tbl_isempty(locations) then
|
||||
print("No results from workspace/symbol. Maybe try a different query: " ..
|
||||
"Telescope lsp_workspace_symbols query=example")
|
||||
print(
|
||||
"No results from workspace/symbol. Maybe try a different query: "
|
||||
.. "Telescope lsp_workspace_symbols query=example"
|
||||
)
|
||||
return
|
||||
end
|
||||
|
||||
opts.ignore_filename = utils.get_default(opts.ignore_filename, false)
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'LSP Workspace Symbols',
|
||||
finder = finders.new_table {
|
||||
prompt_title = "LSP Workspace Symbols",
|
||||
finder = finders.new_table {
|
||||
results = locations,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts)
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts),
|
||||
},
|
||||
previewer = conf.qflist_previewer(opts),
|
||||
sorter = conf.prefilter_sorter{
|
||||
sorter = conf.prefilter_sorter {
|
||||
tag = "symbol_type",
|
||||
sorter = conf.generic_sorter(opts)
|
||||
}
|
||||
sorter = conf.generic_sorter(opts),
|
||||
},
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -300,7 +302,7 @@ local function get_workspace_symbols_requester(bufnr)
|
||||
return async(function(prompt)
|
||||
local tx, rx = channel.oneshot()
|
||||
cancel()
|
||||
_, cancel = vim.lsp.buf_request(bufnr, "workspace/symbol", {query = prompt}, tx)
|
||||
_, cancel = vim.lsp.buf_request(bufnr, "workspace/symbol", { query = prompt }, tx)
|
||||
|
||||
local err, _, results_lsp = await(rx())
|
||||
assert(not err, err)
|
||||
@@ -314,13 +316,13 @@ lsp.dynamic_workspace_symbols = function(opts)
|
||||
local curr_bufnr = vim.api.nvim_get_current_buf()
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'LSP Dynamic Workspace Symbols',
|
||||
finder = finders.new_dynamic {
|
||||
prompt_title = "LSP Dynamic Workspace Symbols",
|
||||
finder = finders.new_dynamic {
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_lsp_symbols(opts),
|
||||
fn = get_workspace_symbols_requester(curr_bufnr),
|
||||
},
|
||||
previewer = conf.qflist_previewer(opts),
|
||||
sorter = conf.generic_sorter()
|
||||
sorter = conf.generic_sorter(),
|
||||
}):find()
|
||||
end
|
||||
|
||||
@@ -328,29 +330,29 @@ lsp.diagnostics = function(opts)
|
||||
local locations = utils.diagnostics_to_tbl(opts)
|
||||
|
||||
if vim.tbl_isempty(locations) then
|
||||
print('No diagnostics found')
|
||||
print "No diagnostics found"
|
||||
return
|
||||
end
|
||||
|
||||
opts.path_display = utils.get_default(opts.path_display, 'hidden')
|
||||
opts.path_display = utils.get_default(opts.path_display, "hidden")
|
||||
pickers.new(opts, {
|
||||
prompt_title = 'LSP Document Diagnostics',
|
||||
prompt_title = "LSP Document Diagnostics",
|
||||
finder = finders.new_table {
|
||||
results = locations,
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_lsp_diagnostics(opts)
|
||||
entry_maker = opts.entry_maker or make_entry.gen_from_lsp_diagnostics(opts),
|
||||
},
|
||||
previewer = conf.qflist_previewer(opts),
|
||||
sorter = conf.prefilter_sorter{
|
||||
sorter = conf.prefilter_sorter {
|
||||
tag = "type",
|
||||
sorter = conf.generic_sorter(opts)
|
||||
}
|
||||
sorter = conf.generic_sorter(opts),
|
||||
},
|
||||
}):find()
|
||||
end
|
||||
|
||||
lsp.workspace_diagnostics = function(opts)
|
||||
opts = utils.get_default(opts, {})
|
||||
opts.path_display = utils.get_default(opts.path_display, {})
|
||||
opts.prompt_title = 'LSP Workspace Diagnostics'
|
||||
opts.prompt_title = "LSP Workspace Diagnostics"
|
||||
opts.get_all = true
|
||||
lsp.diagnostics(opts)
|
||||
end
|
||||
@@ -361,14 +363,16 @@ local function check_capabilities(feature)
|
||||
local supported_client = false
|
||||
for _, client in pairs(clients) do
|
||||
supported_client = client.resolved_capabilities[feature]
|
||||
if supported_client then break end
|
||||
if supported_client then
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if supported_client then
|
||||
return true
|
||||
else
|
||||
if #clients == 0 then
|
||||
print("LSP: no client attached")
|
||||
print "LSP: no client attached"
|
||||
else
|
||||
print("LSP: server does not support " .. feature)
|
||||
end
|
||||
@@ -377,11 +381,11 @@ local function check_capabilities(feature)
|
||||
end
|
||||
|
||||
local feature_map = {
|
||||
["code_actions"] = "code_action",
|
||||
["document_symbols"] = "document_symbol",
|
||||
["references"] = "find_references",
|
||||
["definitions"] = "goto_definition",
|
||||
["implementations"] = "implementation",
|
||||
["code_actions"] = "code_action",
|
||||
["document_symbols"] = "document_symbol",
|
||||
["references"] = "find_references",
|
||||
["definitions"] = "goto_definition",
|
||||
["implementations"] = "implementation",
|
||||
["workspace_symbols"] = "workspace_symbol",
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
local themes = require('telescope.themes')
|
||||
local builtin = require('telescope.builtin')
|
||||
local extensions = require('telescope._extensions').manager
|
||||
local config = require('telescope.config')
|
||||
local themes = require "telescope.themes"
|
||||
local builtin = require "telescope.builtin"
|
||||
local extensions = require("telescope._extensions").manager
|
||||
local config = require "telescope.config"
|
||||
local command = {}
|
||||
|
||||
local arg_value = {
|
||||
['nil'] = nil,['""'] = '',['"'] = ''
|
||||
["nil"] = nil,
|
||||
['""'] = "",
|
||||
['"'] = "",
|
||||
}
|
||||
|
||||
local bool_type = {
|
||||
['false'] = false,['true'] = true
|
||||
["false"] = false,
|
||||
["true"] = true,
|
||||
}
|
||||
|
||||
-- convert command line string arguments to
|
||||
@@ -18,17 +21,17 @@ local function convert_user_opts(user_opts)
|
||||
local default_opts = config.values
|
||||
|
||||
local _switch = {
|
||||
['boolean'] = function(key,val)
|
||||
if val == 'false' then
|
||||
["boolean"] = function(key, val)
|
||||
if val == "false" then
|
||||
user_opts[key] = false
|
||||
return
|
||||
end
|
||||
user_opts[key] = true
|
||||
end,
|
||||
['number'] = function(key,val)
|
||||
["number"] = function(key, val)
|
||||
user_opts[key] = tonumber(val)
|
||||
end,
|
||||
['string'] = function(key,val)
|
||||
["string"] = function(key, val)
|
||||
if arg_value[val] ~= nil then
|
||||
user_opts[key] = arg_value[val]
|
||||
return
|
||||
@@ -37,22 +40,22 @@ local function convert_user_opts(user_opts)
|
||||
if bool_type[val] ~= nil then
|
||||
user_opts[key] = bool_type[val]
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
local _switch_metatable = {
|
||||
__index = function(_,k)
|
||||
print(string.format('Type of %s does not match',k))
|
||||
end
|
||||
__index = function(_, k)
|
||||
print(string.format("Type of %s does not match", k))
|
||||
end,
|
||||
}
|
||||
|
||||
setmetatable(_switch,_switch_metatable)
|
||||
setmetatable(_switch, _switch_metatable)
|
||||
|
||||
for key,val in pairs(user_opts) do
|
||||
for key, val in pairs(user_opts) do
|
||||
if default_opts[key] ~= nil then
|
||||
_switch[type(default_opts[key])](key,val)
|
||||
_switch[type(default_opts[key])](key, val)
|
||||
else
|
||||
_switch['string'](key,val)
|
||||
_switch["string"](key, val)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -69,14 +72,14 @@ end
|
||||
local function run_command(args)
|
||||
local user_opts = args or {}
|
||||
if next(user_opts) == nil and not user_opts.cmd then
|
||||
print('[Telescope] your command miss args')
|
||||
print "[Telescope] your command miss args"
|
||||
return
|
||||
end
|
||||
|
||||
local cmd = user_opts.cmd
|
||||
local opts = user_opts.opts or {}
|
||||
local extension_type = user_opts.extension_type or ''
|
||||
local theme = user_opts.theme or ''
|
||||
local extension_type = user_opts.extension_type or ""
|
||||
local theme = user_opts.theme or ""
|
||||
|
||||
if next(opts) ~= nil then
|
||||
convert_user_opts(opts)
|
||||
@@ -96,7 +99,7 @@ local function run_command(args)
|
||||
return
|
||||
end
|
||||
|
||||
if rawget(extensions,cmd) then
|
||||
if rawget(extensions, cmd) then
|
||||
extensions[cmd][cmd](opts)
|
||||
end
|
||||
end
|
||||
@@ -106,12 +109,12 @@ end
|
||||
-- input in command line `Telescope gh <TAB>`
|
||||
-- Returns a list for each extension.
|
||||
function command.get_extensions_subcommand()
|
||||
local exts = require('telescope._extensions').manager
|
||||
local exts = require("telescope._extensions").manager
|
||||
local complete_ext_table = {}
|
||||
for cmd,value in pairs(exts) do
|
||||
for cmd, value in pairs(exts) do
|
||||
if type(value) == "table" then
|
||||
local subcmds = {}
|
||||
for key,_ in pairs(value) do
|
||||
for key, _ in pairs(value) do
|
||||
table.insert(subcmds, key)
|
||||
end
|
||||
complete_ext_table[cmd] = subcmds
|
||||
@@ -121,36 +124,36 @@ function command.get_extensions_subcommand()
|
||||
end
|
||||
|
||||
local split_keywords = {
|
||||
['find_command'] = true,
|
||||
['vimgrep_arguments'] = true,
|
||||
['sections'] = true,
|
||||
['search_dirs'] = true
|
||||
["find_command"] = true,
|
||||
["vimgrep_arguments"] = true,
|
||||
["sections"] = true,
|
||||
["search_dirs"] = true,
|
||||
}
|
||||
|
||||
function command.register_keyword(keyword)
|
||||
split_keywords[keyword] = true
|
||||
end
|
||||
|
||||
function command.load_command(cmd,...)
|
||||
local args = {...}
|
||||
function command.load_command(cmd, ...)
|
||||
local args = { ... }
|
||||
if cmd == nil then
|
||||
run_command({cmd = 'builtin'})
|
||||
run_command { cmd = "builtin" }
|
||||
return
|
||||
end
|
||||
|
||||
local user_opts = {}
|
||||
user_opts['cmd'] = cmd
|
||||
user_opts["cmd"] = cmd
|
||||
user_opts.opts = {}
|
||||
|
||||
for _,arg in ipairs(args) do
|
||||
if arg:find('=',1) == nil then
|
||||
user_opts['extension_type'] = arg
|
||||
for _, arg in ipairs(args) do
|
||||
if arg:find("=", 1) == nil then
|
||||
user_opts["extension_type"] = arg
|
||||
else
|
||||
local param = vim.split(arg,'=')
|
||||
if param[1] == 'theme' then
|
||||
user_opts['theme'] = param[2]
|
||||
local param = vim.split(arg, "=")
|
||||
if param[1] == "theme" then
|
||||
user_opts["theme"] = param[2]
|
||||
elseif split_keywords[param[1]] then
|
||||
user_opts.opts[param[1]] = vim.split(param[2],',')
|
||||
user_opts.opts[param[1]] = vim.split(param[2], ",")
|
||||
else
|
||||
user_opts.opts[param[1]] = param[2]
|
||||
end
|
||||
|
||||
@@ -38,9 +38,9 @@ local smarter_depth_2_extend = function(priority, base)
|
||||
end
|
||||
for key, val in pairs(priority) do
|
||||
if type(val) ~= "table" then
|
||||
result[key] = first_non_null(val,result[key])
|
||||
result[key] = first_non_null(val, result[key])
|
||||
else
|
||||
result[key] = vim.tbl_extend("keep",val,result[key] or {})
|
||||
result[key] = vim.tbl_extend("keep", val, result[key] or {})
|
||||
end
|
||||
end
|
||||
return result
|
||||
@@ -83,10 +83,11 @@ local layout_config_defaults = {
|
||||
|
||||
cursor = {
|
||||
preview_cutoff = 40,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
local layout_config_description = string.format([[
|
||||
local layout_config_description = string.format(
|
||||
[[
|
||||
Determines the default configuration values for layout strategies.
|
||||
See |telescope.layout| for details of the configurations options for
|
||||
each strategy.
|
||||
@@ -98,10 +99,9 @@ local layout_config_description = string.format([[
|
||||
of 50%% of the screen width.
|
||||
|
||||
Default: %s
|
||||
]], vim.inspect(
|
||||
layout_config_defaults,
|
||||
{ newline = "\n ", indent = " " }
|
||||
))
|
||||
]],
|
||||
vim.inspect(layout_config_defaults, { newline = "\n ", indent = " " })
|
||||
)
|
||||
|
||||
-- A table of all the usual defaults for telescope.
|
||||
-- Keys will be the name of the default,
|
||||
@@ -159,19 +159,19 @@ local telescope_defaults = {
|
||||
prompt_prefix = { "> ", [[
|
||||
Will be shown in front of the prompt.
|
||||
|
||||
Default: '> ']]
|
||||
},
|
||||
Default: '> ']] },
|
||||
|
||||
selection_caret = { "> ", [[
|
||||
Will be shown in front of the selection.
|
||||
|
||||
Default: '> ']]
|
||||
},
|
||||
Default: '> ']] },
|
||||
|
||||
entry_prefix = { " ", [[
|
||||
entry_prefix = {
|
||||
" ",
|
||||
[[
|
||||
Prefix in front of each result entry. Current selection not included.
|
||||
|
||||
Default: ' ']]
|
||||
Default: ' ']],
|
||||
},
|
||||
|
||||
initial_mode = { "insert" },
|
||||
@@ -179,10 +179,11 @@ local telescope_defaults = {
|
||||
border = { true, [[
|
||||
Boolean defining if borders are added to Telescope windows.
|
||||
|
||||
Default: true]]
|
||||
},
|
||||
Default: true]] },
|
||||
|
||||
path_display = { {}, [[
|
||||
path_display = {
|
||||
{},
|
||||
[[
|
||||
Determines how file paths are displayed
|
||||
|
||||
path_display can be set to an array with a combination of:
|
||||
@@ -212,10 +213,9 @@ local telescope_defaults = {
|
||||
return string.format("%s (%s)", tail, path)
|
||||
end,
|
||||
|
||||
Default: {}]]
|
||||
Default: {}]],
|
||||
},
|
||||
|
||||
|
||||
borderchars = { { "─", "│", "─", "│", "╭", "╮", "╯", "╰" } },
|
||||
|
||||
get_status_text = {
|
||||
@@ -230,7 +230,9 @@ local telescope_defaults = {
|
||||
end,
|
||||
},
|
||||
|
||||
dynamic_preview_title = { false, [[
|
||||
dynamic_preview_title = {
|
||||
false,
|
||||
[[
|
||||
Will change the title of the preview window dynamically, where it
|
||||
is supported. Means the preview window will for example show the
|
||||
full filename.
|
||||
@@ -238,11 +240,15 @@ local telescope_defaults = {
|
||||
Default: false]],
|
||||
},
|
||||
|
||||
history = { {
|
||||
path = vim.fn.stdpath("data") .. os_sep .. "telescope_history",
|
||||
limit = 100,
|
||||
handler = function(...) return require('telescope.actions.history').get_simple_history(...) end,
|
||||
}, [[
|
||||
history = {
|
||||
{
|
||||
path = vim.fn.stdpath "data" .. os_sep .. "telescope_history",
|
||||
limit = 100,
|
||||
handler = function(...)
|
||||
return require("telescope.actions.history").get_simple_history(...)
|
||||
end,
|
||||
},
|
||||
[[
|
||||
This field handles the configuration for prompt history.
|
||||
By default it is a table, with default values (more below).
|
||||
To disable history, set it to false.
|
||||
@@ -271,7 +277,6 @@ local telescope_defaults = {
|
||||
Default:
|
||||
require('telescope.actions.history').get_simple_history
|
||||
]],
|
||||
|
||||
},
|
||||
|
||||
-- Builtin configuration
|
||||
@@ -289,7 +294,8 @@ local telescope_defaults = {
|
||||
set_env = { nil },
|
||||
|
||||
mappings = {
|
||||
{}, [[
|
||||
{},
|
||||
[[
|
||||
Your mappings to override telescope's default mappings.
|
||||
|
||||
Format is:
|
||||
|
||||
@@ -90,20 +90,24 @@ That's the next step to scrolling.
|
||||
|
||||
--]]
|
||||
|
||||
local get_default = require('telescope.utils').get_default
|
||||
local get_default = require("telescope.utils").get_default
|
||||
|
||||
local resolver = {}
|
||||
local _resolve_map = {}
|
||||
|
||||
-- Booleans
|
||||
_resolve_map[function(val) return val == false end] = function(_, val)
|
||||
_resolve_map[function(val)
|
||||
return val == false
|
||||
end] = function(_, val)
|
||||
return function(...)
|
||||
return val
|
||||
end
|
||||
end
|
||||
|
||||
-- Percentages
|
||||
_resolve_map[function(val) return type(val) == 'number' and val >= 0 and val < 1 end] = function(selector, val)
|
||||
_resolve_map[function(val)
|
||||
return type(val) == "number" and val >= 0 and val < 1
|
||||
end] = function(selector, val)
|
||||
return function(...)
|
||||
local selected = select(selector, ...)
|
||||
return math.floor(val * selected)
|
||||
@@ -111,7 +115,9 @@ _resolve_map[function(val) return type(val) == 'number' and val >= 0 and val < 1
|
||||
end
|
||||
|
||||
-- Numbers
|
||||
_resolve_map[function(val) return type(val) == 'number' and val >= 1 end] = function(selector, val)
|
||||
_resolve_map[function(val)
|
||||
return type(val) == "number" and val >= 1
|
||||
end] = function(selector, val)
|
||||
return function(...)
|
||||
local selected = select(selector, ...)
|
||||
return math.min(val, selected)
|
||||
@@ -126,12 +132,16 @@ end
|
||||
-- function(self, max_columns, max_lines): number
|
||||
--
|
||||
-- Resulting number is used for this configuration value.
|
||||
_resolve_map[function(val) return type(val) == 'function' end] = function(_, val)
|
||||
_resolve_map[function(val)
|
||||
return type(val) == "function"
|
||||
end] = function(_, val)
|
||||
return val
|
||||
end
|
||||
|
||||
-- Add padding option
|
||||
_resolve_map[function(val) return type(val) == 'table' and val['padding'] ~= nil end] = function(selector, val)
|
||||
_resolve_map[function(val)
|
||||
return type(val) == "table" and val["padding"] ~= nil
|
||||
end] = function(selector, val)
|
||||
local resolve_pad = function(value)
|
||||
for k, v in pairs(_resolve_map) do
|
||||
if k(value) then
|
||||
@@ -139,17 +149,16 @@ _resolve_map[function(val) return type(val) == 'table' and val['padding'] ~= nil
|
||||
end
|
||||
end
|
||||
|
||||
error('invalid configuration option for padding:' .. tostring(value))
|
||||
error("invalid configuration option for padding:" .. tostring(value))
|
||||
end
|
||||
|
||||
return function(...)
|
||||
local selected = select(selector, ...)
|
||||
local padding = resolve_pad(val['padding'])
|
||||
local padding = resolve_pad(val["padding"])
|
||||
return math.floor(selected - 2 * padding(...))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--- Converts input to a function that returns the height.
|
||||
--- The input must take one of four forms:
|
||||
--- 1. 0 <= number < 1 <br>
|
||||
@@ -174,7 +183,7 @@ resolver.resolve_height = function(val)
|
||||
end
|
||||
end
|
||||
|
||||
error('invalid configuration option for height:' .. tostring(val))
|
||||
error("invalid configuration option for height:" .. tostring(val))
|
||||
end
|
||||
|
||||
--- Converts input to a function that returns the width.
|
||||
@@ -201,7 +210,7 @@ resolver.resolve_width = function(val)
|
||||
end
|
||||
end
|
||||
|
||||
error('invalid configuration option for width:' .. tostring(val))
|
||||
error("invalid configuration option for width:" .. tostring(val))
|
||||
end
|
||||
|
||||
-- Win option always returns a table with preview, results, and prompt.
|
||||
@@ -226,7 +235,7 @@ end
|
||||
-- prompt = {...},
|
||||
-- }
|
||||
resolver.win_option = function(val, default)
|
||||
if type(val) ~= 'table' or vim.tbl_islist(val) then
|
||||
if type(val) ~= "table" or vim.tbl_islist(val) then
|
||||
if val == nil then
|
||||
val = default
|
||||
end
|
||||
@@ -236,7 +245,7 @@ resolver.win_option = function(val, default)
|
||||
results = val,
|
||||
prompt = val,
|
||||
}
|
||||
elseif type(val) == 'table' then
|
||||
elseif type(val) == "table" then
|
||||
assert(not vim.tbl_islist(val))
|
||||
|
||||
local val_to_set = val[1]
|
||||
|
||||
@@ -5,12 +5,12 @@ local M = {}
|
||||
|
||||
---Validates args for `throttle()` and `debounce()`.
|
||||
local function td_validate(fn, ms)
|
||||
vim.validate{
|
||||
fn = { fn, 'f' },
|
||||
vim.validate {
|
||||
fn = { fn, "f" },
|
||||
ms = {
|
||||
ms,
|
||||
function(v)
|
||||
return type(v) == 'number' and v > 0
|
||||
return type(v) == "number" and v > 0
|
||||
end,
|
||||
"number > 0",
|
||||
},
|
||||
@@ -58,8 +58,8 @@ function M.throttle_trailing(fn, ms, last)
|
||||
if not last then
|
||||
function wrapped_fn(...)
|
||||
if not running then
|
||||
local argv = {...}
|
||||
local argc = select('#', ...)
|
||||
local argv = { ... }
|
||||
local argc = select("#", ...)
|
||||
|
||||
timer:start(ms, 0, function()
|
||||
running = false
|
||||
@@ -71,8 +71,8 @@ function M.throttle_trailing(fn, ms, last)
|
||||
else
|
||||
local argv, argc
|
||||
function wrapped_fn(...)
|
||||
argv = {...}
|
||||
argc = select('#', ...)
|
||||
argv = { ... }
|
||||
argc = select("#", ...)
|
||||
|
||||
if not running then
|
||||
timer:start(ms, 0, function()
|
||||
@@ -126,8 +126,8 @@ function M.debounce_trailing(fn, ms, first)
|
||||
|
||||
if not first then
|
||||
function wrapped_fn(...)
|
||||
local argv = {...}
|
||||
local argc = select('#', ...)
|
||||
local argv = { ... }
|
||||
local argc = select("#", ...)
|
||||
|
||||
timer:start(ms, 0, function()
|
||||
pcall(vim.schedule_wrap(fn), unpack(argv, 1, argc))
|
||||
@@ -136,8 +136,8 @@ function M.debounce_trailing(fn, ms, first)
|
||||
else
|
||||
local argv, argc
|
||||
function wrapped_fn(...)
|
||||
argv = argv or {...}
|
||||
argc = argc or select('#', ...)
|
||||
argv = argv or { ... }
|
||||
argc = argc or select("#", ...)
|
||||
|
||||
timer:start(ms, 0, function()
|
||||
pcall(vim.schedule_wrap(fn), unpack(argv, 1, argc))
|
||||
@@ -163,16 +163,16 @@ function M.test_defer(bouncer, ms, firstlast)
|
||||
|
||||
local timeout = ms or 2000
|
||||
|
||||
local bounced = bouncers[bouncer](
|
||||
function(i) vim.cmd('echom "' .. bouncer .. ': ' .. i .. '"') end,
|
||||
timeout,
|
||||
firstlast
|
||||
)
|
||||
local bounced = bouncers[bouncer](function(i)
|
||||
vim.cmd('echom "' .. bouncer .. ": " .. i .. '"')
|
||||
end, timeout, firstlast)
|
||||
|
||||
for i, _ in ipairs{1,2,3,4,5} do
|
||||
for i, _ in ipairs { 1, 2, 3, 4, 5 } do
|
||||
bounced(i)
|
||||
vim.schedule(function () vim.cmd('echom ' .. i) end)
|
||||
vim.fn.call("wait", {1000, "v:false"})
|
||||
vim.schedule(function()
|
||||
vim.cmd("echom " .. i)
|
||||
end)
|
||||
vim.fn.call("wait", { 1000, "v:false" })
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -9,16 +9,18 @@ deprecated.picker_window_options = function(opts)
|
||||
-- Can be removed in a few weeks.
|
||||
|
||||
if opts.shorten_path then
|
||||
table.insert(messages,
|
||||
"'opts.shorten_path' is no longer valid. Please use 'opts.path_display' instead. " ..
|
||||
"Please See ':help telescope.changelog-839'"
|
||||
table.insert(
|
||||
messages,
|
||||
"'opts.shorten_path' is no longer valid. Please use 'opts.path_display' instead. "
|
||||
.. "Please See ':help telescope.changelog-839'"
|
||||
)
|
||||
end
|
||||
|
||||
if opts.hide_filename then
|
||||
table.insert(messages,
|
||||
"'opts.hide_filename' is no longer valid. Please use 'opts.path_display' instead. " ..
|
||||
"Please See ':help telescope.changelog-839'"
|
||||
table.insert(
|
||||
messages,
|
||||
"'opts.hide_filename' is no longer valid. Please use 'opts.path_display' instead. "
|
||||
.. "Please See ':help telescope.changelog-839'"
|
||||
)
|
||||
end
|
||||
|
||||
@@ -35,19 +37,22 @@ deprecated.picker_window_options = function(opts)
|
||||
end
|
||||
|
||||
if opts.results_width then
|
||||
table.insert(messages,
|
||||
table.insert(
|
||||
messages,
|
||||
"'opts.results_width' actually didn't do anything. Please see ':help telescope.changelog-922'"
|
||||
)
|
||||
end
|
||||
|
||||
if opts.prompt_position then
|
||||
table.insert(messages,
|
||||
table.insert(
|
||||
messages,
|
||||
"'opts.prompt_position' is no longer valid. Please use 'layout_config.prompt_position' instead."
|
||||
)
|
||||
end
|
||||
|
||||
if opts.preview_cutoff then
|
||||
table.insert(messages,
|
||||
table.insert(
|
||||
messages,
|
||||
"'opts.preview_cutoff' is no longer valid. Please use 'layout_config.preview_cutoff' instead."
|
||||
)
|
||||
end
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
local log = require("telescope.log")
|
||||
local log = require "telescope.log"
|
||||
|
||||
local LinkedList = require('telescope.algos.linked_list')
|
||||
local LinkedList = require "telescope.algos.linked_list"
|
||||
|
||||
--[[
|
||||
|
||||
@@ -27,7 +27,7 @@ local EntryManager = {}
|
||||
EntryManager.__index = EntryManager
|
||||
|
||||
function EntryManager:new(max_results, set_entry, info)
|
||||
log.trace("Creating entry_manager...")
|
||||
log.trace "Creating entry_manager..."
|
||||
|
||||
info = info or {}
|
||||
info.looped = 0
|
||||
@@ -136,7 +136,7 @@ function EntryManager:add_entry(picker, score, entry)
|
||||
local info = self.info
|
||||
info.maxed = info.maxed or 0
|
||||
|
||||
local new_container = { entry, score, }
|
||||
local new_container = { entry, score }
|
||||
|
||||
-- Short circuit for bad scores -- they never need to be displayed.
|
||||
-- Just save them and we'll deal with them later.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
local Job = require('plenary.job')
|
||||
local Job = require "plenary.job"
|
||||
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local log = require('telescope.log')
|
||||
local a = require('plenary.async_lib')
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local log = require "telescope.log"
|
||||
local a = require "plenary.async_lib"
|
||||
local await = a.await
|
||||
|
||||
local async_static_finder = require('telescope.finders.async_static_finder')
|
||||
local async_oneshot_finder = require('telescope.finders.async_oneshot_finder')
|
||||
local async_static_finder = require "telescope.finders.async_static_finder"
|
||||
local async_oneshot_finder = require "telescope.finders.async_oneshot_finder"
|
||||
-- local async_job_finder = require('telescope.finders.async_job_finder')
|
||||
|
||||
local finders = {}
|
||||
@@ -15,7 +15,9 @@ local _callable_obj = function()
|
||||
local obj = {}
|
||||
|
||||
obj.__index = obj
|
||||
obj.__call = function(t, ...) return t:_find(...) end
|
||||
obj.__call = function(t, ...)
|
||||
return t:_find(...)
|
||||
end
|
||||
|
||||
obj.close = function() end
|
||||
|
||||
@@ -58,10 +60,10 @@ function JobFinder:new(opts)
|
||||
end
|
||||
|
||||
function JobFinder:_find(prompt, process_result, process_complete)
|
||||
log.trace("Finding...")
|
||||
log.trace "Finding..."
|
||||
|
||||
if self.job and not self.job.is_shutdown then
|
||||
log.debug("Shutting down old job")
|
||||
log.debug "Shutting down old job"
|
||||
self.job:shutdown()
|
||||
end
|
||||
|
||||
@@ -78,7 +80,9 @@ function JobFinder:_find(prompt, process_result, process_complete)
|
||||
end
|
||||
|
||||
local opts = self:fn_command(prompt)
|
||||
if not opts then return end
|
||||
if not opts then
|
||||
return
|
||||
end
|
||||
|
||||
local writer = nil
|
||||
if opts.writer and Job.is_job(opts.writer) then
|
||||
@@ -131,7 +135,9 @@ function DynamicFinder:_find(prompt, process_result, process_complete)
|
||||
local results = await(self.fn(prompt))
|
||||
|
||||
for _, result in ipairs(results) do
|
||||
if process_result(self.entry_maker(result)) then return end
|
||||
if process_result(self.entry_maker(result)) then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
process_complete()
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
local log = require('telescope.log')
|
||||
local Job = require('plenary.job')
|
||||
local log = require "telescope.log"
|
||||
local Job = require "plenary.job"
|
||||
|
||||
local async_lib = require('plenary.async_lib')
|
||||
local async_lib = require "plenary.async_lib"
|
||||
local async = async_lib.async
|
||||
-- local await = async_lib.await
|
||||
local void = async_lib.void
|
||||
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local make_entry = require "telescope.make_entry"
|
||||
|
||||
return function(opts)
|
||||
local entry_maker = opts.entry_maker or make_entry.gen_from_string()
|
||||
@@ -31,12 +31,14 @@ return function(opts)
|
||||
__call = void(async(function(prompt, process_result, process_complete)
|
||||
print("are we callin anything?", job)
|
||||
if job and not job.is_shutdown then
|
||||
log.debug("Shutting down old job")
|
||||
log.debug "Shutting down old job"
|
||||
job:shutdown()
|
||||
end
|
||||
|
||||
local job_opts = fn_command(prompt)
|
||||
if not job_opts then return end
|
||||
if not job_opts then
|
||||
return
|
||||
end
|
||||
|
||||
local writer = nil
|
||||
if job_opts.writer and Job.is_job(job_opts.writer) then
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
local async_lib = require('plenary.async_lib')
|
||||
local async_lib = require "plenary.async_lib"
|
||||
local async = async_lib.async
|
||||
local await = async_lib.await
|
||||
local void = async_lib.void
|
||||
|
||||
local AWAITABLE = 1000
|
||||
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local make_entry = require "telescope.make_entry"
|
||||
|
||||
local Job = require('plenary.job')
|
||||
local Job = require "plenary.job"
|
||||
|
||||
return function(opts)
|
||||
opts = opts or {}
|
||||
@@ -22,7 +22,10 @@ return function(opts)
|
||||
local job_started = false
|
||||
local job_completed = false
|
||||
return setmetatable({
|
||||
close = function() results = {}; job_started = false end,
|
||||
close = function()
|
||||
results = {}
|
||||
job_started = false
|
||||
end,
|
||||
results = results,
|
||||
}, {
|
||||
__call = void(async(function(_, prompt, process_result, process_complete)
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
local async_lib = require('plenary.async_lib')
|
||||
local async_lib = require "plenary.async_lib"
|
||||
local async = async_lib.async
|
||||
local await = async_lib.await
|
||||
local void = async_lib.void
|
||||
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local make_entry = require "telescope.make_entry"
|
||||
|
||||
return function(opts)
|
||||
local input_results
|
||||
if vim.tbl_islist(opts) then input_results = opts
|
||||
else input_results = opts.results end
|
||||
if vim.tbl_islist(opts) then
|
||||
input_results = opts
|
||||
else
|
||||
input_results = opts.results
|
||||
end
|
||||
|
||||
local entry_maker = opts.entry_maker or make_entry.gen_from_string()
|
||||
|
||||
@@ -28,7 +31,9 @@ return function(opts)
|
||||
}, {
|
||||
__call = void(async(function(_, _, process_result, process_complete)
|
||||
for i, v in ipairs(results) do
|
||||
if process_result(v) then break end
|
||||
if process_result(v) then
|
||||
break
|
||||
end
|
||||
|
||||
if i % 1000 == 0 then
|
||||
await(async_lib.scheduler())
|
||||
|
||||
@@ -12,9 +12,16 @@ local from_entry = {}
|
||||
|
||||
function from_entry.path(entry, validate)
|
||||
local path = entry.path and vim.fn.fnameescape(entry.path) or nil
|
||||
if path == nil then path = entry.filename end
|
||||
if path == nil then path = entry.value end
|
||||
if path == nil then print("Invalid entry", vim.inspect(entry)); return end
|
||||
if path == nil then
|
||||
path = entry.filename
|
||||
end
|
||||
if path == nil then
|
||||
path = entry.value
|
||||
end
|
||||
if path == nil then
|
||||
print("Invalid entry", vim.inspect(entry))
|
||||
return
|
||||
end
|
||||
|
||||
if validate and not vim.fn.filereadable(path) then
|
||||
return
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
require('telescope._compat')
|
||||
require "telescope._compat"
|
||||
|
||||
local _extensions = require('telescope._extensions')
|
||||
local _extensions = require "telescope._extensions"
|
||||
|
||||
local telescope = {}
|
||||
|
||||
@@ -33,11 +33,11 @@ function telescope.setup(opts)
|
||||
opts = opts or {}
|
||||
|
||||
if opts.default then
|
||||
error("'default' is not a valid value for setup. See 'defaults'")
|
||||
error "'default' is not a valid value for setup. See 'defaults'"
|
||||
end
|
||||
|
||||
require('telescope.config').set_defaults(opts.defaults)
|
||||
require('telescope.config').set_pickers(opts.pickers)
|
||||
require("telescope.config").set_defaults(opts.defaults)
|
||||
require("telescope.config").set_pickers(opts.pickers)
|
||||
_extensions.set_config(opts.extensions)
|
||||
end
|
||||
|
||||
@@ -55,10 +55,10 @@ end
|
||||
|
||||
--- Use telescope.extensions to reference any extensions within your configuration. <br>
|
||||
--- While the docs currently generate this as a function, it's actually a table. Sorry.
|
||||
telescope.extensions = require('telescope._extensions').manager
|
||||
telescope.extensions = require("telescope._extensions").manager
|
||||
|
||||
telescope.__format_setup_keys = function()
|
||||
local descriptions = require('telescope.config').descriptions
|
||||
local descriptions = require("telescope.config").descriptions
|
||||
|
||||
local names = vim.tbl_keys(descriptions)
|
||||
table.sort(names)
|
||||
@@ -70,12 +70,12 @@ telescope.__format_setup_keys = function()
|
||||
table.insert(result, "")
|
||||
table.insert(result, string.format("%s*telescope.defaults.%s*", string.rep(" ", 70 - 20 - #name), name))
|
||||
table.insert(result, string.format("%s: ~", name))
|
||||
for _, line in ipairs(vim.split(desc, '\n')) do
|
||||
for _, line in ipairs(vim.split(desc, "\n")) do
|
||||
table.insert(result, string.format(" %s", line))
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(result, '</pre>')
|
||||
table.insert(result, "</pre>")
|
||||
return result
|
||||
end
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
local user = vim.loop.os_getenv("USER")
|
||||
local user = vim.loop.os_getenv "USER"
|
||||
|
||||
return require('plenary.log').new {
|
||||
plugin = 'telescope',
|
||||
level = ((user == 'tj' or user == 'tjdevries') and 'debug') or 'warn',
|
||||
return require("plenary.log").new {
|
||||
plugin = "telescope",
|
||||
level = ((user == "tj" or user == "tjdevries") and "debug") or "warn",
|
||||
}
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
local entry_display = require('telescope.pickers.entry_display')
|
||||
local utils = require('telescope.utils')
|
||||
local strings = require('plenary.strings')
|
||||
local Path = require('plenary.path')
|
||||
local entry_display = require "telescope.pickers.entry_display"
|
||||
local utils = require "telescope.utils"
|
||||
local strings = require "plenary.strings"
|
||||
local Path = require "plenary.path"
|
||||
|
||||
local treesitter_type_highlight = {
|
||||
["associated"] = "TSConstant",
|
||||
["constant"] = "TSConstant",
|
||||
["field"] = "TSField",
|
||||
["function"] = "TSFunction",
|
||||
["method"] = "TSMethod",
|
||||
["parameter"] = "TSParameter",
|
||||
["property"] = "TSProperty",
|
||||
["struct"] = "Struct",
|
||||
["var"] = "TSVariableBuiltin",
|
||||
["constant"] = "TSConstant",
|
||||
["field"] = "TSField",
|
||||
["function"] = "TSFunction",
|
||||
["method"] = "TSMethod",
|
||||
["parameter"] = "TSParameter",
|
||||
["property"] = "TSProperty",
|
||||
["struct"] = "Struct",
|
||||
["var"] = "TSVariableBuiltin",
|
||||
}
|
||||
|
||||
local lsp_type_highlight = {
|
||||
["Class"] = "TelescopeResultsClass",
|
||||
["Class"] = "TelescopeResultsClass",
|
||||
["Constant"] = "TelescopeResultsConstant",
|
||||
["Field"] = "TelescopeResultsField",
|
||||
["Field"] = "TelescopeResultsField",
|
||||
["Function"] = "TelescopeResultsFunction",
|
||||
["Method"] = "TelescopeResultsMethod",
|
||||
["Method"] = "TelescopeResultsMethod",
|
||||
["Property"] = "TelescopeResultsOperator",
|
||||
["Struct"] = "TelescopeResultsStruct",
|
||||
["Struct"] = "TelescopeResultsStruct",
|
||||
["Variable"] = "TelescopeResultsVariable",
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ do
|
||||
local mt_string_entry = {
|
||||
__index = function(t, k)
|
||||
return rawget(t, rawget(lookup_keys, k))
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
function make_entry.gen_from_string()
|
||||
@@ -75,7 +75,7 @@ do
|
||||
display, hl_group = utils.transform_devicons(entry.value, display, disable_devicons)
|
||||
|
||||
if hl_group then
|
||||
return display, { { {1, 3}, hl_group } }
|
||||
return display, { { { 1, 3 }, hl_group } }
|
||||
else
|
||||
return display
|
||||
end
|
||||
@@ -83,10 +83,12 @@ do
|
||||
|
||||
mt_file_entry.__index = function(t, k)
|
||||
local raw = rawget(mt_file_entry, k)
|
||||
if raw then return raw end
|
||||
if raw then
|
||||
return raw
|
||||
end
|
||||
|
||||
if k == "path" then
|
||||
local retpath = Path:new({t.cwd, t.value}):absolute()
|
||||
local retpath = Path:new({ t.cwd, t.value }):absolute()
|
||||
if not vim.loop.fs_access(retpath, "R", nil) then
|
||||
retpath = t.value
|
||||
end
|
||||
@@ -97,7 +99,7 @@ do
|
||||
end
|
||||
|
||||
return function(line)
|
||||
return setmetatable({line}, mt_file_entry)
|
||||
return setmetatable({ line }, mt_file_entry)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -114,17 +116,21 @@ do
|
||||
|
||||
local ok
|
||||
ok, lnum = pcall(tonumber, lnum)
|
||||
if not ok then lnum = nil end
|
||||
if not ok then
|
||||
lnum = nil
|
||||
end
|
||||
|
||||
ok, col = pcall(tonumber, col)
|
||||
if not ok then col = nil end
|
||||
if not ok then
|
||||
col = nil
|
||||
end
|
||||
|
||||
t.filename = filename
|
||||
t.lnum = lnum
|
||||
t.col = col
|
||||
t.text = text
|
||||
|
||||
return {filename, lnum, col, text}
|
||||
return { filename, lnum, col, text }
|
||||
end
|
||||
|
||||
--- Special options:
|
||||
@@ -144,7 +150,7 @@ do
|
||||
if Path:new(t.filename):is_absolute() then
|
||||
return t.filename, false
|
||||
else
|
||||
return Path:new({t.cwd, t.filename}):absolute(), false
|
||||
return Path:new({ t.cwd, t.filename }):absolute(), false
|
||||
end
|
||||
end,
|
||||
|
||||
@@ -187,12 +193,12 @@ do
|
||||
|
||||
local display, hl_group = utils.transform_devicons(
|
||||
entry.filename,
|
||||
string.format(display_string, display_filename, coordinates, entry.text),
|
||||
string.format(display_string, display_filename, coordinates, entry.text),
|
||||
disable_devicons
|
||||
)
|
||||
|
||||
if hl_group then
|
||||
return display, { { {1, 3}, hl_group } }
|
||||
return display, { { { 1, 3 }, hl_group } }
|
||||
else
|
||||
return display
|
||||
end
|
||||
@@ -200,12 +206,16 @@ do
|
||||
|
||||
__index = function(t, k)
|
||||
local raw = rawget(mt_vimgrep_entry, k)
|
||||
if raw then return raw end
|
||||
if raw then
|
||||
return raw
|
||||
end
|
||||
|
||||
local executor = rawget(execute_keys, k)
|
||||
if executor then
|
||||
local val, save = executor(t)
|
||||
if save then rawset(t, k, val) end
|
||||
if save then
|
||||
rawset(t, k, val)
|
||||
end
|
||||
return val
|
||||
end
|
||||
|
||||
@@ -214,7 +224,7 @@ do
|
||||
}
|
||||
|
||||
return function(line)
|
||||
return setmetatable({line}, mt_vimgrep_entry)
|
||||
return setmetatable({ line }, mt_vimgrep_entry)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -224,11 +234,11 @@ function make_entry.gen_from_git_stash()
|
||||
if entry == "" then
|
||||
return nil
|
||||
end
|
||||
local splitted = vim.split(entry, ':')
|
||||
local splitted = vim.split(entry, ":")
|
||||
return {
|
||||
value = splitted[1],
|
||||
ordinal = splitted[3],
|
||||
display = splitted[3]
|
||||
display = splitted[3],
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -240,14 +250,14 @@ function make_entry.gen_from_git_commits(opts)
|
||||
separator = " ",
|
||||
items = {
|
||||
{ width = 8 },
|
||||
{ remaining = true }
|
||||
}
|
||||
}
|
||||
{ remaining = true },
|
||||
},
|
||||
}
|
||||
|
||||
local make_display = function(entry)
|
||||
return displayer {
|
||||
{entry.value, "TelescopeResultsIdentifier"},
|
||||
entry.msg
|
||||
{ entry.value, "TelescopeResultsIdentifier" },
|
||||
entry.msg,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -256,7 +266,7 @@ function make_entry.gen_from_git_commits(opts)
|
||||
return nil
|
||||
end
|
||||
|
||||
local sha, msg = string.match(entry, '([^ ]+) (.+)')
|
||||
local sha, msg = string.match(entry, "([^ ]+) (.+)")
|
||||
|
||||
if not msg then
|
||||
sha = entry
|
||||
@@ -265,10 +275,10 @@ function make_entry.gen_from_git_commits(opts)
|
||||
|
||||
return {
|
||||
value = sha,
|
||||
ordinal = sha .. ' ' .. msg,
|
||||
ordinal = sha .. " " .. msg,
|
||||
msg = msg,
|
||||
display = make_display,
|
||||
current_file = opts.current_file
|
||||
current_file = opts.current_file,
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -281,14 +291,14 @@ function make_entry.gen_from_quickfix(opts)
|
||||
items = {
|
||||
{ width = 8 },
|
||||
{ width = 50 },
|
||||
{ remaining = true }
|
||||
}
|
||||
{ remaining = true },
|
||||
},
|
||||
}
|
||||
|
||||
local make_display = function(entry)
|
||||
local filename = utils.transform_path(opts, entry.filename)
|
||||
|
||||
local line_info = {table.concat({entry.lnum, entry.col}, ":"), "TelescopeResultsLineNr"}
|
||||
local line_info = { table.concat({ entry.lnum, entry.col }, ":"), "TelescopeResultsLineNr" }
|
||||
|
||||
return displayer {
|
||||
line_info,
|
||||
@@ -304,10 +314,7 @@ function make_entry.gen_from_quickfix(opts)
|
||||
valid = true,
|
||||
|
||||
value = entry,
|
||||
ordinal = (
|
||||
not opts.ignore_filename and filename
|
||||
or ''
|
||||
) .. ' ' .. entry.text,
|
||||
ordinal = (not opts.ignore_filename and filename or "") .. " " .. entry.text,
|
||||
display = make_display,
|
||||
|
||||
bufnr = entry.bufnr,
|
||||
@@ -326,9 +333,9 @@ function make_entry.gen_from_lsp_symbols(opts)
|
||||
local bufnr = opts.bufnr or vim.api.nvim_get_current_buf()
|
||||
|
||||
local display_items = {
|
||||
{ width = opts.symbol_width or 25 }, -- symbol
|
||||
{ width = opts.symbol_width or 25 }, -- symbol
|
||||
{ width = opts.symbol_type_width or 8 }, -- symbol type
|
||||
{ remaining = true }, -- filename{:optional_lnum+col} OR content preview
|
||||
{ remaining = true }, -- filename{:optional_lnum+col} OR content preview
|
||||
}
|
||||
|
||||
if opts.ignore_filename and opts.show_line then
|
||||
@@ -337,8 +344,8 @@ function make_entry.gen_from_lsp_symbols(opts)
|
||||
|
||||
local displayer = entry_display.create {
|
||||
separator = " ",
|
||||
hl_chars = { ['['] = 'TelescopeBorder', [']'] = 'TelescopeBorder' },
|
||||
items = display_items
|
||||
hl_chars = { ["["] = "TelescopeBorder", ["]"] = "TelescopeBorder" },
|
||||
items = display_items,
|
||||
}
|
||||
|
||||
local make_display = function(entry)
|
||||
@@ -347,18 +354,13 @@ function make_entry.gen_from_lsp_symbols(opts)
|
||||
-- what to show in the last column: filename or symbol information
|
||||
if opts.ignore_filename then -- ignore the filename and show line preview instead
|
||||
-- TODO: fixme - if ignore_filename is set for workspace, bufnr will be incorrect
|
||||
msg = vim.api.nvim_buf_get_lines(
|
||||
bufnr,
|
||||
entry.lnum - 1,
|
||||
entry.lnum,
|
||||
false
|
||||
)[1] or ''
|
||||
msg = vim.api.nvim_buf_get_lines(bufnr, entry.lnum - 1, entry.lnum, false)[1] or ""
|
||||
msg = vim.trim(msg)
|
||||
else
|
||||
local filename = utils.transform_path(opts, entry.filename)
|
||||
|
||||
if opts.show_line then -- show inline line info
|
||||
filename = filename .. " [" ..entry.lnum .. ":" .. entry.col .. "]"
|
||||
filename = filename .. " [" .. entry.lnum .. ":" .. entry.col .. "]"
|
||||
end
|
||||
msg = filename
|
||||
end
|
||||
@@ -366,12 +368,12 @@ function make_entry.gen_from_lsp_symbols(opts)
|
||||
local type_highlight = opts.symbol_highlights or lsp_type_highlight
|
||||
local display_columns = {
|
||||
entry.symbol_name,
|
||||
{entry.symbol_type:lower(), type_highlight[entry.symbol_type], type_highlight[entry.symbol_type]},
|
||||
{ entry.symbol_type:lower(), type_highlight[entry.symbol_type], type_highlight[entry.symbol_type] },
|
||||
msg,
|
||||
}
|
||||
|
||||
if opts.ignore_filename and opts.show_line then
|
||||
table.insert(display_columns, 2, {entry.lnum .. ":" .. entry.col, "TelescopeResultsLineNr"})
|
||||
table.insert(display_columns, 2, { entry.lnum .. ":" .. entry.col, "TelescopeResultsLineNr" })
|
||||
end
|
||||
|
||||
return displayer(display_columns)
|
||||
@@ -380,13 +382,13 @@ function make_entry.gen_from_lsp_symbols(opts)
|
||||
return function(entry)
|
||||
local filename = entry.filename or vim.api.nvim_buf_get_name(entry.bufnr)
|
||||
local symbol_msg = entry.text:gsub(".* | ", "")
|
||||
local symbol_type, symbol_name = symbol_msg:match("%[(.+)%]%s+(.*)")
|
||||
local symbol_type, symbol_name = symbol_msg:match "%[(.+)%]%s+(.*)"
|
||||
|
||||
local ordinal = ""
|
||||
if not opts.ignore_filename and filename then
|
||||
ordinal = filename .. " "
|
||||
end
|
||||
ordinal = ordinal .. symbol_name .. " " .. (symbol_type or "unknown")
|
||||
ordinal = ordinal .. symbol_name .. " " .. (symbol_type or "unknown")
|
||||
return {
|
||||
valid = true,
|
||||
|
||||
@@ -412,7 +414,7 @@ function make_entry.gen_from_buffer(opts)
|
||||
|
||||
local icon_width = 0
|
||||
if not disable_devicons then
|
||||
local icon, _ = utils.get_devicons('fname', disable_devicons)
|
||||
local icon, _ = utils.get_devicons("fname", disable_devicons)
|
||||
icon_width = strings.strdisplaywidth(icon)
|
||||
end
|
||||
|
||||
@@ -434,21 +436,21 @@ function make_entry.gen_from_buffer(opts)
|
||||
local icon, hl_group = utils.get_devicons(entry.filename, disable_devicons)
|
||||
|
||||
return displayer {
|
||||
{entry.bufnr, "TelescopeResultsNumber"},
|
||||
{entry.indicator, "TelescopeResultsComment"},
|
||||
{ entry.bufnr, "TelescopeResultsNumber" },
|
||||
{ entry.indicator, "TelescopeResultsComment" },
|
||||
{ icon, hl_group },
|
||||
display_bufname .. ":" .. entry.lnum
|
||||
}
|
||||
display_bufname .. ":" .. entry.lnum,
|
||||
}
|
||||
end
|
||||
|
||||
return function(entry)
|
||||
local bufname = entry.info.name ~= "" and entry.info.name or '[No Name]'
|
||||
local bufname = entry.info.name ~= "" and entry.info.name or "[No Name]"
|
||||
-- if bufname is inside the cwd, trim that part of the string
|
||||
bufname = Path:new(bufname):normalize(cwd)
|
||||
|
||||
local hidden = entry.info.hidden == 1 and 'h' or 'a'
|
||||
local readonly = vim.api.nvim_buf_get_option(entry.bufnr, 'readonly') and '=' or ' '
|
||||
local changed = entry.info.changed == 1 and '+' or ' '
|
||||
local hidden = entry.info.hidden == 1 and "h" or "a"
|
||||
local readonly = vim.api.nvim_buf_get_option(entry.bufnr, "readonly") and "=" or " "
|
||||
local changed = entry.info.changed == 1 and "+" or " "
|
||||
local indicator = entry.flag .. hidden .. readonly .. changed
|
||||
|
||||
return {
|
||||
@@ -490,28 +492,23 @@ function make_entry.gen_from_treesitter(opts)
|
||||
local type_highlight = opts.symbol_highlights or treesitter_type_highlight
|
||||
|
||||
local make_display = function(entry)
|
||||
local msg = vim.api.nvim_buf_get_lines(
|
||||
bufnr,
|
||||
entry.lnum,
|
||||
entry.lnum,
|
||||
false
|
||||
)[1] or ''
|
||||
local msg = vim.api.nvim_buf_get_lines(bufnr, entry.lnum, entry.lnum, false)[1] or ""
|
||||
msg = vim.trim(msg)
|
||||
|
||||
local display_columns = {
|
||||
entry.text,
|
||||
{entry.kind, type_highlight[entry.kind], type_highlight[entry.kind]},
|
||||
msg
|
||||
{ entry.kind, type_highlight[entry.kind], type_highlight[entry.kind] },
|
||||
msg,
|
||||
}
|
||||
if opts.show_line then
|
||||
table.insert(display_columns, 2, {entry.lnum .. ":" .. entry.col, "TelescopeResultsLineNr"})
|
||||
table.insert(display_columns, 2, { entry.lnum .. ":" .. entry.col, "TelescopeResultsLineNr" })
|
||||
end
|
||||
|
||||
return displayer(display_columns)
|
||||
end
|
||||
|
||||
return function(entry)
|
||||
local ts_utils = require('nvim-treesitter.ts_utils')
|
||||
local ts_utils = require "nvim-treesitter.ts_utils"
|
||||
local start_row, start_col, end_row, _ = ts_utils.get_node_range(entry.node)
|
||||
local node_text = ts_utils.get_node_text(entry.node)[1]
|
||||
return {
|
||||
@@ -530,7 +527,7 @@ function make_entry.gen_from_treesitter(opts)
|
||||
col = start_col,
|
||||
text = node_text,
|
||||
start = start_row,
|
||||
finish = end_row
|
||||
finish = end_row,
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -559,9 +556,11 @@ end
|
||||
|
||||
function make_entry.gen_from_apropos(opts)
|
||||
local sections = {}
|
||||
if #opts.sections == 1 and opts.sections[1] == 'ALL' then
|
||||
if #opts.sections == 1 and opts.sections[1] == "ALL" then
|
||||
setmetatable(sections, {
|
||||
__index = function() return true end,
|
||||
__index = function()
|
||||
return true
|
||||
end,
|
||||
})
|
||||
else
|
||||
for _, section in ipairs(opts.sections) do
|
||||
@@ -570,7 +569,7 @@ function make_entry.gen_from_apropos(opts)
|
||||
end
|
||||
|
||||
local displayer = entry_display.create {
|
||||
separator = ' ',
|
||||
separator = " ",
|
||||
items = {
|
||||
{ width = 30 },
|
||||
{ remaining = true },
|
||||
@@ -579,21 +578,24 @@ function make_entry.gen_from_apropos(opts)
|
||||
|
||||
local make_display = function(entry)
|
||||
return displayer {
|
||||
{ entry.keyword, 'TelescopeResultsFunction' },
|
||||
entry.description
|
||||
{ entry.keyword, "TelescopeResultsFunction" },
|
||||
entry.description,
|
||||
}
|
||||
end
|
||||
|
||||
return function(line)
|
||||
local keyword, cmd, section, desc = line:match'^((.-)%s*%(([^)]+)%).-)%s+%-%s+(.*)$'
|
||||
return keyword and sections[section] and {
|
||||
value = cmd,
|
||||
description = desc,
|
||||
ordinal = cmd,
|
||||
display = make_display,
|
||||
section = section,
|
||||
keyword = keyword,
|
||||
} or nil
|
||||
local keyword, cmd, section, desc = line:match "^((.-)%s*%(([^)]+)%).-)%s+%-%s+(.*)$"
|
||||
return keyword
|
||||
and sections[section]
|
||||
and {
|
||||
value = cmd,
|
||||
description = desc,
|
||||
ordinal = cmd,
|
||||
display = make_display,
|
||||
section = section,
|
||||
keyword = keyword,
|
||||
}
|
||||
or nil
|
||||
end
|
||||
end
|
||||
|
||||
@@ -611,7 +613,7 @@ function make_entry.gen_from_marks(_)
|
||||
lnum = cursor_position[2],
|
||||
col = cursor_position[3],
|
||||
start = cursor_position[2],
|
||||
filename = vim.api.nvim_buf_get_name(cursor_position[1])
|
||||
filename = vim.api.nvim_buf_get_name(cursor_position[1]),
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -619,7 +621,7 @@ end
|
||||
function make_entry.gen_from_registers(_)
|
||||
local displayer = entry_display.create {
|
||||
separator = " ",
|
||||
hl_chars = { ['['] = 'TelescopeBorder', [']'] = 'TelescopeBorder' },
|
||||
hl_chars = { ["["] = "TelescopeBorder", ["]"] = "TelescopeBorder" },
|
||||
items = {
|
||||
{ width = 3 },
|
||||
{ remaining = true },
|
||||
@@ -629,8 +631,8 @@ function make_entry.gen_from_registers(_)
|
||||
local make_display = function(entry)
|
||||
local content = entry.content
|
||||
return displayer {
|
||||
{'[' .. entry.value .. ']', "TelescopeResultsNumber"},
|
||||
type(content) == 'string' and content:gsub('\n','\\n') or content,
|
||||
{ "[" .. entry.value .. "]", "TelescopeResultsNumber" },
|
||||
type(content) == "string" and content:gsub("\n", "\\n") or content,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -640,7 +642,7 @@ function make_entry.gen_from_registers(_)
|
||||
value = entry,
|
||||
ordinal = entry,
|
||||
content = vim.fn.getreg(entry),
|
||||
display = make_display
|
||||
display = make_display,
|
||||
}
|
||||
end
|
||||
end
|
||||
@@ -662,20 +664,22 @@ end
|
||||
|
||||
function make_entry.gen_from_buffer_lines(opts)
|
||||
local displayer = entry_display.create {
|
||||
separator = ' │ ',
|
||||
separator = " │ ",
|
||||
items = {
|
||||
{ width = 5 },
|
||||
{ remaining = true, },
|
||||
{ remaining = true },
|
||||
},
|
||||
}
|
||||
|
||||
local make_display = function(entry)
|
||||
|
||||
return displayer {
|
||||
{ entry.lnum, opts.lnum_highlight_group or 'TelescopeResultsSpecialComment' },
|
||||
{ entry.lnum, opts.lnum_highlight_group or "TelescopeResultsSpecialComment" },
|
||||
{
|
||||
entry.text, function()
|
||||
if not opts.line_highlights then return {} end
|
||||
entry.text,
|
||||
function()
|
||||
if not opts.line_highlights then
|
||||
return {}
|
||||
end
|
||||
|
||||
local line_hl = opts.line_highlights[entry.lnum] or {}
|
||||
-- TODO: We could probably squash these together if the are the same...
|
||||
@@ -683,17 +687,17 @@ function make_entry.gen_from_buffer_lines(opts)
|
||||
local result = {}
|
||||
|
||||
for col, hl in pairs(line_hl) do
|
||||
table.insert(result, { {col, col+1}, hl })
|
||||
table.insert(result, { { col, col + 1 }, hl })
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
end,
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
return function(entry)
|
||||
if opts.skip_empty_lines and string.match(entry.text, '^$') then
|
||||
if opts.skip_empty_lines and string.match(entry.text, "^$") then
|
||||
return
|
||||
end
|
||||
|
||||
@@ -713,12 +717,12 @@ function make_entry.gen_from_vimoptions()
|
||||
local ok, value_origin
|
||||
|
||||
local option = {
|
||||
name = "",
|
||||
description = "",
|
||||
name = "",
|
||||
description = "",
|
||||
current_value = "",
|
||||
default_value = "",
|
||||
value_type = "",
|
||||
set_by_user = false,
|
||||
value_type = "",
|
||||
set_by_user = false,
|
||||
last_set_from = "",
|
||||
}
|
||||
|
||||
@@ -772,7 +776,7 @@ function make_entry.gen_from_vimoptions()
|
||||
|
||||
local displayer = entry_display.create {
|
||||
separator = "",
|
||||
hl_chars = { ['['] = 'TelescopeBorder', [']'] = 'TelescopeBorder' },
|
||||
hl_chars = { ["["] = "TelescopeBorder", ["]"] = "TelescopeBorder" },
|
||||
items = {
|
||||
{ width = 25 },
|
||||
{ width = 12 },
|
||||
@@ -781,10 +785,9 @@ function make_entry.gen_from_vimoptions()
|
||||
}
|
||||
|
||||
local make_display = function(entry)
|
||||
|
||||
return displayer {
|
||||
{entry.name, "Keyword"},
|
||||
{"["..entry.value_type.."]", "Type"},
|
||||
{ entry.name, "Keyword" },
|
||||
{ "[" .. entry.value_type .. "]", "Type" },
|
||||
utils.display_termcodes(tostring(entry.current_value)),
|
||||
entry.description,
|
||||
}
|
||||
@@ -796,9 +799,9 @@ function make_entry.gen_from_vimoptions()
|
||||
return
|
||||
end
|
||||
|
||||
entry.valid = true
|
||||
entry.valid = true
|
||||
entry.display = make_display
|
||||
entry.value = line
|
||||
entry.value = line
|
||||
entry.ordinal = line.full_name
|
||||
-- entry.raw_value = d.raw_value
|
||||
-- entry.last_set_from = d.last_set_from
|
||||
@@ -813,7 +816,7 @@ function make_entry.gen_from_ctags(opts)
|
||||
opts = opts or {}
|
||||
|
||||
local cwd = vim.fn.expand(opts.cwd or vim.fn.getcwd())
|
||||
local current_file = Path:new(vim.fn.expand('%')):normalize(cwd)
|
||||
local current_file = Path:new(vim.fn.expand "%"):normalize(cwd)
|
||||
|
||||
local display_items = {
|
||||
{ remaining = true },
|
||||
@@ -855,7 +858,7 @@ function make_entry.gen_from_ctags(opts)
|
||||
end
|
||||
|
||||
return function(line)
|
||||
if line == '' or line:sub(1, 1) == '!' then
|
||||
if line == "" or line:sub(1, 1) == "!" then
|
||||
return nil
|
||||
end
|
||||
|
||||
@@ -864,7 +867,7 @@ function make_entry.gen_from_ctags(opts)
|
||||
tag, file, scode = string.match(line, '([^\t]+)\t([^\t]+)\t/^\t?(.*)/;"\t+.*')
|
||||
if not tag then
|
||||
-- hasktags gives us: 'tags\tfile\tlnum'
|
||||
tag, file, lnum = string.match(line, '([^\t]+)\t([^\t]+)\t(%d+).*')
|
||||
tag, file, lnum = string.match(line, "([^\t]+)\t([^\t]+)\t(%d+).*")
|
||||
end
|
||||
|
||||
if opts.only_current_file and file ~= current_file then
|
||||
@@ -876,7 +879,7 @@ function make_entry.gen_from_ctags(opts)
|
||||
if opts.only_sort_tags then
|
||||
ordinal = tag
|
||||
else
|
||||
ordinal = file .. ': ' .. tag
|
||||
ordinal = file .. ": " .. tag
|
||||
end
|
||||
|
||||
return {
|
||||
@@ -903,11 +906,12 @@ function make_entry.gen_from_lsp_diagnostics(opts)
|
||||
signs = {}
|
||||
for severity, _ in pairs(lsp_type_diagnostic) do
|
||||
-- pcall to catch entirely unbound or cleared out sign hl group
|
||||
if type(severity) == 'string' then
|
||||
local status, sign = pcall(
|
||||
function() return vim.trim(vim.fn.sign_getdefined("LspDiagnosticsSign" .. severity)[1].text) end)
|
||||
if type(severity) == "string" then
|
||||
local status, sign = pcall(function()
|
||||
return vim.trim(vim.fn.sign_getdefined("LspDiagnosticsSign" .. severity)[1].text)
|
||||
end)
|
||||
if not status then
|
||||
sign = severity:sub(1,1)
|
||||
sign = severity:sub(1, 1)
|
||||
end
|
||||
signs[severity] = sign
|
||||
end
|
||||
@@ -916,13 +920,15 @@ function make_entry.gen_from_lsp_diagnostics(opts)
|
||||
|
||||
local layout = {
|
||||
{ width = utils.if_nil(signs, 8, 10) },
|
||||
{ remaining = true }
|
||||
{ remaining = true },
|
||||
}
|
||||
local line_width = utils.get_default(opts.line_width, 45)
|
||||
if not utils.is_path_hidden(opts) then table.insert(layout, 2, {width = line_width}) end
|
||||
if not utils.is_path_hidden(opts) then
|
||||
table.insert(layout, 2, { width = line_width })
|
||||
end
|
||||
local displayer = entry_display.create {
|
||||
separator = "▏",
|
||||
items = layout
|
||||
items = layout,
|
||||
}
|
||||
|
||||
local make_display = function(entry)
|
||||
@@ -932,7 +938,7 @@ function make_entry.gen_from_lsp_diagnostics(opts)
|
||||
local pos = string.format("%4d:%2d", entry.lnum, entry.col)
|
||||
local line_info = {
|
||||
(signs and signs[entry.type] .. " " or "") .. pos,
|
||||
"LspDiagnosticsDefault" .. entry.type
|
||||
"LspDiagnosticsDefault" .. entry.type,
|
||||
}
|
||||
|
||||
return displayer {
|
||||
@@ -949,10 +955,7 @@ function make_entry.gen_from_lsp_diagnostics(opts)
|
||||
valid = true,
|
||||
|
||||
value = entry,
|
||||
ordinal = (
|
||||
not opts.ignore_filename and filename
|
||||
or ''
|
||||
) .. ' ' .. entry.text,
|
||||
ordinal = (not opts.ignore_filename and filename or "") .. " " .. entry.text,
|
||||
display = make_display,
|
||||
filename = filename,
|
||||
type = entry.type,
|
||||
@@ -965,7 +968,6 @@ function make_entry.gen_from_lsp_diagnostics(opts)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function make_entry.gen_from_autocommands(_)
|
||||
local displayer = entry_display.create {
|
||||
separator = "▏",
|
||||
@@ -979,26 +981,26 @@ function make_entry.gen_from_autocommands(_)
|
||||
|
||||
local make_display = function(entry)
|
||||
return displayer {
|
||||
{entry.event, "vimAutoEvent"},
|
||||
{entry.group , "vimAugroup"},
|
||||
{entry.ft_pattern, "vimAutoCmdSfxList"},
|
||||
entry.command
|
||||
{ entry.event, "vimAutoEvent" },
|
||||
{ entry.group, "vimAugroup" },
|
||||
{ entry.ft_pattern, "vimAutoCmdSfxList" },
|
||||
entry.command,
|
||||
}
|
||||
end
|
||||
|
||||
-- TODO: <action> dump current filtered items to buffer
|
||||
return function(entry)
|
||||
return {
|
||||
event = entry.event,
|
||||
group = entry.group,
|
||||
event = entry.event,
|
||||
group = entry.group,
|
||||
ft_pattern = entry.ft_pattern,
|
||||
command = entry.command,
|
||||
value = string.format("+%d %s", entry.source_lnum, entry.source_file),
|
||||
command = entry.command,
|
||||
value = string.format("+%d %s", entry.source_lnum, entry.source_file),
|
||||
source_file = entry.source_file,
|
||||
source_lnum = entry.source_lnum,
|
||||
--
|
||||
valid = true,
|
||||
ordinal = entry.event .. " " .. entry.group .. " " .. entry.ft_pattern .. " " .. entry.command,
|
||||
ordinal = entry.event .. " " .. entry.group .. " " .. entry.ft_pattern .. " " .. entry.command,
|
||||
display = make_display,
|
||||
}
|
||||
end
|
||||
@@ -1018,11 +1020,17 @@ function make_entry.gen_from_commands(_)
|
||||
|
||||
local make_display = function(entry)
|
||||
local attrs = ""
|
||||
if entry.bang then attrs = attrs .. "!" end
|
||||
if entry.bar then attrs = attrs .. "|" end
|
||||
if entry.register then attrs = attrs .. '"' end
|
||||
if entry.bang then
|
||||
attrs = attrs .. "!"
|
||||
end
|
||||
if entry.bar then
|
||||
attrs = attrs .. "|"
|
||||
end
|
||||
if entry.register then
|
||||
attrs = attrs .. '"'
|
||||
end
|
||||
return displayer {
|
||||
{entry.name, "TelescopeResultsIdentifier"},
|
||||
{ entry.name, "TelescopeResultsIdentifier" },
|
||||
attrs,
|
||||
entry.nargs,
|
||||
entry.complete or "",
|
||||
@@ -1032,28 +1040,28 @@ function make_entry.gen_from_commands(_)
|
||||
|
||||
return function(entry)
|
||||
return {
|
||||
name = entry.name,
|
||||
bang = entry.bang,
|
||||
nargs = entry.nargs,
|
||||
complete = entry.complete,
|
||||
definition = entry.definition,
|
||||
name = entry.name,
|
||||
bang = entry.bang,
|
||||
nargs = entry.nargs,
|
||||
complete = entry.complete,
|
||||
definition = entry.definition,
|
||||
--
|
||||
value = entry,
|
||||
valid = true,
|
||||
ordinal = entry.name,
|
||||
display = make_display,
|
||||
value = entry,
|
||||
valid = true,
|
||||
ordinal = entry.name,
|
||||
display = make_display,
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
local git_icon_defaults = {
|
||||
added = "+",
|
||||
changed = "~",
|
||||
copied = ">",
|
||||
deleted = "-",
|
||||
renamed = "➡",
|
||||
unmerged = "‡",
|
||||
untracked = "?"
|
||||
added = "+",
|
||||
changed = "~",
|
||||
copied = ">",
|
||||
deleted = "-",
|
||||
renamed = "➡",
|
||||
unmerged = "‡",
|
||||
untracked = "?",
|
||||
}
|
||||
|
||||
function make_entry.gen_from_git_status(opts)
|
||||
@@ -1061,24 +1069,24 @@ function make_entry.gen_from_git_status(opts)
|
||||
|
||||
local col_width = ((opts.git_icons and opts.git_icons.added) and opts.git_icons.added:len() + 2) or 2
|
||||
local displayer = entry_display.create {
|
||||
separator = "",
|
||||
items = {
|
||||
{ width = col_width},
|
||||
{ width = col_width},
|
||||
separator = "",
|
||||
items = {
|
||||
{ width = col_width },
|
||||
{ width = col_width },
|
||||
{ remaining = true },
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
local icons = vim.tbl_extend("keep", opts.git_icons or {}, git_icon_defaults)
|
||||
|
||||
local git_abbrev = {
|
||||
["A"] = {icon = icons.added, hl = "TelescopeResultsDiffAdd"},
|
||||
["U"] = {icon = icons.unmerged, hl = "TelescopeResultsDiffAdd"},
|
||||
["M"] = {icon = icons.changed, hl = "TelescopeResultsDiffChange"},
|
||||
["C"] = {icon = icons.copied, hl = "TelescopeResultsDiffChange"},
|
||||
["R"] = {icon = icons.renamed, hl = "TelescopeResultsDiffChange"},
|
||||
["D"] = {icon = icons.deleted, hl = "TelescopeResultsDiffDelete"},
|
||||
["?"] = {icon = icons.untracked, hl = "TelescopeResultsDiffUntracked"},
|
||||
["A"] = { icon = icons.added, hl = "TelescopeResultsDiffAdd" },
|
||||
["U"] = { icon = icons.unmerged, hl = "TelescopeResultsDiffAdd" },
|
||||
["M"] = { icon = icons.changed, hl = "TelescopeResultsDiffChange" },
|
||||
["C"] = { icon = icons.copied, hl = "TelescopeResultsDiffChange" },
|
||||
["R"] = { icon = icons.renamed, hl = "TelescopeResultsDiffChange" },
|
||||
["D"] = { icon = icons.deleted, hl = "TelescopeResultsDiffDelete" },
|
||||
["?"] = { icon = icons.untracked, hl = "TelescopeResultsDiffUntracked" },
|
||||
}
|
||||
|
||||
local make_display = function(entry)
|
||||
@@ -1087,24 +1095,26 @@ function make_entry.gen_from_git_status(opts)
|
||||
local status_x = git_abbrev[x] or {}
|
||||
local status_y = git_abbrev[y] or {}
|
||||
|
||||
local empty_space = (" ")
|
||||
local empty_space = " "
|
||||
return displayer {
|
||||
{ status_x.icon or empty_space, status_x.hl},
|
||||
{ status_y.icon or empty_space, status_y.hl},
|
||||
{ status_x.icon or empty_space, status_x.hl },
|
||||
{ status_y.icon or empty_space, status_y.hl },
|
||||
entry.value,
|
||||
}
|
||||
end
|
||||
|
||||
return function (entry)
|
||||
if entry == '' then return nil end
|
||||
local mod, file = string.match(entry, '(..).*%s[->%s]?(.+)')
|
||||
return function(entry)
|
||||
if entry == "" then
|
||||
return nil
|
||||
end
|
||||
local mod, file = string.match(entry, "(..).*%s[->%s]?(.+)")
|
||||
|
||||
return {
|
||||
value = file,
|
||||
status = mod,
|
||||
ordinal = entry,
|
||||
display = make_display,
|
||||
path = Path:new({opts.cwd, file}):absolute()
|
||||
path = Path:new({ opts.cwd, file }):absolute(),
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
-- TODO: Customize keymap
|
||||
local a = vim.api
|
||||
|
||||
local actions = require('telescope.actions')
|
||||
local config = require('telescope.config')
|
||||
local actions = require "telescope.actions"
|
||||
local config = require "telescope.config"
|
||||
|
||||
local mappings = {}
|
||||
|
||||
mappings.default_mappings = config.values.default_mappings or {
|
||||
mappings.default_mappings = config.values.default_mappings
|
||||
or {
|
||||
i = {
|
||||
["<C-n>"] = actions.move_selection_next,
|
||||
["<C-p>"] = actions.move_selection_previous,
|
||||
@@ -28,7 +29,7 @@ mappings.default_mappings = config.values.default_mappings or {
|
||||
["<S-Tab>"] = actions.toggle_selection + actions.move_selection_better,
|
||||
["<C-q>"] = actions.send_to_qflist + actions.open_qflist,
|
||||
["<M-q>"] = actions.send_selected_to_qflist + actions.open_qflist,
|
||||
["<C-l>"] = actions.complete_tag
|
||||
["<C-l>"] = actions.complete_tag,
|
||||
},
|
||||
|
||||
n = {
|
||||
@@ -58,13 +59,14 @@ mappings.default_mappings = config.values.default_mappings or {
|
||||
},
|
||||
}
|
||||
|
||||
__TelescopeKeymapStore = __TelescopeKeymapStore or setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
rawset(t, k, {})
|
||||
__TelescopeKeymapStore = __TelescopeKeymapStore
|
||||
or setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
rawset(t, k, {})
|
||||
|
||||
return rawget(t, k)
|
||||
end
|
||||
})
|
||||
return rawget(t, k)
|
||||
end,
|
||||
})
|
||||
local keymap_store = __TelescopeKeymapStore
|
||||
|
||||
local _mapping_key_id = 0
|
||||
@@ -81,7 +83,6 @@ local assign_function = function(prompt_bufnr, func)
|
||||
return func_id
|
||||
end
|
||||
|
||||
|
||||
--[[
|
||||
Usage:
|
||||
|
||||
@@ -107,22 +108,20 @@ local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts)
|
||||
end
|
||||
|
||||
opts = opts or {}
|
||||
if opts.noremap == nil then opts.noremap = true end
|
||||
if opts.silent == nil then opts.silent = true end
|
||||
if opts.noremap == nil then
|
||||
opts.noremap = true
|
||||
end
|
||||
if opts.silent == nil then
|
||||
opts.silent = true
|
||||
end
|
||||
|
||||
if type(key_func) == "string" then
|
||||
key_func = actions[key_func]
|
||||
elseif type(key_func) == "table" then
|
||||
if key_func.type == "command" then
|
||||
a.nvim_buf_set_keymap(
|
||||
prompt_bufnr,
|
||||
mode,
|
||||
key_bind,
|
||||
key_func[1],
|
||||
opts or {
|
||||
silent = true
|
||||
}
|
||||
)
|
||||
a.nvim_buf_set_keymap(prompt_bufnr, mode, key_bind, key_func[1], opts or {
|
||||
silent = true,
|
||||
})
|
||||
return
|
||||
elseif key_func.type == "action_key" then
|
||||
key_func = actions[key_func[1]]
|
||||
@@ -158,13 +157,7 @@ local telescope_map = function(prompt_bufnr, mode, key_bind, key_func, opts)
|
||||
)
|
||||
end
|
||||
|
||||
a.nvim_buf_set_keymap(
|
||||
prompt_bufnr,
|
||||
mode,
|
||||
key_bind,
|
||||
map_string,
|
||||
opts
|
||||
)
|
||||
a.nvim_buf_set_keymap(prompt_bufnr, mode, key_bind, map_string, opts)
|
||||
end
|
||||
|
||||
mappings.apply_keymap = function(prompt_bufnr, attach_mappings, buffer_keymap)
|
||||
@@ -184,7 +177,7 @@ mappings.apply_keymap = function(prompt_bufnr, attach_mappings, buffer_keymap)
|
||||
if attach_results == nil then
|
||||
error(
|
||||
"Attach mappings must always return a value. `true` means use default mappings, "
|
||||
.. "`false` means only use attached mappings"
|
||||
.. "`false` means only use attached mappings"
|
||||
)
|
||||
end
|
||||
|
||||
@@ -218,24 +211,15 @@ mappings.apply_keymap = function(prompt_bufnr, attach_mappings, buffer_keymap)
|
||||
end
|
||||
end
|
||||
|
||||
vim.cmd(string.format(
|
||||
[[autocmd BufDelete %s :lua require('telescope.mappings').clear(%s)]],
|
||||
prompt_bufnr,
|
||||
prompt_bufnr
|
||||
))
|
||||
vim.cmd(
|
||||
string.format([[autocmd BufDelete %s :lua require('telescope.mappings').clear(%s)]], prompt_bufnr, prompt_bufnr)
|
||||
)
|
||||
end
|
||||
|
||||
mappings.execute_keymap = function(prompt_bufnr, keymap_identifier)
|
||||
local key_func = keymap_store[prompt_bufnr][keymap_identifier]
|
||||
|
||||
assert(
|
||||
key_func,
|
||||
string.format(
|
||||
"Unsure of how we got this failure: %s %s",
|
||||
prompt_bufnr,
|
||||
keymap_identifier
|
||||
)
|
||||
)
|
||||
assert(key_func, string.format("Unsure of how we got this failure: %s %s", prompt_bufnr, keymap_identifier))
|
||||
|
||||
key_func(prompt_bufnr)
|
||||
end
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
local log = require('telescope.log')
|
||||
local log = require "telescope.log"
|
||||
|
||||
local path = {}
|
||||
|
||||
path.separator = package.config:sub(1, 1)
|
||||
path.home = vim.fn.expand("~")
|
||||
path.home = vim.fn.expand "~"
|
||||
|
||||
path.make_relative = function(filepath, cwd)
|
||||
if not cwd or not filepath then return filepath end
|
||||
if not cwd or not filepath then
|
||||
return filepath
|
||||
end
|
||||
|
||||
if filepath:sub(1, #cwd) == cwd then
|
||||
local offset = 0
|
||||
if filepath:sub(1, #cwd) == cwd then
|
||||
local offset = 0
|
||||
-- if cwd does ends in the os separator, we need to take it off
|
||||
if cwd:sub(#cwd, #cwd) ~= path.separator then
|
||||
offset = 1
|
||||
@@ -23,7 +25,7 @@ end
|
||||
|
||||
path.shorten = (function()
|
||||
if jit then
|
||||
local ffi = require('ffi')
|
||||
local ffi = require "ffi"
|
||||
ffi.cdef [[
|
||||
typedef unsigned char char_u;
|
||||
char_u *shorten_dir(char_u *str);
|
||||
@@ -49,7 +51,7 @@ path.normalize = function(filepath, cwd)
|
||||
filepath = path.make_relative(filepath, cwd)
|
||||
|
||||
-- Substitute home directory w/ "~"
|
||||
filepath = filepath:gsub("^" .. path.home, '~', 1)
|
||||
filepath = filepath:gsub("^" .. path.home, "~", 1)
|
||||
|
||||
-- Remove double path separators, it's annoying
|
||||
filepath = filepath:gsub(path.separator .. path.separator, path.separator)
|
||||
@@ -59,9 +61,13 @@ end
|
||||
|
||||
path.read_file = function(filepath)
|
||||
local fd = vim.loop.fs_open(filepath, "r", 438)
|
||||
if fd == nil then return '' end
|
||||
if fd == nil then
|
||||
return ""
|
||||
end
|
||||
local stat = assert(vim.loop.fs_fstat(fd))
|
||||
if stat.type ~= 'file' then return '' end
|
||||
if stat.type ~= "file" then
|
||||
return ""
|
||||
end
|
||||
local data = assert(vim.loop.fs_read(fd, stat.size, 0))
|
||||
assert(vim.loop.fs_close(fd))
|
||||
return data
|
||||
@@ -75,7 +81,9 @@ path.read_file_async = function(filepath, callback)
|
||||
end
|
||||
vim.loop.fs_fstat(fd, function(err_fstat, stat)
|
||||
assert(not err_fstat, err_fstat)
|
||||
if stat.type ~= 'file' then return callback('') end
|
||||
if stat.type ~= "file" then
|
||||
return callback ""
|
||||
end
|
||||
vim.loop.fs_read(fd, stat.size, 0, function(err_read, data)
|
||||
assert(not err_read, err_read)
|
||||
vim.loop.fs_close(fd, function(err_close)
|
||||
@@ -89,7 +97,7 @@ end
|
||||
|
||||
return setmetatable({}, {
|
||||
__index = function(_, k)
|
||||
log.error("telescope.path is deprecated. please use plenary.path instead")
|
||||
log.error "telescope.path is deprecated. please use plenary.path instead"
|
||||
return path[k]
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
@@ -1,38 +1,38 @@
|
||||
local a = vim.api
|
||||
local popup = require('popup')
|
||||
local popup = require "popup"
|
||||
|
||||
local async_lib = require('plenary.async_lib')
|
||||
local async_lib = require "plenary.async_lib"
|
||||
local async_util = async_lib.util
|
||||
|
||||
local async = async_lib.async
|
||||
local await = async_lib.await
|
||||
local channel = async_util.channel
|
||||
|
||||
require('telescope')
|
||||
require "telescope"
|
||||
|
||||
local actions = require('telescope.actions')
|
||||
local action_set = require('telescope.actions.set')
|
||||
local config = require('telescope.config')
|
||||
local debounce = require('telescope.debounce')
|
||||
local deprecated = require('telescope.deprecated')
|
||||
local log = require('telescope.log')
|
||||
local mappings = require('telescope.mappings')
|
||||
local state = require('telescope.state')
|
||||
local utils = require('telescope.utils')
|
||||
local actions = require "telescope.actions"
|
||||
local action_set = require "telescope.actions.set"
|
||||
local config = require "telescope.config"
|
||||
local debounce = require "telescope.debounce"
|
||||
local deprecated = require "telescope.deprecated"
|
||||
local log = require "telescope.log"
|
||||
local mappings = require "telescope.mappings"
|
||||
local state = require "telescope.state"
|
||||
local utils = require "telescope.utils"
|
||||
|
||||
local entry_display = require('telescope.pickers.entry_display')
|
||||
local p_highlighter = require('telescope.pickers.highlights')
|
||||
local p_scroller = require('telescope.pickers.scroller')
|
||||
local p_window = require('telescope.pickers.window')
|
||||
local entry_display = require "telescope.pickers.entry_display"
|
||||
local p_highlighter = require "telescope.pickers.highlights"
|
||||
local p_scroller = require "telescope.pickers.scroller"
|
||||
local p_window = require "telescope.pickers.window"
|
||||
|
||||
local EntryManager = require('telescope.entry_manager')
|
||||
local MultiSelect = require('telescope.pickers.multi')
|
||||
local EntryManager = require "telescope.entry_manager"
|
||||
local MultiSelect = require "telescope.pickers.multi"
|
||||
|
||||
local get_default = utils.get_default
|
||||
|
||||
local ns_telescope_matching = a.nvim_create_namespace('telescope_matching')
|
||||
local ns_telescope_prompt = a.nvim_create_namespace('telescope_prompt')
|
||||
local ns_telescope_prompt_prefix = a.nvim_create_namespace('telescope_prompt_prefix')
|
||||
local ns_telescope_matching = a.nvim_create_namespace "telescope_matching"
|
||||
local ns_telescope_prompt = a.nvim_create_namespace "telescope_prompt"
|
||||
local ns_telescope_prompt_prefix = a.nvim_create_namespace "telescope_prompt_prefix"
|
||||
|
||||
local pickers = {}
|
||||
|
||||
@@ -48,7 +48,7 @@ function Picker:new(opts)
|
||||
opts = opts or {}
|
||||
|
||||
if opts.layout_strategy and opts.get_window_options then
|
||||
error("layout_strategy and get_window_options are not compatible keys")
|
||||
error "layout_strategy and get_window_options are not compatible keys"
|
||||
end
|
||||
|
||||
-- Reset actions for any replaced / enhanced actions.
|
||||
@@ -76,7 +76,7 @@ function Picker:new(opts)
|
||||
_on_input_filter_cb = opts.on_input_filter_cb or function() end,
|
||||
|
||||
finder = opts.finder,
|
||||
sorter = opts.sorter or require('telescope.sorters').empty(),
|
||||
sorter = opts.sorter or require("telescope.sorters").empty(),
|
||||
|
||||
all_previewers = opts.previewer,
|
||||
current_previewer_index = 1,
|
||||
@@ -141,7 +141,7 @@ end
|
||||
---@param index number: The row being displayed
|
||||
---@return number The row for the picker to display in
|
||||
function Picker:get_row(index)
|
||||
if self.sorting_strategy == 'ascending' then
|
||||
if self.sorting_strategy == "ascending" then
|
||||
return index - 1
|
||||
else
|
||||
return self.max_results - index
|
||||
@@ -153,7 +153,7 @@ end
|
||||
---@param row number: The row being displayed
|
||||
---@return number The index in line_manager
|
||||
function Picker:get_index(row)
|
||||
if self.sorting_strategy == 'ascending' then
|
||||
if self.sorting_strategy == "ascending" then
|
||||
return row + 1
|
||||
else
|
||||
return self.max_results - row
|
||||
@@ -161,7 +161,7 @@ function Picker:get_index(row)
|
||||
end
|
||||
|
||||
function Picker:get_reset_row()
|
||||
if self.sorting_strategy == 'ascending' then
|
||||
if self.sorting_strategy == "ascending" then
|
||||
return 0
|
||||
else
|
||||
return self.max_results - 1
|
||||
@@ -169,12 +169,14 @@ function Picker:get_reset_row()
|
||||
end
|
||||
|
||||
function Picker:is_done()
|
||||
if not self.manager then return true end
|
||||
if not self.manager then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function Picker:clear_extra_rows(results_bufnr)
|
||||
if self:is_done() then
|
||||
log.trace("Not clearing due to being already complete")
|
||||
log.trace "Not clearing due to being already complete"
|
||||
return
|
||||
end
|
||||
|
||||
@@ -184,7 +186,7 @@ function Picker:clear_extra_rows(results_bufnr)
|
||||
end
|
||||
|
||||
local worst_line, ok, msg
|
||||
if self.sorting_strategy == 'ascending' then
|
||||
if self.sorting_strategy == "ascending" then
|
||||
local num_results = self.manager:num_results()
|
||||
worst_line = self.max_results - num_results
|
||||
|
||||
@@ -231,28 +233,21 @@ function Picker:highlight_one_row(results_bufnr, prompt, display, row)
|
||||
if highlights then
|
||||
for _, hl in ipairs(highlights) do
|
||||
local highlight, start, finish
|
||||
if type(hl) == 'table' then
|
||||
highlight = hl.highlight or 'TelescopeMatching'
|
||||
if type(hl) == "table" then
|
||||
highlight = hl.highlight or "TelescopeMatching"
|
||||
start = hl.start
|
||||
finish = hl.finish or hl.start
|
||||
elseif type(hl) == 'number' then
|
||||
highlight = 'TelescopeMatching'
|
||||
elseif type(hl) == "number" then
|
||||
highlight = "TelescopeMatching"
|
||||
start = hl
|
||||
finish = hl
|
||||
else
|
||||
error('Invalid higlighter fn')
|
||||
error "Invalid higlighter fn"
|
||||
end
|
||||
|
||||
self:_increment('highlights')
|
||||
self:_increment "highlights"
|
||||
|
||||
vim.api.nvim_buf_add_highlight(
|
||||
results_bufnr,
|
||||
ns_telescope_matching,
|
||||
highlight,
|
||||
row,
|
||||
start - 1,
|
||||
finish
|
||||
)
|
||||
vim.api.nvim_buf_add_highlight(results_bufnr, ns_telescope_matching, highlight, row, start - 1, finish)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -261,7 +256,7 @@ function Picker:highlight_one_row(results_bufnr, prompt, display, row)
|
||||
end
|
||||
|
||||
function Picker:can_select_row(row)
|
||||
if self.sorting_strategy == 'ascending' then
|
||||
if self.sorting_strategy == "ascending" then
|
||||
return row <= self.manager:num_results()
|
||||
else
|
||||
return row >= 0 and row <= self.max_results and row >= self.max_results - self.manager:num_results()
|
||||
@@ -304,47 +299,48 @@ function Picker:find()
|
||||
popup_opts.preview.minheight = popup_opts.preview.height
|
||||
end
|
||||
|
||||
local results_win, results_opts = popup.create('', popup_opts.results)
|
||||
local results_win, results_opts = popup.create("", popup_opts.results)
|
||||
local results_bufnr = a.nvim_win_get_buf(results_win)
|
||||
|
||||
self.results_bufnr = results_bufnr
|
||||
self.results_win = results_win
|
||||
|
||||
-- TODO: Should probably always show all the line for results win, so should implement a resize for the windows
|
||||
a.nvim_win_set_option(results_win, 'wrap', false)
|
||||
a.nvim_win_set_option(results_win, 'winhl', 'Normal:TelescopeNormal')
|
||||
a.nvim_win_set_option(results_win, 'winblend', self.window.winblend)
|
||||
a.nvim_win_set_option(results_win, "wrap", false)
|
||||
a.nvim_win_set_option(results_win, "winhl", "Normal:TelescopeNormal")
|
||||
a.nvim_win_set_option(results_win, "winblend", self.window.winblend)
|
||||
local results_border_win = results_opts.border and results_opts.border.win_id
|
||||
if results_border_win then
|
||||
vim.api.nvim_win_set_option(results_border_win, 'winhl', 'Normal:TelescopeResultsBorder')
|
||||
vim.api.nvim_win_set_option(results_border_win, "winhl", "Normal:TelescopeResultsBorder")
|
||||
end
|
||||
|
||||
|
||||
local preview_win, preview_opts, preview_bufnr
|
||||
if popup_opts.preview then
|
||||
preview_win, preview_opts = popup.create('', popup_opts.preview)
|
||||
preview_win, preview_opts = popup.create("", popup_opts.preview)
|
||||
preview_bufnr = a.nvim_win_get_buf(preview_win)
|
||||
|
||||
a.nvim_win_set_option(preview_win, 'winhl', 'Normal:TelescopePreviewNormal')
|
||||
a.nvim_win_set_option(preview_win, 'winblend', self.window.winblend)
|
||||
a.nvim_win_set_option(preview_win, "winhl", "Normal:TelescopePreviewNormal")
|
||||
a.nvim_win_set_option(preview_win, "winblend", self.window.winblend)
|
||||
local preview_border_win = preview_opts and preview_opts.border and preview_opts.border.win_id
|
||||
if preview_border_win then
|
||||
vim.api.nvim_win_set_option(preview_border_win, 'winhl', 'Normal:TelescopePreviewBorder')
|
||||
vim.api.nvim_win_set_option(preview_border_win, "winhl", "Normal:TelescopePreviewBorder")
|
||||
end
|
||||
end
|
||||
|
||||
-- TODO: We need to center this and make it prettier...
|
||||
local prompt_win, prompt_opts = popup.create('', popup_opts.prompt)
|
||||
local prompt_win, prompt_opts = popup.create("", popup_opts.prompt)
|
||||
local prompt_bufnr = a.nvim_win_get_buf(prompt_win)
|
||||
a.nvim_win_set_option(prompt_win, 'winhl', 'Normal:TelescopeNormal')
|
||||
a.nvim_win_set_option(prompt_win, 'winblend', self.window.winblend)
|
||||
a.nvim_win_set_option(prompt_win, "winhl", "Normal:TelescopeNormal")
|
||||
a.nvim_win_set_option(prompt_win, "winblend", self.window.winblend)
|
||||
local prompt_border_win = prompt_opts.border and prompt_opts.border.win_id
|
||||
if prompt_border_win then vim.api.nvim_win_set_option(prompt_border_win, 'winhl', 'Normal:TelescopePromptBorder') end
|
||||
if prompt_border_win then
|
||||
vim.api.nvim_win_set_option(prompt_border_win, "winhl", "Normal:TelescopePromptBorder")
|
||||
end
|
||||
|
||||
-- Prompt prefix
|
||||
local prompt_prefix = self.prompt_prefix
|
||||
if prompt_prefix ~= '' then
|
||||
a.nvim_buf_set_option(prompt_bufnr, 'buftype', 'prompt')
|
||||
if prompt_prefix ~= "" then
|
||||
a.nvim_buf_set_option(prompt_bufnr, "buftype", "prompt")
|
||||
vim.fn.prompt_setprompt(prompt_bufnr, prompt_prefix)
|
||||
end
|
||||
self.prompt_prefix = prompt_prefix
|
||||
@@ -377,8 +373,12 @@ function Picker:find()
|
||||
return
|
||||
end
|
||||
|
||||
if not first_line then first_line = 0 end
|
||||
if not last_line then last_line = 1 end
|
||||
if not first_line then
|
||||
first_line = 0
|
||||
end
|
||||
if not last_line then
|
||||
last_line = 1
|
||||
end
|
||||
|
||||
if first_line > 0 or last_line > 1 then
|
||||
log.debug("ON_LINES: Bad range", first_line, last_line, self:_get_prompt())
|
||||
@@ -396,7 +396,9 @@ function Picker:find()
|
||||
self.finder = finder
|
||||
end
|
||||
|
||||
if self.sorter then self.sorter:_start(prompt) end
|
||||
if self.sorter then
|
||||
self.sorter:_start(prompt)
|
||||
end
|
||||
|
||||
-- TODO: Entry manager should have a "bulk" setter. This can prevent a lot of redraws from display
|
||||
self.manager = EntryManager:new(self.max_results, self.entry_adder, self.stats)
|
||||
@@ -428,23 +430,27 @@ function Picker:find()
|
||||
self.closed = true
|
||||
|
||||
-- TODO: Should we actually do this?
|
||||
collectgarbage(); collectgarbage()
|
||||
collectgarbage()
|
||||
collectgarbage()
|
||||
end,
|
||||
})
|
||||
|
||||
if self.sorter then self.sorter:_init() end
|
||||
if self.sorter then
|
||||
self.sorter:_init()
|
||||
end
|
||||
async_lib.run(main_loop())
|
||||
status_updater()
|
||||
|
||||
-- TODO: Use WinLeave as well?
|
||||
local on_buf_leave = string.format(
|
||||
[[ autocmd BufLeave <buffer> ++nested ++once :silent lua require('telescope.pickers').on_close_prompt(%s)]],
|
||||
prompt_bufnr)
|
||||
prompt_bufnr
|
||||
)
|
||||
|
||||
vim.cmd([[augroup PickerInsert]])
|
||||
vim.cmd([[ au!]])
|
||||
vim.cmd( on_buf_leave)
|
||||
vim.cmd([[augroup END]])
|
||||
vim.cmd [[augroup PickerInsert]]
|
||||
vim.cmd [[ au!]]
|
||||
vim.cmd(on_buf_leave)
|
||||
vim.cmd [[augroup END]]
|
||||
|
||||
self.prompt_bufnr = prompt_bufnr
|
||||
|
||||
@@ -452,26 +458,31 @@ function Picker:find()
|
||||
self.preview_border = preview_border
|
||||
local preview_border_win = (preview_border and preview_border.win_id) and preview_border.win_id
|
||||
|
||||
state.set_status(prompt_bufnr, setmetatable({
|
||||
prompt_bufnr = prompt_bufnr,
|
||||
prompt_win = prompt_win,
|
||||
prompt_border_win = prompt_border_win,
|
||||
state.set_status(
|
||||
prompt_bufnr,
|
||||
setmetatable({
|
||||
prompt_bufnr = prompt_bufnr,
|
||||
prompt_win = prompt_win,
|
||||
prompt_border_win = prompt_border_win,
|
||||
|
||||
results_bufnr = results_bufnr,
|
||||
results_win = results_win,
|
||||
results_border_win = results_border_win,
|
||||
results_bufnr = results_bufnr,
|
||||
results_win = results_win,
|
||||
results_border_win = results_border_win,
|
||||
|
||||
preview_bufnr = preview_bufnr,
|
||||
preview_win = preview_win,
|
||||
preview_border_win = preview_border_win,
|
||||
picker = self,
|
||||
}, { __mode = 'kv' }))
|
||||
preview_bufnr = preview_bufnr,
|
||||
preview_win = preview_win,
|
||||
preview_border_win = preview_border_win,
|
||||
picker = self,
|
||||
}, {
|
||||
__mode = "kv",
|
||||
})
|
||||
)
|
||||
|
||||
mappings.apply_keymap(prompt_bufnr, self.attach_mappings, config.values.mappings)
|
||||
|
||||
-- Do filetype last, so that users can register at the last second.
|
||||
pcall(a.nvim_buf_set_option, prompt_bufnr, 'filetype', 'TelescopePrompt')
|
||||
pcall(a.nvim_buf_set_option, results_bufnr, 'filetype', 'TelescopeResults')
|
||||
pcall(a.nvim_buf_set_option, prompt_bufnr, "filetype", "TelescopePrompt")
|
||||
pcall(a.nvim_buf_set_option, results_bufnr, "filetype", "TelescopeResults")
|
||||
|
||||
if self.default_text then
|
||||
self:set_prompt(self.default_text)
|
||||
@@ -529,7 +540,9 @@ function Picker:delete_selection(delete_cb)
|
||||
|
||||
-- Sort in reverse order as removing an entry from the table shifts down the
|
||||
-- other elements to close the hole.
|
||||
table.sort(selection_index, function(x, y) return x > y end)
|
||||
table.sort(selection_index, function(x, y)
|
||||
return x > y
|
||||
end)
|
||||
for _, index in ipairs(selection_index) do
|
||||
local selection = table.remove(self.finder.results, index)
|
||||
delete_cb(selection)
|
||||
@@ -548,7 +561,7 @@ end
|
||||
function Picker:set_prompt(str)
|
||||
-- TODO(conni2461): As soon as prompt_buffers are fix use this:
|
||||
-- vim.api.nvim_buf_set_lines(self.prompt_bufnr, 0, 1, false, { str })
|
||||
vim.api.nvim_feedkeys(str, 'n', false)
|
||||
vim.api.nvim_feedkeys(str, "n", false)
|
||||
end
|
||||
|
||||
function Picker.close_windows(status)
|
||||
@@ -566,9 +579,7 @@ function Picker.close_windows(status)
|
||||
end
|
||||
|
||||
local bufnr = vim.api.nvim_win_get_buf(win_id)
|
||||
if bdelete
|
||||
and vim.api.nvim_buf_is_valid(bufnr)
|
||||
and not vim.api.nvim_buf_get_option(bufnr, 'buflisted') then
|
||||
if bdelete and vim.api.nvim_buf_is_valid(bufnr) and not vim.api.nvim_buf_get_option(bufnr, "buflisted") then
|
||||
vim.cmd(string.format("silent! bdelete! %s", bufnr))
|
||||
end
|
||||
|
||||
@@ -650,10 +661,11 @@ end
|
||||
function Picker:_reset_prefix_color(hl_group)
|
||||
self._current_prefix_hl_group = hl_group or nil
|
||||
|
||||
if self.prompt_prefix ~= '' then
|
||||
vim.api.nvim_buf_add_highlight(self.prompt_bufnr,
|
||||
if self.prompt_prefix ~= "" then
|
||||
vim.api.nvim_buf_add_highlight(
|
||||
self.prompt_bufnr,
|
||||
ns_telescope_prompt_prefix,
|
||||
self._current_prefix_hl_group or 'TelescopePromptPrefix',
|
||||
self._current_prefix_hl_group or "TelescopePromptPrefix",
|
||||
0,
|
||||
0,
|
||||
#self.prompt_prefix
|
||||
@@ -665,26 +677,28 @@ end
|
||||
-- TODO(conni2461): Next two functions only work together otherwise color doesn't work
|
||||
-- Probably a issue with prompt buffers
|
||||
function Picker:change_prompt_prefix(new_prefix, hl_group)
|
||||
if not new_prefix then return end
|
||||
if not new_prefix then
|
||||
return
|
||||
end
|
||||
|
||||
if new_prefix ~= '' then
|
||||
if new_prefix ~= "" then
|
||||
vim.fn.prompt_setprompt(self.prompt_bufnr, new_prefix)
|
||||
else
|
||||
vim.api.nvim_buf_set_text(self.prompt_bufnr, 0, 0, 0, #self.prompt_prefix, {})
|
||||
vim.api.nvim_buf_set_option(self.prompt_bufnr, 'buftype', '')
|
||||
vim.api.nvim_buf_set_option(self.prompt_bufnr, "buftype", "")
|
||||
end
|
||||
self.prompt_prefix = new_prefix
|
||||
self:_reset_prefix_color(hl_group)
|
||||
end
|
||||
|
||||
function Picker:reset_prompt(text)
|
||||
local prompt_text = self.prompt_prefix .. (text or '')
|
||||
local prompt_text = self.prompt_prefix .. (text or "")
|
||||
vim.api.nvim_buf_set_lines(self.prompt_bufnr, 0, -1, false, { prompt_text })
|
||||
|
||||
self:_reset_prefix_color(self._current_prefix_hl_group)
|
||||
|
||||
if text then
|
||||
vim.api.nvim_win_set_cursor(self.prompt_win, {1, #prompt_text})
|
||||
vim.api.nvim_win_set_cursor(self.prompt_win, { 1, #prompt_text })
|
||||
end
|
||||
end
|
||||
|
||||
@@ -693,10 +707,14 @@ end
|
||||
function Picker:refresh(finder, opts)
|
||||
opts = opts or {}
|
||||
if opts.new_prefix then
|
||||
local handle = type(opts.new_prefix) == 'table' and unpack or function(x) return x end
|
||||
local handle = type(opts.new_prefix) == "table" and unpack or function(x)
|
||||
return x
|
||||
end
|
||||
self:change_prompt_prefix(handle(opts.new_prefix))
|
||||
end
|
||||
if opts.reset_prompt then self:reset_prompt() end
|
||||
if opts.reset_prompt then
|
||||
self:reset_prompt()
|
||||
end
|
||||
|
||||
if finder then
|
||||
self.finder:close()
|
||||
@@ -708,7 +726,9 @@ function Picker:refresh(finder, opts)
|
||||
end
|
||||
|
||||
function Picker:set_selection(row)
|
||||
if not self.manager then return end
|
||||
if not self.manager then
|
||||
return
|
||||
end
|
||||
|
||||
row = self.scroller(self.max_results, self.manager:num_results(), row)
|
||||
|
||||
@@ -729,11 +749,9 @@ function Picker:set_selection(row)
|
||||
end
|
||||
|
||||
if row > a.nvim_buf_line_count(results_bufnr) then
|
||||
log.debug(string.format(
|
||||
"Should not be possible to get row this large %s %s",
|
||||
row,
|
||||
a.nvim_buf_line_count(results_bufnr)
|
||||
))
|
||||
log.debug(
|
||||
string.format("Should not be possible to get row this large %s %s", row, a.nvim_buf_line_count(results_bufnr))
|
||||
)
|
||||
|
||||
return
|
||||
end
|
||||
@@ -741,7 +759,9 @@ function Picker:set_selection(row)
|
||||
local entry = self.manager:get_entry(self:get_index(row))
|
||||
state.set_global_key("selected_entry", entry)
|
||||
|
||||
if not entry then return end
|
||||
if not entry then
|
||||
return
|
||||
end
|
||||
|
||||
-- TODO: Probably should figure out what the rows are that made this happen...
|
||||
-- Probably something with setting a row that's too high for this?
|
||||
@@ -754,14 +774,13 @@ function Picker:set_selection(row)
|
||||
-- Only change the first couple characters, nvim_buf_set_text leaves the existing highlights
|
||||
a.nvim_buf_set_text(
|
||||
results_bufnr,
|
||||
self._selection_row, 0,
|
||||
self._selection_row, #self.selection_caret,
|
||||
self._selection_row,
|
||||
0,
|
||||
self._selection_row,
|
||||
#self.selection_caret,
|
||||
{ self.entry_prefix }
|
||||
)
|
||||
self.highlighter:hi_multiselect(
|
||||
self._selection_row,
|
||||
self:is_multi_selected(self._selection_entry)
|
||||
)
|
||||
self.highlighter:hi_multiselect(self._selection_row, self:is_multi_selected(self._selection_entry))
|
||||
|
||||
-- local display = a.nvim_buf_get_lines(results_bufnr, old_row, old_row + 1, false)[1]
|
||||
-- display = ' ' .. display
|
||||
@@ -781,10 +800,10 @@ function Picker:set_selection(row)
|
||||
-- TODO: You should go back and redraw the highlights for this line from the sorter.
|
||||
-- That's the only smart thing to do.
|
||||
if not a.nvim_buf_is_valid(results_bufnr) then
|
||||
log.debug("Invalid buf somehow...")
|
||||
log.debug "Invalid buf somehow..."
|
||||
return
|
||||
end
|
||||
a.nvim_buf_set_lines(results_bufnr, row, row + 1, false, {display})
|
||||
a.nvim_buf_set_lines(results_bufnr, row, row + 1, false, { display })
|
||||
|
||||
-- don't highlight the ' ' at the end of caret
|
||||
self.highlighter:hi_selection(row, caret:sub(1, -2))
|
||||
@@ -813,12 +832,9 @@ end
|
||||
function Picker:refresh_previewer()
|
||||
local status = state.get_status(self.prompt_bufnr)
|
||||
if status.preview_win and self.previewer then
|
||||
self:_increment("previewed")
|
||||
self:_increment "previewed"
|
||||
|
||||
self.previewer:preview(
|
||||
self._selection_entry,
|
||||
status
|
||||
)
|
||||
self.previewer:preview(self._selection_entry, status)
|
||||
if self.preview_border then
|
||||
if config.values.dynamic_preview_title == true then
|
||||
self.preview_border:change_title(self.previewer:dynamic_title(self._selection_entry))
|
||||
@@ -831,7 +847,9 @@ end
|
||||
|
||||
function Picker:cycle_previewers(next)
|
||||
local size = #self.all_previewers
|
||||
if size == 1 then return end
|
||||
if size == 1 then
|
||||
return
|
||||
end
|
||||
|
||||
self.current_previewer_index = self.current_previewer_index + next
|
||||
if self.current_previewer_index > size then
|
||||
@@ -845,7 +863,9 @@ function Picker:cycle_previewers(next)
|
||||
end
|
||||
|
||||
function Picker:entry_adder(index, entry, _, insert)
|
||||
if not entry then return end
|
||||
if not entry then
|
||||
return
|
||||
end
|
||||
|
||||
local row = self:get_row(index)
|
||||
|
||||
@@ -867,13 +887,13 @@ function Picker:entry_adder(index, entry, _, insert)
|
||||
local prefix = self.entry_prefix
|
||||
display = prefix .. display
|
||||
|
||||
self:_increment("displayed")
|
||||
self:_increment "displayed"
|
||||
|
||||
-- TODO: Don't need to schedule this if we schedule the adder.
|
||||
local offset = insert and 0 or 1
|
||||
vim.schedule(function()
|
||||
if not vim.api.nvim_buf_is_valid(self.results_bufnr) then
|
||||
log.debug("ON_ENTRY: Invalid buffer")
|
||||
log.debug "ON_ENTRY: Invalid buffer"
|
||||
return
|
||||
end
|
||||
|
||||
@@ -885,12 +905,12 @@ function Picker:entry_adder(index, entry, _, insert)
|
||||
end
|
||||
|
||||
if insert then
|
||||
if self.sorting_strategy == 'descending' then
|
||||
if self.sorting_strategy == "descending" then
|
||||
vim.api.nvim_buf_set_lines(self.results_bufnr, 0, 1, false, {})
|
||||
end
|
||||
end
|
||||
|
||||
local set_ok, msg = pcall(vim.api.nvim_buf_set_lines, self.results_bufnr, row, row + offset, false, {display})
|
||||
local set_ok, msg = pcall(vim.api.nvim_buf_set_lines, self.results_bufnr, row, row + offset, false, { display })
|
||||
if set_ok and display_highlights then
|
||||
self.highlighter:hi_display(row, prefix, display_highlights)
|
||||
end
|
||||
@@ -901,14 +921,13 @@ function Picker:entry_adder(index, entry, _, insert)
|
||||
|
||||
-- This pretty much only fails when people leave newlines in their results.
|
||||
-- So we'll clean it up for them if it fails.
|
||||
if not set_ok and display:find("\n") then
|
||||
if not set_ok and display:find "\n" then
|
||||
display = display:gsub("\n", " | ")
|
||||
vim.api.nvim_buf_set_lines(self.results_bufnr, row, row + 1, false, {display})
|
||||
vim.api.nvim_buf_set_lines(self.results_bufnr, row, row + 1, false, { display })
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
function Picker:_reset_track()
|
||||
self.stats.processed = 0
|
||||
self.stats.displayed = 0
|
||||
@@ -945,7 +964,6 @@ function Picker:_decrement(key)
|
||||
self.stats[key] = (self.stats[key] or 0) - 1
|
||||
end
|
||||
|
||||
|
||||
-- TODO: Decide how much we want to use this.
|
||||
-- Would allow for better debugging of items.
|
||||
function Picker:register_completion_callback(cb)
|
||||
@@ -967,7 +985,9 @@ end
|
||||
function Picker:get_status_updater(prompt_win, prompt_bufnr)
|
||||
return function()
|
||||
local text = self:get_status_text()
|
||||
if self.closed or not vim.api.nvim_buf_is_valid(prompt_bufnr) then return end
|
||||
if self.closed or not vim.api.nvim_buf_is_valid(prompt_bufnr) then
|
||||
return
|
||||
end
|
||||
local current_prompt = vim.api.nvim_buf_get_lines(prompt_bufnr, 0, 1, false)[1]
|
||||
if not current_prompt then
|
||||
return
|
||||
@@ -981,13 +1001,7 @@ function Picker:get_status_updater(prompt_win, prompt_bufnr)
|
||||
|
||||
local padding = string.rep(" ", vim.api.nvim_win_get_width(prompt_win) - prompt_len - #text - 3)
|
||||
vim.api.nvim_buf_clear_namespace(prompt_bufnr, ns_telescope_prompt, 0, 1)
|
||||
vim.api.nvim_buf_set_virtual_text(
|
||||
prompt_bufnr,
|
||||
ns_telescope_prompt,
|
||||
0,
|
||||
{ {padding .. text, "NonText"} },
|
||||
{}
|
||||
)
|
||||
vim.api.nvim_buf_set_virtual_text(prompt_bufnr, ns_telescope_prompt, 0, { { padding .. text, "NonText" } }, {})
|
||||
|
||||
-- TODO: Wait for bfredl
|
||||
-- vim.api.nvim_buf_set_extmark(prompt_bufnr, ns_telescope_prompt, 0, 0, {
|
||||
@@ -997,11 +1011,10 @@ function Picker:get_status_updater(prompt_win, prompt_bufnr)
|
||||
-- virt_text_pos = "eol",
|
||||
-- })
|
||||
|
||||
self:_increment("status")
|
||||
self:_increment "status"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function Picker:get_result_processor(find_id, prompt, status_updater)
|
||||
local cb_add = function(score, entry)
|
||||
self.manager:add_entry(self, score, entry)
|
||||
@@ -1009,17 +1022,15 @@ function Picker:get_result_processor(find_id, prompt, status_updater)
|
||||
end
|
||||
|
||||
local cb_filter = function(_)
|
||||
self:_increment("filtered")
|
||||
self:_increment "filtered"
|
||||
end
|
||||
|
||||
return function(entry)
|
||||
if find_id ~= self._find_id
|
||||
or self.closed
|
||||
or self:is_done() then
|
||||
if find_id ~= self._find_id or self.closed or self:is_done() then
|
||||
return true
|
||||
end
|
||||
|
||||
self:_increment("processed")
|
||||
self:_increment "processed"
|
||||
|
||||
if not entry or entry.valid == false then
|
||||
return
|
||||
@@ -1029,11 +1040,11 @@ function Picker:get_result_processor(find_id, prompt, status_updater)
|
||||
-- a ton of time on large results.
|
||||
log.trace("Processing result... ", entry)
|
||||
for _, v in ipairs(self.file_ignore_patterns or {}) do
|
||||
local file = type(entry.value) == 'string' and entry.value or entry.filename
|
||||
local file = type(entry.value) == "string" and entry.value or entry.filename
|
||||
if file then
|
||||
if string.find(file, v) then
|
||||
log.trace("SKIPPING", entry.value, "because", v)
|
||||
self:_decrement("processed")
|
||||
self:_decrement "processed"
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -1045,18 +1056,20 @@ end
|
||||
|
||||
function Picker:get_result_completor(results_bufnr, find_id, prompt, status_updater)
|
||||
return function()
|
||||
if self.closed == true or self:is_done() then return end
|
||||
if self.closed == true or self:is_done() then
|
||||
return
|
||||
end
|
||||
|
||||
local selection_strategy = self.selection_strategy or 'reset'
|
||||
local selection_strategy = self.selection_strategy or "reset"
|
||||
|
||||
-- TODO: Either: always leave one result or make sure we actually clean up the results when nothing matches
|
||||
if selection_strategy == 'row' then
|
||||
if selection_strategy == "row" then
|
||||
if self._selection_row == nil and self.default_selection_index ~= nil then
|
||||
self:set_selection(self:get_row(self.default_selection_index))
|
||||
else
|
||||
self:set_selection(self:get_selection_row())
|
||||
end
|
||||
elseif selection_strategy == 'follow' then
|
||||
elseif selection_strategy == "follow" then
|
||||
if self._selection_row == nil and self.default_selection_index ~= nil then
|
||||
self:set_selection(self:get_row(self.default_selection_index))
|
||||
else
|
||||
@@ -1069,53 +1082,53 @@ function Picker:get_result_completor(results_bufnr, find_id, prompt, status_upda
|
||||
self:set_selection(self:get_reset_row())
|
||||
end
|
||||
end
|
||||
elseif selection_strategy == 'reset' then
|
||||
elseif selection_strategy == "reset" then
|
||||
if self.default_selection_index ~= nil then
|
||||
self:set_selection(self:get_row(self.default_selection_index))
|
||||
else
|
||||
self:set_selection(self:get_reset_row())
|
||||
end
|
||||
elseif selection_strategy == 'closest' then
|
||||
elseif selection_strategy == "closest" then
|
||||
if prompt == "" and self.default_selection_index ~= nil then
|
||||
self:set_selection(self:get_row(self.default_selection_index))
|
||||
else
|
||||
self:set_selection(self:get_reset_row())
|
||||
end
|
||||
else
|
||||
error('Unknown selection strategy: ' .. selection_strategy)
|
||||
error("Unknown selection strategy: " .. selection_strategy)
|
||||
end
|
||||
|
||||
local current_line = vim.api.nvim_get_current_line():sub(self.prompt_prefix:len() + 1)
|
||||
state.set_global_key('current_line', current_line)
|
||||
state.set_global_key("current_line", current_line)
|
||||
|
||||
status_updater()
|
||||
|
||||
self:clear_extra_rows(results_bufnr)
|
||||
self:highlight_displayed_rows(results_bufnr, prompt)
|
||||
if self.sorter then self.sorter:_finish(prompt) end
|
||||
if self.sorter then
|
||||
self.sorter:_finish(prompt)
|
||||
end
|
||||
|
||||
self:_on_complete()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
pickers.new = function(opts, defaults)
|
||||
local result = {}
|
||||
|
||||
for k, v in pairs(opts or {}) do
|
||||
assert(type(k) == 'string', "Should be string, opts")
|
||||
assert(type(k) == "string", "Should be string, opts")
|
||||
result[k] = v
|
||||
end
|
||||
|
||||
for k, v in pairs(defaults or {}) do
|
||||
if result[k] == nil then
|
||||
assert(type(k) == 'string', "Should be string, defaults")
|
||||
assert(type(k) == "string", "Should be string, defaults")
|
||||
result[k] = v
|
||||
else
|
||||
-- For attach mappings, we want people to be able to pass in another function
|
||||
-- and apply their mappings after we've applied our defaults.
|
||||
if k == 'attach_mappings' then
|
||||
if k == "attach_mappings" then
|
||||
local opt_value = result[k]
|
||||
result[k] = function(...)
|
||||
v(...)
|
||||
@@ -1154,5 +1167,4 @@ end
|
||||
|
||||
pickers._Picker = Picker
|
||||
|
||||
|
||||
return pickers
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
local assert = require('luassert')
|
||||
local builtin = require('telescope.builtin')
|
||||
local log = require('telescope.log')
|
||||
local assert = require "luassert"
|
||||
local builtin = require "telescope.builtin"
|
||||
local log = require "telescope.log"
|
||||
|
||||
local Job = require("plenary.job")
|
||||
local Path = require("plenary.path")
|
||||
local Job = require "plenary.job"
|
||||
local Path = require "plenary.path"
|
||||
|
||||
local tester = {}
|
||||
|
||||
@@ -36,9 +36,9 @@ local execute_test_case = function(location, key, spec)
|
||||
|
||||
if not ok then
|
||||
writer {
|
||||
location = 'Error: ' .. location,
|
||||
location = "Error: " .. location,
|
||||
case = key,
|
||||
expected = 'To succeed and return: ' .. tostring(spec[1]),
|
||||
expected = "To succeed and return: " .. tostring(spec[1]),
|
||||
actual = actual,
|
||||
|
||||
_type = spec._type,
|
||||
@@ -60,7 +60,7 @@ local end_test_cases = function()
|
||||
end
|
||||
|
||||
local invalid_test_case = function(k)
|
||||
writer { case = k, expected = '<a valid key>', actual = k }
|
||||
writer { case = k, expected = "<a valid key>", actual = k }
|
||||
|
||||
end_test_cases()
|
||||
end
|
||||
@@ -93,17 +93,17 @@ tester.picker_feed = function(input, test_cases)
|
||||
vim.defer_fn(function()
|
||||
if test_cases.post_typed then
|
||||
for k, v in ipairs(test_cases.post_typed) do
|
||||
execute_test_case('post_typed', k, v)
|
||||
execute_test_case("post_typed", k, v)
|
||||
end
|
||||
end
|
||||
|
||||
nvim_feed(replace_terms("<CR>"), "")
|
||||
nvim_feed(replace_terms "<CR>", "")
|
||||
end, 20)
|
||||
|
||||
vim.defer_fn(function()
|
||||
if test_cases.post_close then
|
||||
for k, v in ipairs(test_cases.post_close) do
|
||||
execute_test_case('post_close', k, v)
|
||||
execute_test_case("post_close", k, v)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -142,16 +142,13 @@ end
|
||||
|
||||
local get_results_from_file = function(file)
|
||||
local j = Job:new {
|
||||
command = 'nvim',
|
||||
command = "nvim",
|
||||
args = {
|
||||
'--noplugin',
|
||||
'-u',
|
||||
'scripts/minimal_init.vim',
|
||||
'-c',
|
||||
string.format(
|
||||
[[lua require("telescope.pickers._test")._execute("%s")]],
|
||||
file
|
||||
),
|
||||
"--noplugin",
|
||||
"-u",
|
||||
"scripts/minimal_init.vim",
|
||||
"-c",
|
||||
string.format([[lua require("telescope.pickers._test")._execute("%s")]], file),
|
||||
},
|
||||
}
|
||||
|
||||
@@ -166,7 +163,6 @@ local get_results_from_file = function(file)
|
||||
return result_table
|
||||
end
|
||||
|
||||
|
||||
local asserters = {
|
||||
_default = assert.are.same,
|
||||
|
||||
@@ -174,19 +170,12 @@ local asserters = {
|
||||
are_not = assert.are_not.same,
|
||||
}
|
||||
|
||||
|
||||
local check_results = function(results)
|
||||
-- TODO: We should get all the test cases here that fail, not just the first one.
|
||||
for _, v in ipairs(results) do
|
||||
local assertion = asserters[v._type or 'default']
|
||||
local assertion = asserters[v._type or "default"]
|
||||
|
||||
assertion(
|
||||
v.expected,
|
||||
v.actual,
|
||||
string.format("Test Case: %s // %s",
|
||||
v.location,
|
||||
v.case)
|
||||
)
|
||||
assertion(v.expected, v.actual, string.format("Test Case: %s // %s", v.location, v.case))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -208,7 +197,7 @@ tester.run_string = function(contents)
|
||||
end
|
||||
|
||||
tester.run_file = function(filename)
|
||||
local file = './lua/tests/pickers/' .. filename .. '.lua'
|
||||
local file = "./lua/tests/pickers/" .. filename .. ".lua"
|
||||
|
||||
if not Path:new(file):exists() then
|
||||
assert.are.same("<An existing file>", file)
|
||||
@@ -220,7 +209,7 @@ tester.run_file = function(filename)
|
||||
end
|
||||
|
||||
tester.not_ = function(val)
|
||||
val._type = 'are_not'
|
||||
val._type = "are_not"
|
||||
return val
|
||||
end
|
||||
|
||||
@@ -233,9 +222,9 @@ tester._execute = function(filename)
|
||||
local f = loadfile(filename)
|
||||
if not f then
|
||||
writer {
|
||||
location = 'Error: ' .. filename,
|
||||
location = "Error: " .. filename,
|
||||
case = filename,
|
||||
expected = 'To succeed',
|
||||
expected = "To succeed",
|
||||
actual = nil,
|
||||
}
|
||||
end
|
||||
@@ -252,5 +241,4 @@ tester._execute = function(filename)
|
||||
end_test_cases()
|
||||
end
|
||||
|
||||
|
||||
return tester
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
local test_helpers = {}
|
||||
|
||||
test_helpers.get_picker = function()
|
||||
local state = require('telescope.state')
|
||||
local state = require "telescope.state"
|
||||
return state.get_status(vim.api.nvim_get_current_buf()).picker
|
||||
end
|
||||
|
||||
test_helpers.get_results_bufnr = function()
|
||||
local state = require('telescope.state')
|
||||
local state = require "telescope.state"
|
||||
return state.get_status(vim.api.nvim_get_current_buf()).results_bufnr
|
||||
end
|
||||
|
||||
@@ -24,9 +24,9 @@ end
|
||||
|
||||
test_helpers.get_best_result = function()
|
||||
local results = test_helpers.get_results()
|
||||
local picker = test_helpers.get_picker ()
|
||||
local picker = test_helpers.get_picker()
|
||||
|
||||
if picker.sorting_strategy == 'ascending' then
|
||||
if picker.sorting_strategy == "ascending" then
|
||||
return results[1]
|
||||
else
|
||||
return results[#results]
|
||||
@@ -34,8 +34,8 @@ test_helpers.get_best_result = function()
|
||||
end
|
||||
|
||||
test_helpers.get_selection = function()
|
||||
local state = require('telescope.state')
|
||||
return state.get_global_key('selected_entry')
|
||||
local state = require "telescope.state"
|
||||
return state.get_global_key "selected_entry"
|
||||
end
|
||||
|
||||
test_helpers.get_selection_value = function()
|
||||
@@ -43,13 +43,13 @@ test_helpers.get_selection_value = function()
|
||||
end
|
||||
|
||||
test_helpers.make_globals = function()
|
||||
GetFile = test_helpers.get_file -- luacheck: globals GetFile
|
||||
GetPrompt = test_helpers.get_prompt -- luacheck: globals GetPrompt
|
||||
GetFile = test_helpers.get_file -- luacheck: globals GetFile
|
||||
GetPrompt = test_helpers.get_prompt -- luacheck: globals GetPrompt
|
||||
|
||||
GetResults = test_helpers.get_results -- luacheck: globals GetResults
|
||||
GetBestResult = test_helpers.get_best_result -- luacheck: globals GetBestResult
|
||||
GetResults = test_helpers.get_results -- luacheck: globals GetResults
|
||||
GetBestResult = test_helpers.get_best_result -- luacheck: globals GetBestResult
|
||||
|
||||
GetSelection = test_helpers.get_selection -- luacheck: globals GetSelection
|
||||
GetSelection = test_helpers.get_selection -- luacheck: globals GetSelection
|
||||
GetSelectionValue = test_helpers.get_selection_value -- luacheck: globals GetSelectionValue
|
||||
end
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
local strings = require('plenary.strings')
|
||||
local strings = require "plenary.strings"
|
||||
|
||||
local entry_display = {}
|
||||
entry_display.truncate = strings.truncate
|
||||
@@ -9,7 +9,7 @@ entry_display.create = function(configuration)
|
||||
if v.width then
|
||||
local justify = v.right_justify
|
||||
table.insert(generator, function(item)
|
||||
if type(item) == 'table' then
|
||||
if type(item) == "table" then
|
||||
return strings.align_str(entry_display.truncate(item[1], v.width), v.width, justify), item[2]
|
||||
else
|
||||
return strings.align_str(entry_display.truncate(item, v.width), v.width, justify)
|
||||
@@ -17,7 +17,7 @@ entry_display.create = function(configuration)
|
||||
end)
|
||||
else
|
||||
table.insert(generator, function(item)
|
||||
if type(item) == 'table' then
|
||||
if type(item) == "table" then
|
||||
return item[1], item[2]
|
||||
else
|
||||
return item
|
||||
@@ -37,7 +37,7 @@ entry_display.create = function(configuration)
|
||||
for j = 1, (i - 1) do
|
||||
hl_start = hl_start + #results[j] + (#configuration.separator or 1)
|
||||
end
|
||||
local hl_end = hl_start + #str:gsub('%s*$', '')
|
||||
local hl_end = hl_start + #str:gsub("%s*$", "")
|
||||
|
||||
if type(hl) == "function" then
|
||||
for _, hl_res in ipairs(hl()) do
|
||||
@@ -66,7 +66,7 @@ entry_display.create = function(configuration)
|
||||
local final_str = table.concat(results, configuration.separator or "│")
|
||||
if configuration.hl_chars then
|
||||
for i = 1, #final_str do
|
||||
local c = final_str:sub(i,i)
|
||||
local c = final_str:sub(i, i)
|
||||
local hl = configuration.hl_chars[c]
|
||||
if hl then
|
||||
table.insert(highlights, { { i - 1, i }, hl })
|
||||
@@ -78,21 +78,20 @@ entry_display.create = function(configuration)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
entry_display.resolve = function(self, entry)
|
||||
local display, display_highlights
|
||||
if type(entry.display) == 'function' then
|
||||
self:_increment("display_fn")
|
||||
if type(entry.display) == "function" then
|
||||
self:_increment "display_fn"
|
||||
display, display_highlights = entry:display(self)
|
||||
|
||||
if type(display) == 'string' then
|
||||
if type(display) == "string" then
|
||||
return display, display_highlights
|
||||
end
|
||||
else
|
||||
display = entry.display
|
||||
end
|
||||
|
||||
if type(display) == 'string' then
|
||||
if type(display) == "string" then
|
||||
return display, display_highlights
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
local a = vim.api
|
||||
local log = require('telescope.log')
|
||||
local log = require "telescope.log"
|
||||
|
||||
local highlights = {}
|
||||
|
||||
local ns_telescope_selection = a.nvim_create_namespace('telescope_selection')
|
||||
local ns_telescope_multiselection = a.nvim_create_namespace('telescope_mulitselection')
|
||||
local ns_telescope_entry = a.nvim_create_namespace('telescope_entry')
|
||||
local ns_telescope_selection = a.nvim_create_namespace "telescope_selection"
|
||||
local ns_telescope_multiselection = a.nvim_create_namespace "telescope_mulitselection"
|
||||
local ns_telescope_entry = a.nvim_create_namespace "telescope_entry"
|
||||
|
||||
local Highlighter = {}
|
||||
Highlighter.__index = Highlighter
|
||||
@@ -41,11 +41,12 @@ function Highlighter:hi_display(row, prefix, display_highlights)
|
||||
end
|
||||
|
||||
function Highlighter:clear_display()
|
||||
if not self
|
||||
or not self.picker
|
||||
or not self.picker.results_bufnr
|
||||
or not vim.api.nvim_buf_is_valid(self.picker.results_bufnr)
|
||||
then
|
||||
if
|
||||
not self
|
||||
or not self.picker
|
||||
or not self.picker.results_bufnr
|
||||
or not vim.api.nvim_buf_is_valid(self.picker.results_bufnr)
|
||||
then
|
||||
return
|
||||
end
|
||||
|
||||
@@ -66,35 +67,23 @@ function Highlighter:hi_selection(row, caret)
|
||||
local results_bufnr = assert(self.picker.results_bufnr, "Must have a results bufnr")
|
||||
|
||||
a.nvim_buf_clear_namespace(results_bufnr, ns_telescope_selection, 0, -1)
|
||||
a.nvim_buf_add_highlight(
|
||||
results_bufnr,
|
||||
ns_telescope_selection,
|
||||
'TelescopeSelectionCaret',
|
||||
row,
|
||||
0,
|
||||
#caret
|
||||
)
|
||||
a.nvim_buf_add_highlight(results_bufnr, ns_telescope_selection, "TelescopeSelectionCaret", row, 0, #caret)
|
||||
|
||||
a.nvim_buf_add_highlight(
|
||||
results_bufnr,
|
||||
ns_telescope_selection,
|
||||
'TelescopeSelection',
|
||||
row,
|
||||
#caret,
|
||||
-1
|
||||
)
|
||||
a.nvim_buf_add_highlight(results_bufnr, ns_telescope_selection, "TelescopeSelection", row, #caret, -1)
|
||||
end
|
||||
|
||||
function Highlighter:hi_multiselect(row, is_selected)
|
||||
local results_bufnr = assert(self.picker.results_bufnr, "Must have a results bufnr")
|
||||
|
||||
if is_selected then
|
||||
vim.api.nvim_buf_add_highlight(
|
||||
results_bufnr, ns_telescope_multiselection, "TelescopeMultiSelection", row, 0, -1
|
||||
)
|
||||
vim.api.nvim_buf_add_highlight(results_bufnr, ns_telescope_multiselection, "TelescopeMultiSelection", row, 0, -1)
|
||||
else
|
||||
local existing_marks = vim.api.nvim_buf_get_extmarks(
|
||||
results_bufnr, ns_telescope_multiselection, {row, 0}, {row, -1}, {}
|
||||
results_bufnr,
|
||||
ns_telescope_multiselection,
|
||||
{ row, 0 },
|
||||
{ row, -1 },
|
||||
{}
|
||||
)
|
||||
|
||||
-- This is still kind of weird to me, since it seems like I'm erasing stuff
|
||||
@@ -102,12 +91,7 @@ function Highlighter:hi_multiselect(row, is_selected)
|
||||
if #existing_marks > 0 then
|
||||
log.trace("Clearning row: ", row)
|
||||
|
||||
vim.api.nvim_buf_clear_namespace(
|
||||
results_bufnr,
|
||||
ns_telescope_multiselection,
|
||||
row,
|
||||
row + 1
|
||||
)
|
||||
vim.api.nvim_buf_clear_namespace(results_bufnr, ns_telescope_multiselection, row, row + 1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -34,8 +34,8 @@
|
||||
---
|
||||
---@brief ]]
|
||||
|
||||
local resolve = require('telescope.config.resolve')
|
||||
local p_window = require('telescope.pickers.window')
|
||||
local resolve = require "telescope.config.resolve"
|
||||
local p_window = require "telescope.pickers.window"
|
||||
local if_nil = vim.F.if_nil
|
||||
|
||||
local get_border_size = function(opts)
|
||||
@@ -47,8 +47,7 @@ local get_border_size = function(opts)
|
||||
end
|
||||
|
||||
local calc_tabline = function(max_lines)
|
||||
local tbln = (vim.o.showtabline == 2)
|
||||
or (vim.o.showtabline == 1 and #vim.api.nvim_list_tabpages() > 1)
|
||||
local tbln = (vim.o.showtabline == 2) or (vim.o.showtabline == 1 and #vim.api.nvim_list_tabpages() > 1)
|
||||
if tbln then
|
||||
max_lines = max_lines - 1
|
||||
end
|
||||
@@ -88,12 +87,14 @@ local function validate_layout_config(strategy_name, configuration, values, defa
|
||||
local valid_configuration_keys = get_valid_configuration_keys(configuration)
|
||||
|
||||
-- If no default_layout_config provided, check Telescope's config values
|
||||
default_layout_config = if_nil(default_layout_config, require('telescope.config').values.layout_config)
|
||||
default_layout_config = if_nil(default_layout_config, require("telescope.config").values.layout_config)
|
||||
|
||||
local result = {}
|
||||
local get_value = function(k)
|
||||
-- skip "private" items
|
||||
if string.sub(k, 1, 1) == "_" then return end
|
||||
if string.sub(k, 1, 1) == "_" then
|
||||
return
|
||||
end
|
||||
|
||||
local val
|
||||
-- Prioritise options that are specific to this strategy
|
||||
@@ -102,9 +103,7 @@ local function validate_layout_config(strategy_name, configuration, values, defa
|
||||
end
|
||||
|
||||
-- Handle nested layout config values
|
||||
if layout_strategies[k]
|
||||
and strategy_name ~= k
|
||||
and type(val) == 'table' then
|
||||
if layout_strategies[k] and strategy_name ~= k and type(val) == "table" then
|
||||
val = vim.tbl_deep_extend("force", default_layout_config[k], val)
|
||||
end
|
||||
|
||||
@@ -113,8 +112,7 @@ local function validate_layout_config(strategy_name, configuration, values, defa
|
||||
end
|
||||
|
||||
if val == nil then
|
||||
if default_layout_config[strategy_name] ~= nil
|
||||
and default_layout_config[strategy_name][k] ~= nil then
|
||||
if default_layout_config[strategy_name] ~= nil and default_layout_config[strategy_name][k] ~= nil then
|
||||
val = default_layout_config[strategy_name][k]
|
||||
else
|
||||
val = default_layout_config[k]
|
||||
@@ -129,10 +127,14 @@ local function validate_layout_config(strategy_name, configuration, values, defa
|
||||
if not valid_configuration_keys[k] then
|
||||
-- TODO: At some point we'll move to error here,
|
||||
-- but it's a bit annoying to just straight up crash everyone's stuff.
|
||||
vim.api.nvim_err_writeln(string.format(
|
||||
"Unsupported layout_config key for the %s strategy: %s\n%s",
|
||||
strategy_name, k, vim.inspect(values)
|
||||
))
|
||||
vim.api.nvim_err_writeln(
|
||||
string.format(
|
||||
"Unsupported layout_config key for the %s strategy: %s\n%s",
|
||||
strategy_name,
|
||||
k,
|
||||
vim.inspect(values)
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
result[k] = get_value(k)
|
||||
@@ -163,7 +165,7 @@ layout_strategies._format = function(name)
|
||||
return {}
|
||||
end
|
||||
|
||||
local results = {"<pre>", "`picker.layout_config` shared options:"}
|
||||
local results = { "<pre>", "`picker.layout_config` shared options:" }
|
||||
|
||||
local strategy_keys = vim.tbl_keys(strategy_config)
|
||||
table.sort(strategy_keys, function(a, b)
|
||||
@@ -171,12 +173,12 @@ layout_strategies._format = function(name)
|
||||
end)
|
||||
|
||||
local add_value = function(k, val)
|
||||
if type(val) == 'string' then
|
||||
table.insert(results, string.format(' - %s: %s', k, val))
|
||||
elseif type(val) == 'table' then
|
||||
table.insert(results, string.format(' - %s:', k))
|
||||
if type(val) == "string" then
|
||||
table.insert(results, string.format(" - %s: %s", k, val))
|
||||
elseif type(val) == "table" then
|
||||
table.insert(results, string.format(" - %s:", k))
|
||||
for _, line in ipairs(val) do
|
||||
table.insert(results, string.format(' - %s', line))
|
||||
table.insert(results, string.format(" - %s", line))
|
||||
end
|
||||
else
|
||||
error("Unknown type:" .. type(val))
|
||||
@@ -219,13 +221,14 @@ local function make_documented_layout(name, layout_config, layout)
|
||||
max_columns,
|
||||
max_lines,
|
||||
validate_layout_config(
|
||||
name, layout_config, vim.tbl_deep_extend("keep", if_nil(override_layout, {}), if_nil(self.layout_config, {}))
|
||||
name,
|
||||
layout_config,
|
||||
vim.tbl_deep_extend("keep", if_nil(override_layout, {}), if_nil(self.layout_config, {}))
|
||||
)
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--- Horizontal layout has two columns, one for the preview
|
||||
--- and one for the prompt and results.
|
||||
---
|
||||
@@ -249,88 +252,91 @@ end
|
||||
--- </pre>
|
||||
---@eval { ["description"] = require('telescope.pickers.layout_strategies')._format("horizontal") }
|
||||
---
|
||||
layout_strategies.horizontal = make_documented_layout('horizontal', vim.tbl_extend("error", shared_options, {
|
||||
preview_width = { "Change the width of Telescope's preview window", "See |resolver.resolve_width()|", },
|
||||
layout_strategies.horizontal = make_documented_layout(
|
||||
"horizontal",
|
||||
vim.tbl_extend("error", shared_options, {
|
||||
preview_width = { "Change the width of Telescope's preview window", "See |resolver.resolve_width()|" },
|
||||
preview_cutoff = "When columns are less than this value, the preview will be disabled",
|
||||
prompt_position = { "Where to place prompt window.", "Available Values: 'bottom', 'top'" },
|
||||
}), function(self, max_columns, max_lines, layout_config)
|
||||
}),
|
||||
function(self, max_columns, max_lines, layout_config)
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local preview = initial_options.preview
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local preview = initial_options.preview
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
local tbln
|
||||
max_lines, tbln = calc_tabline(max_lines)
|
||||
|
||||
local tbln
|
||||
max_lines, tbln = calc_tabline(max_lines)
|
||||
local width_opt = layout_config.width
|
||||
local picker_width = resolve.resolve_width(width_opt)(self, max_columns, max_lines)
|
||||
local width_padding = math.floor((max_columns - picker_width) / 2)
|
||||
|
||||
local width_opt = layout_config.width
|
||||
local picker_width = resolve.resolve_width(width_opt)(self, max_columns, max_lines)
|
||||
local width_padding = math.floor((max_columns - picker_width)/2)
|
||||
local height_opt = layout_config.height
|
||||
local picker_height = resolve.resolve_height(height_opt)(self, max_columns, max_lines)
|
||||
local height_padding = math.floor((max_lines - picker_height) / 2)
|
||||
|
||||
local height_opt = layout_config.height
|
||||
local picker_height = resolve.resolve_height(height_opt)(self, max_columns, max_lines)
|
||||
local height_padding = math.floor((max_lines - picker_height)/2)
|
||||
if self.previewer and max_columns >= layout_config.preview_cutoff then
|
||||
preview.width = resolve.resolve_width(if_nil(layout_config.preview_width, function(_, cols)
|
||||
if cols < 150 then
|
||||
return math.floor(cols * 0.4)
|
||||
elseif cols < 200 then
|
||||
return 80
|
||||
else
|
||||
return 120
|
||||
end
|
||||
end))(self, picker_width, max_lines)
|
||||
else
|
||||
preview.width = 0
|
||||
end
|
||||
|
||||
if self.previewer and max_columns >= layout_config.preview_cutoff then
|
||||
preview.width = resolve.resolve_width(if_nil(layout_config.preview_width, function(_, cols)
|
||||
if cols < 150 then
|
||||
return math.floor(cols * 0.4)
|
||||
elseif cols < 200 then
|
||||
return 80
|
||||
else
|
||||
return 120
|
||||
end
|
||||
end))(self, picker_width, max_lines)
|
||||
else
|
||||
preview.width = 0
|
||||
results.width = picker_width - preview.width
|
||||
prompt.width = picker_width - preview.width
|
||||
|
||||
prompt.height = 1
|
||||
results.height = picker_height - prompt.height - 2
|
||||
|
||||
if self.previewer then
|
||||
preview.height = picker_height
|
||||
else
|
||||
preview.height = 0
|
||||
end
|
||||
|
||||
-- Default value is false, to use the normal horizontal layout
|
||||
if not layout_config.mirror then
|
||||
results.col = width_padding
|
||||
prompt.col = width_padding
|
||||
preview.col = results.col + results.width + 2
|
||||
else
|
||||
preview.col = width_padding
|
||||
prompt.col = preview.col + preview.width + 2
|
||||
results.col = preview.col + preview.width + 2
|
||||
end
|
||||
|
||||
preview.line = height_padding
|
||||
if layout_config.prompt_position == "top" then
|
||||
prompt.line = height_padding
|
||||
results.line = prompt.line + prompt.height + 2
|
||||
elseif layout_config.prompt_position == "bottom" then
|
||||
results.line = height_padding
|
||||
prompt.line = results.line + results.height + 2
|
||||
else
|
||||
error("Unknown prompt_position: " .. tostring(self.window.prompt_position) .. "\n" .. vim.inspect(layout_config))
|
||||
end
|
||||
|
||||
if tbln then
|
||||
prompt.line = prompt.line + 1
|
||||
results.line = results.line + 1
|
||||
preview.line = preview.line + 1
|
||||
end
|
||||
|
||||
return {
|
||||
preview = self.previewer and preview.width > 0 and preview,
|
||||
results = results,
|
||||
prompt = prompt,
|
||||
}
|
||||
end
|
||||
|
||||
results.width = picker_width - preview.width
|
||||
prompt.width = picker_width - preview.width
|
||||
|
||||
prompt.height = 1
|
||||
results.height = picker_height - prompt.height - 2
|
||||
|
||||
if self.previewer then
|
||||
preview.height = picker_height
|
||||
else
|
||||
preview.height = 0
|
||||
end
|
||||
|
||||
-- Default value is false, to use the normal horizontal layout
|
||||
if not layout_config.mirror then
|
||||
results.col = width_padding
|
||||
prompt.col = width_padding
|
||||
preview.col = results.col + results.width + 2
|
||||
else
|
||||
preview.col = width_padding
|
||||
prompt.col = preview.col + preview.width + 2
|
||||
results.col = preview.col + preview.width + 2
|
||||
end
|
||||
|
||||
preview.line = height_padding
|
||||
if layout_config.prompt_position == "top" then
|
||||
prompt.line = height_padding
|
||||
results.line = prompt.line + prompt.height + 2
|
||||
elseif layout_config.prompt_position == "bottom" then
|
||||
results.line = height_padding
|
||||
prompt.line = results.line + results.height + 2
|
||||
else
|
||||
error("Unknown prompt_position: " .. tostring(self.window.prompt_position) .. "\n" .. vim.inspect(layout_config))
|
||||
end
|
||||
|
||||
if tbln then
|
||||
prompt.line = prompt.line + 1
|
||||
results.line = results.line + 1
|
||||
preview.line = preview.line + 1
|
||||
end
|
||||
|
||||
return {
|
||||
preview = self.previewer and preview.width > 0 and preview,
|
||||
results = results,
|
||||
prompt = prompt
|
||||
}
|
||||
end)
|
||||
)
|
||||
|
||||
--- Centered layout with a combined block of the prompt
|
||||
--- and results aligned to the middle of the screen.
|
||||
@@ -358,67 +364,70 @@ end)
|
||||
--- </pre>
|
||||
---@eval { ["description"] = require("telescope.pickers.layout_strategies")._format("center") }
|
||||
---
|
||||
layout_strategies.center = make_documented_layout("center", vim.tbl_extend("error", shared_options, {
|
||||
preview_cutoff = "When lines are less than this value, the preview will be disabled",
|
||||
}), function(self, max_columns, max_lines,layout_config)
|
||||
layout_strategies.center = make_documented_layout(
|
||||
"center",
|
||||
vim.tbl_extend("error", shared_options, {
|
||||
preview_cutoff = "When lines are less than this value, the preview will be disabled",
|
||||
}),
|
||||
function(self, max_columns, max_lines, layout_config)
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local preview = initial_options.preview
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local preview = initial_options.preview
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
local tbln
|
||||
max_lines, tbln = calc_tabline(max_lines)
|
||||
|
||||
local tbln
|
||||
max_lines, tbln = calc_tabline(max_lines)
|
||||
-- This sets the width for the whole layout
|
||||
local width_opt = layout_config.width
|
||||
local width = resolve.resolve_width(width_opt)(self, max_columns, max_lines)
|
||||
|
||||
-- This sets the width for the whole layout
|
||||
local width_opt = layout_config.width
|
||||
local width = resolve.resolve_width(width_opt)(self, max_columns, max_lines)
|
||||
-- This sets the number of results displayed
|
||||
local res_height_opt = layout_config.height
|
||||
local res_height = resolve.resolve_height(res_height_opt)(self, max_columns, max_lines)
|
||||
|
||||
-- This sets the number of results displayed
|
||||
local res_height_opt = layout_config.height
|
||||
local res_height = resolve.resolve_height(res_height_opt)(self, max_columns, max_lines)
|
||||
local max_results = (res_height > max_lines and max_lines or res_height)
|
||||
local max_width = (width > max_columns and max_columns or width)
|
||||
|
||||
local max_results = (res_height > max_lines and max_lines or res_height)
|
||||
local max_width = (width > max_columns and max_columns or width)
|
||||
local bs = get_border_size(self)
|
||||
|
||||
local bs = get_border_size(self)
|
||||
prompt.height = 1
|
||||
results.height = max_results
|
||||
|
||||
prompt.height = 1
|
||||
results.height = max_results
|
||||
prompt.width = max_width
|
||||
results.width = max_width
|
||||
preview.width = max_width
|
||||
|
||||
prompt.width = max_width
|
||||
results.width = max_width
|
||||
preview.width = max_width
|
||||
-- Align the prompt and results so halfway up the screen is
|
||||
-- in the middle of this combined block
|
||||
prompt.line = (max_lines / 2) - ((max_results + (bs * 2)) / 2)
|
||||
results.line = prompt.line + 1 + bs
|
||||
|
||||
-- Align the prompt and results so halfway up the screen is
|
||||
-- in the middle of this combined block
|
||||
prompt.line = (max_lines / 2) - ((max_results + (bs * 2)) / 2)
|
||||
results.line = prompt.line + 1 + (bs)
|
||||
preview.line = 1
|
||||
|
||||
preview.line = 1
|
||||
if self.previewer and max_lines >= layout_config.preview_cutoff then
|
||||
preview.height = math.floor(prompt.line - (2 + bs))
|
||||
else
|
||||
preview.height = 0
|
||||
end
|
||||
|
||||
if self.previewer and max_lines >= layout_config.preview_cutoff then
|
||||
preview.height = math.floor(prompt.line - (2 + bs))
|
||||
else
|
||||
preview.height = 0
|
||||
results.col = math.ceil((max_columns / 2) - (width / 2) - bs)
|
||||
prompt.col = results.col
|
||||
preview.col = results.col
|
||||
|
||||
if tbln then
|
||||
prompt.line = prompt.line + 1
|
||||
results.line = results.line + 1
|
||||
preview.line = preview.line + 1
|
||||
end
|
||||
|
||||
return {
|
||||
preview = self.previewer and preview.height > 0 and preview,
|
||||
results = results,
|
||||
prompt = prompt,
|
||||
}
|
||||
end
|
||||
|
||||
results.col = math.ceil((max_columns / 2) - (width / 2) - bs)
|
||||
prompt.col = results.col
|
||||
preview.col = results.col
|
||||
|
||||
if tbln then
|
||||
prompt.line = prompt.line + 1
|
||||
results.line = results.line + 1
|
||||
preview.line = preview.line + 1
|
||||
end
|
||||
|
||||
return {
|
||||
preview = self.previewer and preview.height > 0 and preview,
|
||||
results = results,
|
||||
prompt = prompt
|
||||
}
|
||||
end)
|
||||
)
|
||||
|
||||
--- Cursor layout dynamically positioned below the cursor if possible.
|
||||
--- If there is no place below the cursor it will be placed above.
|
||||
@@ -441,78 +450,81 @@ end)
|
||||
--- │ │
|
||||
--- └──────────────────────────────────────────────────┘
|
||||
--- </pre>
|
||||
layout_strategies.cursor = make_documented_layout("cursor", vim.tbl_extend("error", shared_options, {
|
||||
preview_width = { "Change the width of Telescope's preview window", "See |resolver.resolve_width()|", },
|
||||
layout_strategies.cursor = make_documented_layout(
|
||||
"cursor",
|
||||
vim.tbl_extend("error", shared_options, {
|
||||
preview_width = { "Change the width of Telescope's preview window", "See |resolver.resolve_width()|" },
|
||||
preview_cutoff = "When columns are less than this value, the preview will be disabled",
|
||||
}), function(self, max_columns, max_lines, layout_config)
|
||||
}),
|
||||
function(self, max_columns, max_lines, layout_config)
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local preview = initial_options.preview
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local preview = initial_options.preview
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
local height_opt = layout_config.height
|
||||
local height = resolve.resolve_height(height_opt)(self, max_columns, max_lines)
|
||||
|
||||
local height_opt = layout_config.height
|
||||
local height = resolve.resolve_height(height_opt)(self, max_columns, max_lines)
|
||||
local width_opt = layout_config.width
|
||||
local width = resolve.resolve_width(width_opt)(self, max_columns, max_lines)
|
||||
|
||||
local width_opt = layout_config.width
|
||||
local width = resolve.resolve_width(width_opt)(self, max_columns, max_lines)
|
||||
local max_width = (width > max_columns and max_columns or width)
|
||||
|
||||
local max_width = (width > max_columns and max_columns or width)
|
||||
local bs = get_border_size(self)
|
||||
|
||||
local bs = get_border_size(self)
|
||||
prompt.height = 1
|
||||
results.height = height
|
||||
preview.height = results.height + prompt.height + bs
|
||||
|
||||
prompt.height = 1
|
||||
results.height = height
|
||||
preview.height = results.height + prompt.height + bs
|
||||
if self.previewer and max_columns >= layout_config.preview_cutoff then
|
||||
preview.width = resolve.resolve_width(if_nil(layout_config.preview_width, function(_, cols)
|
||||
-- By default, previewer takes 2/3 of the layout
|
||||
return 2 * math.floor(max_width / 3)
|
||||
end))(self, max_width, max_lines)
|
||||
else
|
||||
preview.width = 0
|
||||
end
|
||||
|
||||
if self.previewer and max_columns >= layout_config.preview_cutoff then
|
||||
preview.width = resolve.resolve_width(if_nil(layout_config.preview_width, function(_, cols)
|
||||
-- By default, previewer takes 2/3 of the layout
|
||||
return 2 * math.floor(max_width / 3)
|
||||
end))(self, max_width, max_lines)
|
||||
else
|
||||
preview.width = 0
|
||||
prompt.width = max_width - preview.width
|
||||
results.width = prompt.width
|
||||
|
||||
local total_height = preview.height + (bs * 2)
|
||||
local total_width = prompt.width + (bs * 2) + preview.width + bs
|
||||
|
||||
local position = vim.api.nvim_win_get_position(0)
|
||||
local top_left = {
|
||||
line = vim.fn.winline() + position[1] + bs,
|
||||
col = vim.fn.wincol() + position[2],
|
||||
}
|
||||
local bot_right = {
|
||||
line = top_left.line + total_height - 1,
|
||||
col = top_left.col + total_width - 1,
|
||||
}
|
||||
|
||||
if bot_right.line > max_lines then
|
||||
-- position above current line
|
||||
top_left.line = top_left.line - total_height - 1
|
||||
end
|
||||
if bot_right.col >= max_columns then
|
||||
-- cap to the right of the screen
|
||||
top_left.col = max_columns - total_width
|
||||
end
|
||||
|
||||
prompt.line = top_left.line
|
||||
results.line = prompt.line + bs + 1
|
||||
preview.line = prompt.line
|
||||
|
||||
prompt.col = top_left.col
|
||||
results.col = prompt.col
|
||||
preview.col = results.col + (bs * 2) + results.width
|
||||
|
||||
return {
|
||||
preview = self.previewer and preview.width > 0 and preview,
|
||||
results = results,
|
||||
prompt = prompt,
|
||||
}
|
||||
end
|
||||
|
||||
prompt.width = max_width - preview.width
|
||||
results.width = prompt.width
|
||||
|
||||
local total_height = preview.height + (bs*2)
|
||||
local total_width = prompt.width + (bs*2) + preview.width + bs
|
||||
|
||||
local position = vim.api.nvim_win_get_position(0)
|
||||
local top_left = {
|
||||
line = vim.fn.winline() + position[1] + bs,
|
||||
col = vim.fn.wincol() + position[2]
|
||||
}
|
||||
local bot_right = {
|
||||
line = top_left.line + total_height - 1,
|
||||
col = top_left.col + total_width - 1
|
||||
}
|
||||
|
||||
if bot_right.line > max_lines then
|
||||
-- position above current line
|
||||
top_left.line = top_left.line - total_height - 1
|
||||
end
|
||||
if bot_right.col >= max_columns then
|
||||
-- cap to the right of the screen
|
||||
top_left.col = max_columns - total_width
|
||||
end
|
||||
|
||||
prompt.line = top_left.line
|
||||
results.line = prompt.line + bs + 1
|
||||
preview.line = prompt.line
|
||||
|
||||
prompt.col = top_left.col
|
||||
results.col = prompt.col
|
||||
preview.col = results.col + (bs*2) + results.width
|
||||
|
||||
return {
|
||||
preview = self.previewer and preview.width > 0 and preview,
|
||||
results = results,
|
||||
prompt = prompt
|
||||
}
|
||||
end)
|
||||
)
|
||||
|
||||
--- Vertical layout stacks the items on top of each other.
|
||||
--- Particularly useful with thinner windows.
|
||||
@@ -537,97 +549,105 @@ end)
|
||||
--- </pre>
|
||||
---@eval { ["description"] = require("telescope.pickers.layout_strategies")._format("vertical") }
|
||||
---
|
||||
layout_strategies.vertical = make_documented_layout("vertical", vim.tbl_extend("error", shared_options, {
|
||||
preview_cutoff = "When lines are less than this value, the preview will be disabled",
|
||||
preview_height = { "Change the height of Telescope's preview window", "See |resolver.resolve_height()|" },
|
||||
prompt_position = { "(unimplemented, but we plan on supporting)" },
|
||||
}), function(self, max_columns, max_lines, layout_config)
|
||||
layout_strategies.vertical = make_documented_layout(
|
||||
"vertical",
|
||||
vim.tbl_extend("error", shared_options, {
|
||||
preview_cutoff = "When lines are less than this value, the preview will be disabled",
|
||||
preview_height = { "Change the height of Telescope's preview window", "See |resolver.resolve_height()|" },
|
||||
prompt_position = { "(unimplemented, but we plan on supporting)" },
|
||||
}),
|
||||
function(self, max_columns, max_lines, layout_config)
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local preview = initial_options.preview
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local preview = initial_options.preview
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
local tbln
|
||||
max_lines, tbln = calc_tabline(max_lines)
|
||||
|
||||
local tbln
|
||||
max_lines, tbln = calc_tabline(max_lines)
|
||||
local width_opt = layout_config.width
|
||||
local picker_width = resolve.resolve_width(width_opt)(self, max_columns, max_lines)
|
||||
local width_padding = math.floor((max_columns - picker_width) / 2)
|
||||
|
||||
local width_opt = layout_config.width
|
||||
local picker_width = resolve.resolve_width(width_opt)(self,max_columns,max_lines)
|
||||
local width_padding = math.floor((max_columns - picker_width)/2)
|
||||
local height_opt = layout_config.height
|
||||
local picker_height = resolve.resolve_height(height_opt)(self, max_columns, max_lines)
|
||||
local height_padding = math.floor((max_lines - picker_height) / 2)
|
||||
|
||||
local height_opt = layout_config.height
|
||||
local picker_height = resolve.resolve_height(height_opt)(self,max_columns,max_lines)
|
||||
local height_padding = math.floor((max_lines - picker_height)/2)
|
||||
if self.previewer and max_lines >= layout_config.preview_cutoff then
|
||||
preview.width = picker_width
|
||||
else
|
||||
preview.width = 0
|
||||
end
|
||||
results.width = picker_width
|
||||
prompt.width = picker_width
|
||||
|
||||
if self.previewer and max_lines >= layout_config.preview_cutoff then
|
||||
preview.width = picker_width
|
||||
else
|
||||
preview.width = 0
|
||||
local preview_total = 0
|
||||
preview.height = 0
|
||||
if self.previewer and max_lines >= layout_config.preview_cutoff then
|
||||
preview.height = resolve.resolve_height(if_nil(layout_config.preview_height, 0.5))(
|
||||
self,
|
||||
max_columns,
|
||||
picker_height
|
||||
)
|
||||
|
||||
preview_total = preview.height + 2
|
||||
end
|
||||
|
||||
prompt.height = 1
|
||||
results.height = picker_height - preview_total - prompt.height - 2
|
||||
|
||||
results.col, preview.col, prompt.col = width_padding, width_padding, width_padding
|
||||
|
||||
if not layout_config.mirror then
|
||||
preview.line = height_padding
|
||||
results.line = (preview.height == 0) and preview.line or preview.line + preview.height + 2
|
||||
prompt.line = results.line + results.height + 2
|
||||
else
|
||||
prompt.line = height_padding
|
||||
results.line = prompt.line + prompt.height + 2
|
||||
preview.line = results.line + results.height + 2
|
||||
end
|
||||
|
||||
if tbln then
|
||||
prompt.line = prompt.line + 1
|
||||
results.line = results.line + 1
|
||||
preview.line = preview.line + 1
|
||||
end
|
||||
|
||||
return {
|
||||
preview = self.previewer and preview.height > 0 and preview,
|
||||
results = results,
|
||||
prompt = prompt,
|
||||
}
|
||||
end
|
||||
results.width = picker_width
|
||||
prompt.width = picker_width
|
||||
|
||||
local preview_total = 0
|
||||
preview.height = 0
|
||||
if self.previewer and max_lines >= layout_config.preview_cutoff then
|
||||
preview.height = resolve.resolve_height(
|
||||
if_nil(layout_config.preview_height, 0.5)
|
||||
)(self, max_columns, picker_height)
|
||||
|
||||
preview_total = preview.height + 2
|
||||
end
|
||||
|
||||
prompt.height = 1
|
||||
results.height = picker_height - preview_total - prompt.height - 2
|
||||
|
||||
results.col, preview.col, prompt.col = width_padding, width_padding, width_padding
|
||||
|
||||
if not layout_config.mirror then
|
||||
preview.line = height_padding
|
||||
results.line = (preview.height == 0) and preview.line
|
||||
or preview.line + preview.height + 2
|
||||
prompt.line = results.line + results.height + 2
|
||||
else
|
||||
prompt.line = height_padding
|
||||
results.line = prompt.line + prompt.height + 2
|
||||
preview.line = results.line + results.height + 2
|
||||
end
|
||||
|
||||
if tbln then
|
||||
prompt.line = prompt.line + 1
|
||||
results.line = results.line + 1
|
||||
preview.line = preview.line + 1
|
||||
end
|
||||
|
||||
return {
|
||||
preview = self.previewer and preview.height > 0 and preview,
|
||||
results = results,
|
||||
prompt = prompt
|
||||
}
|
||||
end)
|
||||
)
|
||||
|
||||
--- Flex layout swaps between `horizontal` and `vertical` strategies based on the window width
|
||||
--- - Supports |layout_strategies.vertical| or |layout_strategies.horizontal| features
|
||||
---
|
||||
---@eval { ["description"] = require("telescope.pickers.layout_strategies")._format("flex") }
|
||||
---
|
||||
layout_strategies.flex = make_documented_layout('flex', vim.tbl_extend("error", shared_options, {
|
||||
flip_columns = "The number of columns required to move to horizontal mode",
|
||||
flip_lines = "The number of lines required to move to horizontal mode",
|
||||
vertical = "Options to pass when switching to vertical layout",
|
||||
horizontal = "Options to pass when switching to horizontal layout",
|
||||
}), function(self, max_columns, max_lines, layout_config)
|
||||
local flip_columns = if_nil(layout_config.flip_columns, 100)
|
||||
local flip_lines = if_nil(layout_config.flip_lines, 20)
|
||||
layout_strategies.flex = make_documented_layout(
|
||||
"flex",
|
||||
vim.tbl_extend("error", shared_options, {
|
||||
flip_columns = "The number of columns required to move to horizontal mode",
|
||||
flip_lines = "The number of lines required to move to horizontal mode",
|
||||
vertical = "Options to pass when switching to vertical layout",
|
||||
horizontal = "Options to pass when switching to horizontal layout",
|
||||
}),
|
||||
function(self, max_columns, max_lines, layout_config)
|
||||
local flip_columns = if_nil(layout_config.flip_columns, 100)
|
||||
local flip_lines = if_nil(layout_config.flip_lines, 20)
|
||||
|
||||
if max_columns < flip_columns and max_lines > flip_lines then
|
||||
return layout_strategies.vertical(self, max_columns, max_lines, layout_config.vertical)
|
||||
else
|
||||
return layout_strategies.horizontal(self, max_columns, max_lines, layout_config.horizontal)
|
||||
if max_columns < flip_columns and max_lines > flip_lines then
|
||||
return layout_strategies.vertical(self, max_columns, max_lines, layout_config.vertical)
|
||||
else
|
||||
return layout_strategies.horizontal(self, max_columns, max_lines, layout_config.horizontal)
|
||||
end
|
||||
end
|
||||
end)
|
||||
)
|
||||
|
||||
layout_strategies.current_buffer = make_documented_layout('current_buffer', {
|
||||
layout_strategies.current_buffer = make_documented_layout("current_buffer", {
|
||||
-- No custom options.
|
||||
-- height, width ignored
|
||||
}, function(self, _, _, _)
|
||||
@@ -663,7 +683,6 @@ layout_strategies.current_buffer = make_documented_layout('current_buffer', {
|
||||
results.height = window_height - prompt.height - 2 - height_padding * 2
|
||||
end
|
||||
|
||||
|
||||
local win_position = vim.api.nvim_win_get_position(0)
|
||||
|
||||
local line = win_position[1]
|
||||
@@ -689,82 +708,86 @@ end)
|
||||
--- Bottom pane can be used to create layouts similar to "ivy".
|
||||
---
|
||||
--- For an easy ivy configuration, see |themes.get_ivy()|
|
||||
layout_strategies.bottom_pane = make_documented_layout('bottom_pane', vim.tbl_extend("error", shared_options, {
|
||||
-- No custom options...
|
||||
}), function(self, max_columns, max_lines, layout_config)
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
local preview = initial_options.preview
|
||||
layout_strategies.bottom_pane = make_documented_layout(
|
||||
"bottom_pane",
|
||||
vim.tbl_extend("error", shared_options, {
|
||||
-- No custom options...
|
||||
}),
|
||||
function(self, max_columns, max_lines, layout_config)
|
||||
local initial_options = p_window.get_initial_window_options(self)
|
||||
local results = initial_options.results
|
||||
local prompt = initial_options.prompt
|
||||
local preview = initial_options.preview
|
||||
|
||||
local result_height = if_nil(resolve.resolve_height(layout_config.height)(self,max_columns,max_lines), 25)
|
||||
local result_height = if_nil(resolve.resolve_height(layout_config.height)(self, max_columns, max_lines), 25)
|
||||
|
||||
local prompt_width = max_columns
|
||||
local col = 0
|
||||
local prompt_width = max_columns
|
||||
local col = 0
|
||||
|
||||
local has_border = not not self.window.border
|
||||
if has_border then
|
||||
col = 1
|
||||
prompt_width = prompt_width - 2
|
||||
end
|
||||
|
||||
local left_side_width
|
||||
if self.previewer then
|
||||
left_side_width = math.floor(prompt_width / 2)
|
||||
|
||||
local base_col
|
||||
if layout_config.mirror then
|
||||
base_col = 0
|
||||
else
|
||||
base_col = left_side_width + 1
|
||||
local has_border = not not self.window.border
|
||||
if has_border then
|
||||
col = 1
|
||||
prompt_width = prompt_width - 2
|
||||
end
|
||||
|
||||
if has_border then
|
||||
preview = vim.tbl_deep_extend("force", {
|
||||
col = base_col + 2,
|
||||
line = max_lines - result_height + 1,
|
||||
width = prompt_width - left_side_width - 2,
|
||||
height = result_height - 1,
|
||||
}, preview)
|
||||
local left_side_width
|
||||
if self.previewer then
|
||||
left_side_width = math.floor(prompt_width / 2)
|
||||
|
||||
local base_col
|
||||
if layout_config.mirror then
|
||||
base_col = 0
|
||||
else
|
||||
base_col = left_side_width + 1
|
||||
end
|
||||
|
||||
if has_border then
|
||||
preview = vim.tbl_deep_extend("force", {
|
||||
col = base_col + 2,
|
||||
line = max_lines - result_height + 1,
|
||||
width = prompt_width - left_side_width - 2,
|
||||
height = result_height - 1,
|
||||
}, preview)
|
||||
else
|
||||
preview = vim.tbl_deep_extend("force", {
|
||||
col = base_col,
|
||||
line = max_lines - result_height,
|
||||
width = prompt_width - left_side_width,
|
||||
height = result_height,
|
||||
}, preview)
|
||||
end
|
||||
else
|
||||
preview = vim.tbl_deep_extend("force", {
|
||||
col = base_col,
|
||||
preview = nil
|
||||
left_side_width = prompt_width
|
||||
end
|
||||
|
||||
local result_col
|
||||
if layout_config.mirror and self.previewer then
|
||||
result_col = left_side_width + 2
|
||||
if has_border then
|
||||
left_side_width = left_side_width - 2
|
||||
end
|
||||
else
|
||||
result_col = col
|
||||
end
|
||||
|
||||
return {
|
||||
preview = preview,
|
||||
prompt = vim.tbl_deep_extend("force", prompt, {
|
||||
line = max_lines - result_height - 1,
|
||||
col = col,
|
||||
height = 1,
|
||||
width = prompt_width,
|
||||
}),
|
||||
results = vim.tbl_deep_extend("force", results, {
|
||||
line = max_lines - result_height,
|
||||
width = prompt_width - left_side_width,
|
||||
col = result_col,
|
||||
height = result_height,
|
||||
}, preview)
|
||||
end
|
||||
else
|
||||
preview = nil
|
||||
left_side_width = prompt_width
|
||||
width = left_side_width,
|
||||
}),
|
||||
}
|
||||
end
|
||||
|
||||
local result_col
|
||||
if layout_config.mirror and self.previewer then
|
||||
result_col = left_side_width + 2
|
||||
if has_border then
|
||||
left_side_width = left_side_width - 2
|
||||
end
|
||||
else
|
||||
result_col = col
|
||||
end
|
||||
|
||||
return {
|
||||
preview = preview,
|
||||
prompt = vim.tbl_deep_extend("force", prompt, {
|
||||
line = max_lines - result_height - 1,
|
||||
col = col,
|
||||
height = 1,
|
||||
width = prompt_width,
|
||||
}),
|
||||
results = vim.tbl_deep_extend("force", results, {
|
||||
line = max_lines - result_height,
|
||||
col = result_col,
|
||||
height = result_height,
|
||||
width = left_side_width,
|
||||
}),
|
||||
}
|
||||
end)
|
||||
)
|
||||
|
||||
layout_strategies._validate_layout_config = validate_layout_config
|
||||
|
||||
|
||||
@@ -1,17 +1,16 @@
|
||||
|
||||
local MultiSelect = {}
|
||||
MultiSelect.__index = MultiSelect
|
||||
|
||||
function MultiSelect:new()
|
||||
return setmetatable({
|
||||
_entries = {}
|
||||
_entries = {},
|
||||
}, MultiSelect)
|
||||
end
|
||||
|
||||
function MultiSelect:get()
|
||||
local marked_entries = {}
|
||||
for entry, count in pairs(self._entries) do
|
||||
table.insert(marked_entries, {count, entry})
|
||||
table.insert(marked_entries, { count, entry })
|
||||
end
|
||||
|
||||
table.sort(marked_entries, function(left, right)
|
||||
|
||||
@@ -48,7 +48,7 @@ scroller.create = function(scroll_strategy, sorting_strategy)
|
||||
|
||||
local scroll_fn = scroll_calculators[scroll_strategy]
|
||||
if not scroll_fn then
|
||||
error(debug.traceback("Unknown scroll strategy: " .. (scroll_strategy or '')))
|
||||
error(debug.traceback("Unknown scroll strategy: " .. (scroll_strategy or "")))
|
||||
end
|
||||
|
||||
local calculator = scroll_fn(range_fn)
|
||||
@@ -56,17 +56,27 @@ scroller.create = function(scroll_strategy, sorting_strategy)
|
||||
local result = calculator(max_results, num_results, row)
|
||||
|
||||
if result < 0 then
|
||||
error(string.format(
|
||||
"Must never return a negative row: { result = %s, args = { %s %s %s } }",
|
||||
result, max_results, num_results, row
|
||||
))
|
||||
error(
|
||||
string.format(
|
||||
"Must never return a negative row: { result = %s, args = { %s %s %s } }",
|
||||
result,
|
||||
max_results,
|
||||
num_results,
|
||||
row
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
if result >= max_results then
|
||||
error(string.format(
|
||||
"Must never exceed max results: { result = %s, args = { %s %s %s } }",
|
||||
result, max_results, num_results, row
|
||||
))
|
||||
error(
|
||||
string.format(
|
||||
"Must never exceed max results: { result = %s, args = { %s %s %s } }",
|
||||
result,
|
||||
max_results,
|
||||
num_results,
|
||||
row
|
||||
)
|
||||
)
|
||||
end
|
||||
|
||||
return result
|
||||
@@ -74,7 +84,7 @@ scroller.create = function(scroll_strategy, sorting_strategy)
|
||||
end
|
||||
|
||||
scroller.top = function(sorting_strategy, max_results, num_results)
|
||||
if sorting_strategy == 'ascending' then
|
||||
if sorting_strategy == "ascending" then
|
||||
return 0
|
||||
end
|
||||
return (num_results > max_results) and 0 or (max_results - num_results)
|
||||
@@ -83,7 +93,7 @@ end
|
||||
scroller.middle = function(sorting_strategy, max_results, num_results)
|
||||
local mid_pos
|
||||
|
||||
if sorting_strategy == 'ascending' then
|
||||
if sorting_strategy == "ascending" then
|
||||
mid_pos = math.floor(num_results / 2)
|
||||
else
|
||||
mid_pos = math.floor(max_results - num_results / 2)
|
||||
@@ -93,14 +103,14 @@ scroller.middle = function(sorting_strategy, max_results, num_results)
|
||||
end
|
||||
|
||||
scroller.bottom = function(sorting_strategy, max_results, num_results)
|
||||
if sorting_strategy == 'ascending' then
|
||||
if sorting_strategy == "ascending" then
|
||||
return math.min(max_results, num_results) - 1
|
||||
end
|
||||
return max_results - 1
|
||||
end
|
||||
|
||||
scroller.better = function(sorting_strategy)
|
||||
if sorting_strategy == 'ascending' then
|
||||
if sorting_strategy == "ascending" then
|
||||
return -1
|
||||
else
|
||||
return 1
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
local resolve = require("telescope.config.resolve")
|
||||
local resolve = require "telescope.config.resolve"
|
||||
|
||||
local p_window = {}
|
||||
|
||||
function p_window.get_window_options(picker, max_columns, max_lines)
|
||||
local layout_strategy = picker.layout_strategy
|
||||
local getter = require('telescope.pickers.layout_strategies')[layout_strategy]
|
||||
local getter = require("telescope.pickers.layout_strategies")[layout_strategy]
|
||||
|
||||
if not getter then
|
||||
error("Not a valid layout strategy: " .. layout_strategy)
|
||||
@@ -22,7 +22,7 @@ function p_window.get_initial_window_options(picker)
|
||||
border = popup_border.preview,
|
||||
borderchars = popup_borderchars.preview,
|
||||
enter = false,
|
||||
highlight = false
|
||||
highlight = false,
|
||||
}
|
||||
|
||||
local results = {
|
||||
@@ -36,7 +36,7 @@ function p_window.get_initial_window_options(picker)
|
||||
title = picker.prompt_title,
|
||||
border = popup_border.prompt,
|
||||
borderchars = popup_borderchars.prompt,
|
||||
enter = true
|
||||
enter = true,
|
||||
}
|
||||
|
||||
return {
|
||||
@@ -46,5 +46,4 @@ function p_window.get_initial_window_options(picker)
|
||||
}
|
||||
end
|
||||
|
||||
|
||||
return p_window
|
||||
|
||||
@@ -1,45 +1,45 @@
|
||||
local from_entry = require('telescope.from_entry')
|
||||
local Path = require('plenary.path')
|
||||
local utils = require('telescope.utils')
|
||||
local putils = require('telescope.previewers.utils')
|
||||
local Previewer = require('telescope.previewers.previewer')
|
||||
local conf = require('telescope.config').values
|
||||
local from_entry = require "telescope.from_entry"
|
||||
local Path = require "plenary.path"
|
||||
local utils = require "telescope.utils"
|
||||
local putils = require "telescope.previewers.utils"
|
||||
local Previewer = require "telescope.previewers.previewer"
|
||||
local conf = require("telescope.config").values
|
||||
|
||||
local pfiletype = require('plenary.filetype')
|
||||
local pscan = require('plenary.scandir')
|
||||
local pfiletype = require "plenary.filetype"
|
||||
local pscan = require "plenary.scandir"
|
||||
|
||||
local buf_delete = utils.buf_delete
|
||||
local defaulter = utils.make_default_callable
|
||||
|
||||
local previewers = {}
|
||||
|
||||
local ns_previewer = vim.api.nvim_create_namespace('telescope.previewers')
|
||||
local ns_previewer = vim.api.nvim_create_namespace "telescope.previewers"
|
||||
|
||||
local color_hash = {
|
||||
['p'] = 'TelescopePreviewPipe',
|
||||
['c'] = 'TelescopePreviewCharDev',
|
||||
['d'] = 'TelescopePreviewDirectory',
|
||||
['b'] = 'TelescopePreviewBlock',
|
||||
['l'] = 'TelescopePreviewLink',
|
||||
['s'] = 'TelescopePreviewSocket',
|
||||
['.'] = 'TelescopePreviewNormal',
|
||||
['r'] = 'TelescopePreviewRead',
|
||||
['w'] = 'TelescopePreviewWrite',
|
||||
['x'] = 'TelescopePreviewExecute',
|
||||
['-'] = 'TelescopePreviewHyphen',
|
||||
['T'] = 'TelescopePreviewSticky',
|
||||
['S'] = 'TelescopePreviewSticky',
|
||||
[2] = 'TelescopePreviewSize',
|
||||
[3] = 'TelescopePreviewUser',
|
||||
[4] = 'TelescopePreviewGroup',
|
||||
[5] = 'TelescopePreviewDate',
|
||||
["p"] = "TelescopePreviewPipe",
|
||||
["c"] = "TelescopePreviewCharDev",
|
||||
["d"] = "TelescopePreviewDirectory",
|
||||
["b"] = "TelescopePreviewBlock",
|
||||
["l"] = "TelescopePreviewLink",
|
||||
["s"] = "TelescopePreviewSocket",
|
||||
["."] = "TelescopePreviewNormal",
|
||||
["r"] = "TelescopePreviewRead",
|
||||
["w"] = "TelescopePreviewWrite",
|
||||
["x"] = "TelescopePreviewExecute",
|
||||
["-"] = "TelescopePreviewHyphen",
|
||||
["T"] = "TelescopePreviewSticky",
|
||||
["S"] = "TelescopePreviewSticky",
|
||||
[2] = "TelescopePreviewSize",
|
||||
[3] = "TelescopePreviewUser",
|
||||
[4] = "TelescopePreviewGroup",
|
||||
[5] = "TelescopePreviewDate",
|
||||
}
|
||||
color_hash[6] = function(line)
|
||||
color_hash[6] = function(line)
|
||||
return color_hash[line:sub(1, 1)]
|
||||
end
|
||||
|
||||
local colorize_ls = function(bufnr, data, sections)
|
||||
local windows_add = Path.path.sep == '\\' and 2 or 0
|
||||
local windows_add = Path.path.sep == "\\" and 2 or 0
|
||||
for lnum, line in ipairs(data) do
|
||||
local section = sections[lnum]
|
||||
for i = 1, section[1].end_index - 1 do -- Highlight permissions
|
||||
@@ -48,7 +48,8 @@ local colorize_ls = function(bufnr, data, sections)
|
||||
end
|
||||
for i = 2, #section do -- highlights size, (user, group), date and name
|
||||
local hl_group = color_hash[i + (i ~= 2 and windows_add or 0)]
|
||||
vim.api.nvim_buf_add_highlight(bufnr,
|
||||
vim.api.nvim_buf_add_highlight(
|
||||
bufnr,
|
||||
ns_previewer,
|
||||
type(hl_group) == "function" and hl_group(line) or hl_group,
|
||||
lnum - 1,
|
||||
@@ -60,14 +61,16 @@ local colorize_ls = function(bufnr, data, sections)
|
||||
end
|
||||
|
||||
local search_cb_jump = function(self, bufnr, query)
|
||||
if not query then return end
|
||||
if not query then
|
||||
return
|
||||
end
|
||||
vim.api.nvim_buf_call(bufnr, function()
|
||||
pcall(vim.fn.matchdelete, self.state.hl_id, self.state.winid)
|
||||
vim.cmd "norm! gg"
|
||||
vim.fn.search(query, "W")
|
||||
vim.cmd "norm! zz"
|
||||
|
||||
self.state.hl_id = vim.fn.matchadd('TelescopePreviewMatch', query)
|
||||
self.state.hl_id = vim.fn.matchadd("TelescopePreviewMatch", query)
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -80,29 +83,44 @@ end
|
||||
|
||||
previewers.file_maker = function(filepath, bufnr, opts)
|
||||
opts = opts or {}
|
||||
if opts.use_ft_detect == nil then opts.use_ft_detect = true end
|
||||
if opts.use_ft_detect == nil then
|
||||
opts.use_ft_detect = true
|
||||
end
|
||||
local ft = opts.use_ft_detect and pfiletype.detect(filepath)
|
||||
|
||||
if opts.bufname ~= filepath then
|
||||
if not vim.in_fast_event() then filepath = vim.fn.expand(filepath) end
|
||||
if not vim.in_fast_event() then
|
||||
filepath = vim.fn.expand(filepath)
|
||||
end
|
||||
vim.loop.fs_stat(filepath, function(_, stat)
|
||||
if not stat then return end
|
||||
if stat.type == 'directory' then
|
||||
if not stat then
|
||||
return
|
||||
end
|
||||
if stat.type == "directory" then
|
||||
pscan.ls_async(filepath, {
|
||||
hidden = true,
|
||||
group_directories_first = true,
|
||||
on_exit = vim.schedule_wrap(function(data, sections)
|
||||
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, data)
|
||||
colorize_ls(bufnr, data, sections)
|
||||
if opts.callback then opts.callback(bufnr) end
|
||||
end)})
|
||||
if opts.callback then
|
||||
opts.callback(bufnr)
|
||||
end
|
||||
end),
|
||||
})
|
||||
else
|
||||
Path:new(filepath):_read_async(vim.schedule_wrap(function(data)
|
||||
if not vim.api.nvim_buf_is_valid(bufnr) then return end
|
||||
local ok = pcall(vim.api.nvim_buf_set_lines, bufnr, 0, -1, false, vim.split(data, '[\r]?\n'))
|
||||
if not ok then return end
|
||||
if not vim.api.nvim_buf_is_valid(bufnr) then
|
||||
return
|
||||
end
|
||||
local ok = pcall(vim.api.nvim_buf_set_lines, bufnr, 0, -1, false, vim.split(data, "[\r]?\n"))
|
||||
if not ok then
|
||||
return
|
||||
end
|
||||
|
||||
if opts.callback then opts.callback(bufnr) end
|
||||
if opts.callback then
|
||||
opts.callback(bufnr)
|
||||
end
|
||||
putils.highlighter(bufnr, ft)
|
||||
end))
|
||||
end
|
||||
@@ -110,7 +128,9 @@ previewers.file_maker = function(filepath, bufnr, opts)
|
||||
else
|
||||
if opts.callback then
|
||||
if vim.in_fast_event() then
|
||||
vim.schedule(function() opts.callback(bufnr) end)
|
||||
vim.schedule(function()
|
||||
opts.callback(bufnr)
|
||||
end)
|
||||
else
|
||||
opts.callback(bufnr)
|
||||
end
|
||||
@@ -132,11 +152,13 @@ previewers.new_buffer_previewer = function(opts)
|
||||
local old_bufs = {}
|
||||
local bufname_table = {}
|
||||
|
||||
local global_state = require'telescope.state'
|
||||
local global_state = require "telescope.state"
|
||||
local preview_window_id
|
||||
|
||||
local function get_bufnr(self)
|
||||
if not self.state then return nil end
|
||||
if not self.state then
|
||||
return nil
|
||||
end
|
||||
return self.state.bufnr
|
||||
end
|
||||
|
||||
@@ -148,7 +170,9 @@ previewers.new_buffer_previewer = function(opts)
|
||||
end
|
||||
|
||||
local function get_bufnr_by_bufname(self, value)
|
||||
if not self.state then return nil end
|
||||
if not self.state then
|
||||
return nil
|
||||
end
|
||||
return bufname_table[value]
|
||||
end
|
||||
|
||||
@@ -163,7 +187,7 @@ previewers.new_buffer_previewer = function(opts)
|
||||
|
||||
function opts.title(self)
|
||||
if opt_title then
|
||||
if type(opt_title) == 'function' then
|
||||
if type(opt_title) == "function" then
|
||||
return opt_title(self)
|
||||
else
|
||||
return opt_title
|
||||
@@ -181,7 +205,9 @@ previewers.new_buffer_previewer = function(opts)
|
||||
|
||||
function opts.setup(self)
|
||||
local state = {}
|
||||
if opt_setup then vim.tbl_deep_extend("force", state, opt_setup(self)) end
|
||||
if opt_setup then
|
||||
vim.tbl_deep_extend("force", state, opt_setup(self))
|
||||
end
|
||||
return state
|
||||
end
|
||||
|
||||
@@ -192,7 +218,7 @@ previewers.new_buffer_previewer = function(opts)
|
||||
|
||||
local last_nr
|
||||
if opts.keep_last_buf then
|
||||
last_nr = global_state.get_global_key('last_preview_bufnr')
|
||||
last_nr = global_state.get_global_key "last_preview_bufnr"
|
||||
-- Push in another buffer so the last one will not be cleaned up
|
||||
if preview_window_id then
|
||||
local bufnr = vim.api.nvim_create_buf(false, true)
|
||||
@@ -231,21 +257,23 @@ previewers.new_buffer_previewer = function(opts)
|
||||
end)
|
||||
|
||||
-- TODO(conni2461): We only have to set options once. Right?
|
||||
vim.api.nvim_win_set_option(status.preview_win, 'winhl', 'Normal:TelescopePreviewNormal')
|
||||
vim.api.nvim_win_set_option(status.preview_win, 'signcolumn', 'no')
|
||||
vim.api.nvim_win_set_option(status.preview_win, 'foldlevel', 100)
|
||||
vim.api.nvim_win_set_option(status.preview_win, 'wrap', false)
|
||||
vim.api.nvim_win_set_option(status.preview_win, "winhl", "Normal:TelescopePreviewNormal")
|
||||
vim.api.nvim_win_set_option(status.preview_win, "signcolumn", "no")
|
||||
vim.api.nvim_win_set_option(status.preview_win, "foldlevel", 100)
|
||||
vim.api.nvim_win_set_option(status.preview_win, "wrap", false)
|
||||
|
||||
self.state.winid = status.preview_win
|
||||
self.state.bufname = nil
|
||||
end
|
||||
|
||||
if opts.keep_last_buf then global_state.set_global_key("last_preview_bufnr", self.state.bufnr) end
|
||||
if opts.keep_last_buf then
|
||||
global_state.set_global_key("last_preview_bufnr", self.state.bufnr)
|
||||
end
|
||||
|
||||
opts.define_preview(self, entry, status)
|
||||
|
||||
putils.with_preview_window(status, nil, function()
|
||||
vim.cmd'do User TelescopePreviewerLoaded'
|
||||
vim.cmd "do User TelescopePreviewerLoaded"
|
||||
end)
|
||||
|
||||
if opts.get_buffer_by_name then
|
||||
@@ -255,7 +283,9 @@ previewers.new_buffer_previewer = function(opts)
|
||||
|
||||
if not opts.scroll_fn then
|
||||
function opts.scroll_fn(self, direction)
|
||||
if not self.state then return end
|
||||
if not self.state then
|
||||
return
|
||||
end
|
||||
|
||||
local input = direction > 0 and [[]] or [[]]
|
||||
local count = math.abs(direction)
|
||||
@@ -284,11 +314,13 @@ previewers.cat = defaulter(function(opts)
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local p = from_entry.path(entry, true)
|
||||
if p == nil or p == '' then return end
|
||||
if p == nil or p == "" then
|
||||
return
|
||||
end
|
||||
conf.buffer_previewer_maker(p, self.state.bufnr, {
|
||||
bufname = self.state.bufname
|
||||
bufname = self.state.bufname,
|
||||
})
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -299,8 +331,10 @@ previewers.vimgrep = defaulter(function(opts)
|
||||
local jump_to_line = function(self, bufnr, lnum)
|
||||
if lnum and lnum > 0 then
|
||||
pcall(vim.api.nvim_buf_add_highlight, bufnr, ns_previewer, "TelescopePreviewLine", lnum - 1, 0, -1)
|
||||
pcall(vim.api.nvim_win_set_cursor, self.state.winid, {lnum, 0})
|
||||
vim.api.nvim_buf_call(bufnr, function() vim.cmd"norm! zz" end)
|
||||
pcall(vim.api.nvim_win_set_cursor, self.state.winid, { lnum, 0 })
|
||||
vim.api.nvim_buf_call(bufnr, function()
|
||||
vim.cmd "norm! zz"
|
||||
end)
|
||||
end
|
||||
|
||||
self.state.last_set_bufnr = bufnr
|
||||
@@ -328,24 +362,28 @@ previewers.vimgrep = defaulter(function(opts)
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local p = from_entry.path(entry, true)
|
||||
if p == nil or p == '' then return end
|
||||
if p == nil or p == "" then
|
||||
return
|
||||
end
|
||||
|
||||
if self.state.last_set_bufnr then
|
||||
pcall(vim.api.nvim_buf_clear_namespace, self.state.last_set_bufnr, ns_previewer, 0, -1)
|
||||
end
|
||||
|
||||
-- Workaround for unnamed buffer when using builtin.buffer
|
||||
if entry.bufnr and (p == '[No Name]' or vim.api.nvim_buf_get_option(entry.bufnr, 'buftype') ~= '') then
|
||||
if entry.bufnr and (p == "[No Name]" or vim.api.nvim_buf_get_option(entry.bufnr, "buftype") ~= "") then
|
||||
local lines = vim.api.nvim_buf_get_lines(entry.bufnr, 0, -1, false)
|
||||
vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, lines)
|
||||
jump_to_line(self, self.state.bufnr, entry.lnum)
|
||||
else
|
||||
conf.buffer_previewer_maker(p, self.state.bufnr, {
|
||||
bufname = self.state.bufname,
|
||||
callback = function(bufnr) jump_to_line(self, bufnr, entry.lnum) end
|
||||
callback = function(bufnr)
|
||||
jump_to_line(self, bufnr, entry.lnum)
|
||||
end,
|
||||
})
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -355,17 +393,17 @@ previewers.ctags = defaulter(function(_)
|
||||
local determine_jump = function(entry)
|
||||
if entry.scode then
|
||||
return function(self)
|
||||
local scode = string.gsub(entry.scode, '[$]$', '')
|
||||
local scode = string.gsub(entry.scode, "[$]$", "")
|
||||
scode = string.gsub(scode, [[\\]], [[\]])
|
||||
scode = string.gsub(scode, [[\/]], [[/]])
|
||||
scode = string.gsub(scode, '[*]', [[\*]])
|
||||
scode = string.gsub(scode, "[*]", [[\*]])
|
||||
|
||||
pcall(vim.fn.matchdelete, self.state.hl_id, self.state.winid)
|
||||
vim.cmd "norm! gg"
|
||||
vim.fn.search(scode, "W")
|
||||
vim.cmd "norm! zz"
|
||||
|
||||
self.state.hl_id = vim.fn.matchadd('TelescopePreviewMatch', scode)
|
||||
self.state.hl_id = vim.fn.matchadd("TelescopePreviewMatch", scode)
|
||||
end
|
||||
else
|
||||
return function(self, bufnr)
|
||||
@@ -401,9 +439,9 @@ previewers.ctags = defaulter(function(_)
|
||||
vim.api.nvim_buf_call(bufnr, function()
|
||||
determine_jump(entry)(self, bufnr)
|
||||
end)
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -417,21 +455,21 @@ previewers.builtin = defaulter(function(_)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local module_name = vim.fn.fnamemodify(entry.filename, ':t:r')
|
||||
local module_name = vim.fn.fnamemodify(entry.filename, ":t:r")
|
||||
local text
|
||||
if entry.text:sub(1, #module_name) ~= module_name then
|
||||
text = module_name .. '.' .. entry.text
|
||||
text = module_name .. "." .. entry.text
|
||||
else
|
||||
text = entry.text:gsub('_', '.', 1)
|
||||
text = entry.text:gsub("_", ".", 1)
|
||||
end
|
||||
|
||||
conf.buffer_previewer_maker(entry.filename, self.state.bufnr, {
|
||||
bufname = self.state.bufname,
|
||||
callback = function(bufnr)
|
||||
search_cb_jump(self, bufnr, text)
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -452,17 +490,17 @@ previewers.help = defaulter(function(_)
|
||||
conf.buffer_previewer_maker(entry.filename, self.state.bufnr, {
|
||||
bufname = self.state.bufname,
|
||||
callback = function(bufnr)
|
||||
putils.regex_highlighter(bufnr, 'help')
|
||||
putils.regex_highlighter(bufnr, "help")
|
||||
search_cb_jump(self, bufnr, query)
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
previewers.man = defaulter(function(opts)
|
||||
local pager = utils.get_lazy_default(opts.PAGER, function()
|
||||
return vim.fn.executable('col') == 1 and 'col -bx' or ''
|
||||
return vim.fn.executable "col" == 1 and "col -bx" or ""
|
||||
end)
|
||||
return previewers.new_buffer_previewer {
|
||||
title = "Man Preview",
|
||||
@@ -472,13 +510,13 @@ previewers.man = defaulter(function(opts)
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local win_width = vim.api.nvim_win_get_width(self.state.winid)
|
||||
putils.job_maker({'man', entry.section, entry.value}, self.state.bufnr, {
|
||||
putils.job_maker({ "man", entry.section, entry.value }, self.state.bufnr, {
|
||||
env = { ["PAGER"] = pager, ["MANWIDTH"] = win_width },
|
||||
value = entry.value,
|
||||
bufname = self.state.bufname
|
||||
bufname = self.state.bufname,
|
||||
})
|
||||
putils.regex_highlighter(self.state.bufnr, 'man')
|
||||
end
|
||||
putils.regex_highlighter(self.state.bufnr, "man")
|
||||
end,
|
||||
}
|
||||
end)
|
||||
|
||||
@@ -486,21 +524,21 @@ previewers.git_branch_log = defaulter(function(opts)
|
||||
local highlight_buffer = function(bufnr, content)
|
||||
for i = 1, #content do
|
||||
local line = content[i]
|
||||
local _, hstart = line:find('[%*%s|]*')
|
||||
local _, hstart = line:find "[%*%s|]*"
|
||||
if hstart then
|
||||
local hend = hstart + 7
|
||||
if hend < #line then
|
||||
vim.api.nvim_buf_add_highlight(bufnr, ns_previewer, "TelescopeResultsIdentifier", i - 1, hstart - 1, hend)
|
||||
end
|
||||
end
|
||||
local _, cstart = line:find('- %(')
|
||||
local _, cstart = line:find "- %("
|
||||
if cstart then
|
||||
local cend = string.find(line, '%) ')
|
||||
local cend = string.find(line, "%) ")
|
||||
if cend then
|
||||
vim.api.nvim_buf_add_highlight(bufnr, ns_previewer, "TelescopeResultsConstant", i - 1, cstart - 1, cend)
|
||||
end
|
||||
end
|
||||
local dstart, _ = line:find(' %(%d')
|
||||
local dstart, _ = line:find " %(%d"
|
||||
if dstart then
|
||||
vim.api.nvim_buf_add_highlight(bufnr, ns_previewer, "TelescopeResultsSpecialComment", i - 1, dstart, #line)
|
||||
end
|
||||
@@ -514,19 +552,29 @@ previewers.git_branch_log = defaulter(function(opts)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local cmd = { 'git', '--no-pager', 'log', '--graph', '--pretty=format:%h -%d %s (%cr)',
|
||||
'--abbrev-commit', '--date=relative', entry.value }
|
||||
local cmd = {
|
||||
"git",
|
||||
"--no-pager",
|
||||
"log",
|
||||
"--graph",
|
||||
"--pretty=format:%h -%d %s (%cr)",
|
||||
"--abbrev-commit",
|
||||
"--date=relative",
|
||||
entry.value,
|
||||
}
|
||||
|
||||
putils.job_maker(cmd, self.state.bufnr, {
|
||||
value = entry.value,
|
||||
bufname = self.state.bufname,
|
||||
cwd = opts.cwd,
|
||||
callback = function(bufnr, content)
|
||||
if not content then return end
|
||||
if not content then
|
||||
return
|
||||
end
|
||||
highlight_buffer(bufnr, content)
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -538,13 +586,13 @@ previewers.git_stash_diff = defaulter(function(opts)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, _)
|
||||
putils.job_maker({ 'git', '--no-pager', 'stash', 'show', '-p', entry.value }, self.state.bufnr, {
|
||||
putils.job_maker({ "git", "--no-pager", "stash", "show", "-p", entry.value }, self.state.bufnr, {
|
||||
value = entry.value,
|
||||
bufname = self.state.bufname,
|
||||
cwd = opts.cwd
|
||||
cwd = opts.cwd,
|
||||
})
|
||||
putils.regex_highlighter(self.state.bufnr, 'diff')
|
||||
end
|
||||
putils.regex_highlighter(self.state.bufnr, "diff")
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -557,9 +605,9 @@ previewers.git_commit_diff_to_parent = defaulter(function(opts)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local cmd = { 'git', '--no-pager', 'diff', entry.value .. '^!' }
|
||||
local cmd = { "git", "--no-pager", "diff", entry.value .. "^!" }
|
||||
if opts.current_file then
|
||||
table.insert(cmd, '--')
|
||||
table.insert(cmd, "--")
|
||||
table.insert(cmd, opts.current_file)
|
||||
end
|
||||
|
||||
@@ -569,10 +617,10 @@ previewers.git_commit_diff_to_parent = defaulter(function(opts)
|
||||
cwd = opts.cwd,
|
||||
callback = function(bufnr)
|
||||
search_cb_jump(self, bufnr, opts.current_line)
|
||||
end
|
||||
end,
|
||||
})
|
||||
putils.regex_highlighter(self.state.bufnr, 'diff')
|
||||
end
|
||||
putils.regex_highlighter(self.state.bufnr, "diff")
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -586,9 +634,9 @@ previewers.git_commit_diff_to_head = defaulter(function(opts)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local cmd = { 'git', '--no-pager', 'diff', '--cached', entry.value }
|
||||
local cmd = { "git", "--no-pager", "diff", "--cached", entry.value }
|
||||
if opts.current_file then
|
||||
table.insert(cmd, '--')
|
||||
table.insert(cmd, "--")
|
||||
table.insert(cmd, opts.current_file)
|
||||
end
|
||||
|
||||
@@ -598,10 +646,10 @@ previewers.git_commit_diff_to_head = defaulter(function(opts)
|
||||
cwd = opts.cwd,
|
||||
callback = function(bufnr)
|
||||
search_cb_jump(self, bufnr, opts.current_line)
|
||||
end
|
||||
end,
|
||||
})
|
||||
putils.regex_highlighter(self.state.bufnr, 'diff')
|
||||
end
|
||||
putils.regex_highlighter(self.state.bufnr, "diff")
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -615,10 +663,10 @@ previewers.git_commit_diff_as_was = defaulter(function(opts)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local cmd = { 'git', '--no-pager', 'show' }
|
||||
local cmd = { "git", "--no-pager", "show" }
|
||||
local cf = opts.current_file and Path:new(opts.current_file):make_relative(opts.cwd)
|
||||
local value = cf and (entry.value .. ':' .. cf) or (entry.value)
|
||||
local ft = cf and pfiletype.detect(value) or 'diff'
|
||||
local value = cf and (entry.value .. ":" .. cf) or entry.value
|
||||
local ft = cf and pfiletype.detect(value) or "diff"
|
||||
table.insert(cmd, value)
|
||||
|
||||
putils.job_maker(cmd, self.state.bufnr, {
|
||||
@@ -627,18 +675,18 @@ previewers.git_commit_diff_as_was = defaulter(function(opts)
|
||||
cwd = opts.cwd,
|
||||
callback = function(bufnr)
|
||||
search_cb_jump(self, bufnr, opts.current_line)
|
||||
end
|
||||
end,
|
||||
})
|
||||
putils.highlighter(self.state.bufnr, ft)
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
previewers.git_commit_message = defaulter(function(opts)
|
||||
local hl_map = {
|
||||
'TelescopeResultsIdentifier',
|
||||
'TelescopePreviewUser',
|
||||
'TelescopePreviewDate'
|
||||
"TelescopeResultsIdentifier",
|
||||
"TelescopePreviewUser",
|
||||
"TelescopePreviewDate",
|
||||
}
|
||||
return previewers.new_buffer_previewer {
|
||||
title = "Git Message",
|
||||
@@ -647,23 +695,25 @@ previewers.git_commit_message = defaulter(function(opts)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local cmd = { 'git', '--no-pager', 'log', '-n 1', entry.value }
|
||||
local cmd = { "git", "--no-pager", "log", "-n 1", entry.value }
|
||||
|
||||
putils.job_maker(cmd, self.state.bufnr, {
|
||||
value = entry.value,
|
||||
bufname = self.state.bufname,
|
||||
cwd = opts.cwd,
|
||||
callback = function(bufnr, content)
|
||||
if not content then return end
|
||||
if not content then
|
||||
return
|
||||
end
|
||||
for k, v in ipairs(hl_map) do
|
||||
local _, s = content[k]:find('%s')
|
||||
local _, s = content[k]:find "%s"
|
||||
if s then
|
||||
vim.api.nvim_buf_add_highlight(bufnr, ns_previewer, v, k - 1, s, #content[k])
|
||||
end
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -675,21 +725,23 @@ previewers.git_file_diff = defaulter(function(opts)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
if entry.status and (entry.status == '??' or entry.status == 'A ') then
|
||||
if entry.status and (entry.status == "??" or entry.status == "A ") then
|
||||
local p = from_entry.path(entry, true)
|
||||
if p == nil or p == '' then return end
|
||||
if p == nil or p == "" then
|
||||
return
|
||||
end
|
||||
conf.buffer_previewer_maker(p, self.state.bufnr, {
|
||||
bufname = self.state.bufname
|
||||
bufname = self.state.bufname,
|
||||
})
|
||||
else
|
||||
putils.job_maker({ 'git', '--no-pager', 'diff', entry.value }, self.state.bufnr, {
|
||||
putils.job_maker({ "git", "--no-pager", "diff", entry.value }, self.state.bufnr, {
|
||||
value = entry.value,
|
||||
bufname = self.state.bufname,
|
||||
cwd = opts.cwd
|
||||
cwd = opts.cwd,
|
||||
})
|
||||
putils.regex_highlighter(self.state.bufnr, 'diff')
|
||||
putils.regex_highlighter(self.state.bufnr, "diff")
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -707,7 +759,7 @@ previewers.autocommands = defaulter(function(_)
|
||||
end,
|
||||
|
||||
define_preview = function(self, entry, status)
|
||||
local results = vim.tbl_filter(function (x)
|
||||
local results = vim.tbl_filter(function(x)
|
||||
return x.group == entry.group
|
||||
end, status.picker.finder.results)
|
||||
|
||||
@@ -727,9 +779,7 @@ previewers.autocommands = defaulter(function(_)
|
||||
if item == entry then
|
||||
selected_row = idx
|
||||
end
|
||||
table.insert(display,
|
||||
string.format(" %-14s▏%-08s %s", item.event, item.ft_pattern, item.command)
|
||||
)
|
||||
table.insert(display, string.format(" %-14s▏%-08s %s", item.event, item.ft_pattern, item.command))
|
||||
end
|
||||
|
||||
vim.api.nvim_buf_set_option(self.state.bufnr, "filetype", "vim")
|
||||
@@ -745,7 +795,7 @@ previewers.autocommands = defaulter(function(_)
|
||||
end
|
||||
|
||||
vim.api.nvim_buf_add_highlight(self.state.bufnr, ns_previewer, "TelescopePreviewLine", selected_row + 1, 0, -1)
|
||||
vim.api.nvim_win_set_cursor(status.preview_win, {selected_row + 1, 0})
|
||||
vim.api.nvim_win_set_cursor(status.preview_win, { selected_row + 1, 0 })
|
||||
|
||||
self.state.last_set_bufnr = self.state.bufnr
|
||||
end,
|
||||
@@ -768,12 +818,12 @@ previewers.highlights = defaulter(function(_)
|
||||
define_preview = function(self, entry, status)
|
||||
putils.with_preview_window(status, nil, function()
|
||||
if not self.state.bufname then
|
||||
local output = vim.split(vim.fn.execute('highlight'), '\n')
|
||||
local output = vim.split(vim.fn.execute "highlight", "\n")
|
||||
local hl_groups = {}
|
||||
for _, v in ipairs(output) do
|
||||
if v ~= '' then
|
||||
if v:sub(1, 1) == ' ' then
|
||||
local part_of_old = v:match('%s+(.*)')
|
||||
if v ~= "" then
|
||||
if v:sub(1, 1) == " " then
|
||||
local part_of_old = v:match "%s+(.*)"
|
||||
hl_groups[table.getn(hl_groups)] = hl_groups[table.getn(hl_groups)] .. part_of_old
|
||||
else
|
||||
table.insert(hl_groups, v)
|
||||
@@ -783,24 +833,26 @@ previewers.highlights = defaulter(function(_)
|
||||
|
||||
vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, hl_groups)
|
||||
for k, v in ipairs(hl_groups) do
|
||||
local startPos = string.find(v, 'xxx', 1, true) - 1
|
||||
local startPos = string.find(v, "xxx", 1, true) - 1
|
||||
local endPos = startPos + 3
|
||||
local hlgroup = string.match(v, '([^ ]*)%s+.*')
|
||||
local hlgroup = string.match(v, "([^ ]*)%s+.*")
|
||||
pcall(vim.api.nvim_buf_add_highlight, self.state.bufnr, 0, hlgroup, k - 1, startPos, endPos)
|
||||
end
|
||||
end
|
||||
|
||||
pcall(vim.api.nvim_buf_clear_namespace, self.state.bufnr, ns_previewer, 0, -1)
|
||||
vim.cmd "norm! gg"
|
||||
vim.fn.search(entry.value .. ' ')
|
||||
local lnum = vim.fn.line('.')
|
||||
vim.fn.search(entry.value .. " ")
|
||||
local lnum = vim.fn.line "."
|
||||
-- That one is actually a match but its better to use it like that then matchadd
|
||||
vim.api.nvim_buf_add_highlight(self.state.bufnr,
|
||||
vim.api.nvim_buf_add_highlight(
|
||||
self.state.bufnr,
|
||||
ns_previewer,
|
||||
"TelescopePreviewMatch",
|
||||
lnum - 1,
|
||||
0,
|
||||
#entry.value)
|
||||
#entry.value
|
||||
)
|
||||
end)
|
||||
end,
|
||||
}
|
||||
@@ -810,11 +862,13 @@ previewers.display_content = defaulter(function(_)
|
||||
return previewers.new_buffer_previewer {
|
||||
define_preview = function(self, entry, status)
|
||||
putils.with_preview_window(status, nil, function()
|
||||
assert(type(entry.preview_command) == 'function',
|
||||
'entry must provide a preview_command function which will put the content into the buffer')
|
||||
assert(
|
||||
type(entry.preview_command) == "function",
|
||||
"entry must provide a preview_command function which will put the content into the buffer"
|
||||
)
|
||||
entry.preview_command(entry, self.state.bufnr)
|
||||
end)
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
|
||||
@@ -21,9 +21,9 @@
|
||||
--- :Telescope find_files previewer=false
|
||||
---@brief ]]
|
||||
|
||||
local Previewer = require('telescope.previewers.previewer')
|
||||
local term_previewer = require('telescope.previewers.term_previewer')
|
||||
local buffer_previewer = require('telescope.previewers.buffer_previewer')
|
||||
local Previewer = require "telescope.previewers.previewer"
|
||||
local term_previewer = require "telescope.previewers.term_previewer"
|
||||
local buffer_previewer = require "telescope.previewers.buffer_previewer"
|
||||
|
||||
local previewers = {}
|
||||
|
||||
@@ -99,7 +99,6 @@ end
|
||||
--- flexible `buffer_previewer` and is now deprecated.
|
||||
previewers.new_termopen_previewer = term_previewer.new_termopen_previewer
|
||||
|
||||
|
||||
--- Provides a `termopen_previewer` which has the ability to display files.
|
||||
--- It will always show the top of the file and has support for
|
||||
--- `bat`(prioritized) and `cat`. Each entry has to provide either the field
|
||||
@@ -134,7 +133,6 @@ previewers.vimgrep = term_previewer.vimgrep
|
||||
--- case it's configured that way.
|
||||
previewers.qflist = term_previewer.qflist
|
||||
|
||||
|
||||
--- An interface to instantiate a new `buffer_previewer`.
|
||||
--- That means that the content actually lives inside a vim buffer which
|
||||
--- enables us more control over the actual content. For example, we can
|
||||
@@ -241,7 +239,6 @@ previewers.new_buffer_previewer = buffer_previewer.new_buffer_previewer
|
||||
---@param opts table: keys: `use_ft_detect`, `bufname` and `callback`
|
||||
previewers.buffer_previewer_maker = buffer_previewer.file_maker
|
||||
|
||||
|
||||
--- A previewer that is used to display a file. It uses the `buffer_previewer`
|
||||
--- interface and won't jump to the line. To integrate this one into your
|
||||
--- own picker make sure that the field `path` or `filename` is set for
|
||||
@@ -273,10 +270,10 @@ previewers.vim_buffer_vimgrep = buffer_previewer.vimgrep
|
||||
previewers.vim_buffer_qflist = buffer_previewer.qflist
|
||||
|
||||
--- A previewer that shows a log of a branch as graph
|
||||
previewers.git_branch_log = buffer_previewer.git_branch_log
|
||||
previewers.git_branch_log = buffer_previewer.git_branch_log
|
||||
|
||||
--- A previewer that shows a diff of a stash
|
||||
previewers.git_stash_diff = buffer_previewer.git_stash_diff
|
||||
previewers.git_stash_diff = buffer_previewer.git_stash_diff
|
||||
|
||||
--- A previewer that shows a diff of a commit to a parent commit.<br>
|
||||
--- The run command is `git --no-pager diff SHA^! -- $CURRENT_FILE`
|
||||
@@ -288,19 +285,19 @@ previewers.git_commit_diff_to_parent = buffer_previewer.git_commit_diff_to_paren
|
||||
--- The run command is `git --no-pager diff --cached $SHA -- $CURRENT_FILE`
|
||||
---
|
||||
--- The current file part is optional. So is only uses it with bcommits.
|
||||
previewers.git_commit_diff_to_head = buffer_previewer.git_commit_diff_to_head
|
||||
previewers.git_commit_diff_to_head = buffer_previewer.git_commit_diff_to_head
|
||||
|
||||
--- A previewer that shows a diff of a commit as it was.<br>
|
||||
--- The run command is `git --no-pager show $SHA:$CURRENT_FILE` or `git --no-pager show $SHA`
|
||||
previewers.git_commit_diff_as_was = buffer_previewer.git_commit_diff_as_was
|
||||
previewers.git_commit_diff_as_was = buffer_previewer.git_commit_diff_as_was
|
||||
|
||||
--- A previewer that shows the commit message of a diff.<br>
|
||||
--- The run command is `git --no-pager log -n 1 $SHA`
|
||||
previewers.git_commit_message = buffer_previewer.git_commit_message
|
||||
previewers.git_commit_message = buffer_previewer.git_commit_message
|
||||
|
||||
--- A previewer that shows the current diff of a file. Used in git_status.<br>
|
||||
--- The run command is `git --no-pager diff $FILE`
|
||||
previewers.git_file_diff = buffer_previewer.git_file_diff
|
||||
previewers.git_file_diff = buffer_previewer.git_file_diff
|
||||
|
||||
previewers.ctags = buffer_previewer.ctags
|
||||
previewers.builtin = buffer_previewer.builtin
|
||||
@@ -309,7 +306,6 @@ previewers.man = buffer_previewer.man
|
||||
previewers.autocommands = buffer_previewer.autocommands
|
||||
previewers.highlights = buffer_previewer.highlights
|
||||
|
||||
|
||||
--- A deprecated way of displaying content more easily. Was written at a time,
|
||||
--- where the buffer_previewer interface wasn't present. Nowadays it's easier
|
||||
--- to just use this. We will keep it around for backwards compatibility
|
||||
|
||||
@@ -56,7 +56,7 @@ function Previewer:send_input(input)
|
||||
if self._send_input then
|
||||
self:_send_input(input)
|
||||
else
|
||||
vim.api.nvim_err_writeln("send_input is not defined for this previewer")
|
||||
vim.api.nvim_err_writeln "send_input is not defined for this previewer"
|
||||
end
|
||||
end
|
||||
|
||||
@@ -64,7 +64,7 @@ function Previewer:scroll_fn(direction)
|
||||
if self._scroll_fn then
|
||||
self:_scroll_fn(direction)
|
||||
else
|
||||
vim.api.nvim_err_writeln("scroll_fn is not defined for this previewer")
|
||||
vim.api.nvim_err_writeln "scroll_fn is not defined for this previewer"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
local conf = require('telescope.config').values
|
||||
local utils = require('telescope.utils')
|
||||
local Path = require('plenary.path')
|
||||
local putils = require('telescope.previewers.utils')
|
||||
local from_entry = require('telescope.from_entry')
|
||||
local Previewer = require('telescope.previewers.previewer')
|
||||
local conf = require("telescope.config").values
|
||||
local utils = require "telescope.utils"
|
||||
local Path = require "plenary.path"
|
||||
local putils = require "telescope.previewers.utils"
|
||||
local from_entry = require "telescope.from_entry"
|
||||
local Previewer = require "telescope.previewers.previewer"
|
||||
|
||||
local flatten = vim.tbl_flatten
|
||||
local buf_delete = utils.buf_delete
|
||||
@@ -14,41 +14,41 @@ local defaulter = utils.make_default_callable
|
||||
local previewers = {}
|
||||
|
||||
-- TODO: Should play with these some more, ty @clason
|
||||
local bat_options = {"--style=plain", "--color=always", "--paging=always"}
|
||||
local has_less = (vim.fn.executable('less') == 1) and conf.use_less
|
||||
local bat_options = { "--style=plain", "--color=always", "--paging=always" }
|
||||
local has_less = (vim.fn.executable "less" == 1) and conf.use_less
|
||||
|
||||
local get_file_stat = function(filename)
|
||||
return vim.loop.fs_stat(vim.fn.expand(filename)) or {}
|
||||
end
|
||||
|
||||
local list_dir = (function()
|
||||
if vim.fn.has('win32') == 1 then
|
||||
if vim.fn.has "win32" == 1 then
|
||||
return function(dirname)
|
||||
return { 'cmd.exe', '/c', 'dir', vim.fn.expand(dirname) }
|
||||
return { "cmd.exe", "/c", "dir", vim.fn.expand(dirname) }
|
||||
end
|
||||
else
|
||||
return function(dirname)
|
||||
return { 'ls', '-la', vim.fn.expand(dirname) }
|
||||
return { "ls", "-la", vim.fn.expand(dirname) }
|
||||
end
|
||||
end
|
||||
end)()
|
||||
|
||||
local bat_maker = function(filename, lnum, start, finish)
|
||||
if get_file_stat(filename).type == 'directory' then
|
||||
if get_file_stat(filename).type == "directory" then
|
||||
return list_dir(filename)
|
||||
end
|
||||
|
||||
local command = {"bat"}
|
||||
local command = { "bat" }
|
||||
|
||||
if lnum then
|
||||
table.insert(command, { "--highlight-line", lnum})
|
||||
table.insert(command, { "--highlight-line", lnum })
|
||||
end
|
||||
|
||||
if has_less then
|
||||
if start then
|
||||
table.insert(command, {"--pager", string.format("less -RS +%s", start)})
|
||||
table.insert(command, { "--pager", string.format("less -RS +%s", start) })
|
||||
else
|
||||
table.insert(command, {"--pager", "less -RS"})
|
||||
table.insert(command, { "--pager", "less -RS" })
|
||||
end
|
||||
else
|
||||
if start and finish then
|
||||
@@ -57,18 +57,21 @@ local bat_maker = function(filename, lnum, start, finish)
|
||||
end
|
||||
|
||||
return flatten {
|
||||
command, bat_options, "--", vim.fn.expand(filename)
|
||||
command,
|
||||
bat_options,
|
||||
"--",
|
||||
vim.fn.expand(filename),
|
||||
}
|
||||
end
|
||||
|
||||
local cat_maker = function(filename, _, start, _)
|
||||
if get_file_stat(filename).type == 'directory' then
|
||||
if get_file_stat(filename).type == "directory" then
|
||||
return list_dir(filename)
|
||||
end
|
||||
|
||||
if 1 == vim.fn.executable('file') then
|
||||
local output = utils.get_os_command_output{ 'file', '--mime-type', '-b', filename }
|
||||
local mime_type = vim.split(output[1], '/')[1]
|
||||
if 1 == vim.fn.executable "file" then
|
||||
local output = utils.get_os_command_output { "file", "--mime-type", "-b", filename }
|
||||
local mime_type = vim.split(output[1], "/")[1]
|
||||
if mime_type ~= "text" then
|
||||
return { "echo", "Binary file found. These files cannot be displayed!" }
|
||||
end
|
||||
@@ -76,27 +79,29 @@ local cat_maker = function(filename, _, start, _)
|
||||
|
||||
if has_less then
|
||||
if start then
|
||||
return { 'less', '-RS', string.format('+%s', start), vim.fn.expand(filename) }
|
||||
return { "less", "-RS", string.format("+%s", start), vim.fn.expand(filename) }
|
||||
else
|
||||
return { 'less', '-RS', vim.fn.expand(filename) }
|
||||
return { "less", "-RS", vim.fn.expand(filename) }
|
||||
end
|
||||
else
|
||||
return {
|
||||
"cat", "--", vim.fn.expand(filename)
|
||||
"cat",
|
||||
"--",
|
||||
vim.fn.expand(filename),
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
local get_maker = function(opts)
|
||||
local maker = opts.maker
|
||||
if not maker and 1 == vim.fn.executable("bat") then
|
||||
if not maker and 1 == vim.fn.executable "bat" then
|
||||
maker = bat_maker
|
||||
elseif not maker and 1 == vim.fn.executable("cat") then
|
||||
elseif not maker and 1 == vim.fn.executable "cat" then
|
||||
maker = cat_maker
|
||||
end
|
||||
|
||||
if not maker then
|
||||
error("Needs maker")
|
||||
error "Needs maker"
|
||||
end
|
||||
|
||||
return maker
|
||||
@@ -119,28 +124,40 @@ previewers.new_termopen_previewer = function(opts)
|
||||
local old_bufs = {}
|
||||
|
||||
local function get_term_id(self)
|
||||
if not self.state then return nil end
|
||||
if not self.state then
|
||||
return nil
|
||||
end
|
||||
return self.state.termopen_id
|
||||
end
|
||||
|
||||
local function get_bufnr(self)
|
||||
if not self.state then return nil end
|
||||
if not self.state then
|
||||
return nil
|
||||
end
|
||||
return self.state.termopen_bufnr
|
||||
end
|
||||
|
||||
local function set_term_id(self, value)
|
||||
if job_is_running(get_term_id(self)) then vim.fn.jobstop(get_term_id(self)) end
|
||||
if self.state then self.state.termopen_id = value end
|
||||
if job_is_running(get_term_id(self)) then
|
||||
vim.fn.jobstop(get_term_id(self))
|
||||
end
|
||||
if self.state then
|
||||
self.state.termopen_id = value
|
||||
end
|
||||
end
|
||||
|
||||
local function set_bufnr(self, value)
|
||||
if get_bufnr(self) then table.insert(old_bufs, get_bufnr(self)) end
|
||||
if self.state then self.state.termopen_bufnr = value end
|
||||
if get_bufnr(self) then
|
||||
table.insert(old_bufs, get_bufnr(self))
|
||||
end
|
||||
if self.state then
|
||||
self.state.termopen_bufnr = value
|
||||
end
|
||||
end
|
||||
|
||||
function opts.title(self)
|
||||
if opt_title then
|
||||
if type(opt_title) == 'function' then
|
||||
if type(opt_title) == "function" then
|
||||
return opt_title(self)
|
||||
else
|
||||
return opt_title
|
||||
@@ -158,7 +175,9 @@ previewers.new_termopen_previewer = function(opts)
|
||||
|
||||
function opts.setup(self)
|
||||
local state = {}
|
||||
if opt_setup then vim.tbl_deep_extend("force", state, opt_setup(self)) end
|
||||
if opt_setup then
|
||||
vim.tbl_deep_extend("force", state, opt_setup(self))
|
||||
end
|
||||
return state
|
||||
end
|
||||
|
||||
@@ -192,12 +211,14 @@ previewers.new_termopen_previewer = function(opts)
|
||||
|
||||
local term_opts = {
|
||||
cwd = opts.cwd or vim.fn.getcwd(),
|
||||
env = conf.set_env
|
||||
env = conf.set_env,
|
||||
}
|
||||
|
||||
putils.with_preview_window(status, bufnr, function()
|
||||
local cmd = opts.get_command(entry, status)
|
||||
if cmd then set_term_id(self, vim.fn.termopen(cmd, term_opts)) end
|
||||
if cmd then
|
||||
set_term_id(self, vim.fn.termopen(cmd, term_opts))
|
||||
end
|
||||
end)
|
||||
|
||||
vim.api.nvim_buf_set_name(bufnr, tostring(bufnr))
|
||||
@@ -223,7 +244,7 @@ previewers.new_termopen_previewer = function(opts)
|
||||
local input = direction > 0 and "d" or "u"
|
||||
local count = math.abs(direction)
|
||||
|
||||
self:send_input(count..input)
|
||||
self:send_input(count .. input)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -244,10 +265,12 @@ previewers.cat = defaulter(function(opts)
|
||||
|
||||
get_command = function(entry)
|
||||
local p = from_entry.path(entry, true)
|
||||
if p == nil or p == '' then return end
|
||||
if p == nil or p == "" then
|
||||
return
|
||||
end
|
||||
|
||||
return maker(p)
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
@@ -268,8 +291,10 @@ previewers.vimgrep = defaulter(function(opts)
|
||||
local height = vim.api.nvim_win_get_height(win_id)
|
||||
|
||||
local p = from_entry.path(entry, true)
|
||||
if p == nil or p == '' then return end
|
||||
if entry.bufnr and (p == '[No Name]' or vim.api.nvim_buf_get_option(entry.bufnr, 'buftype') ~= '') then
|
||||
if p == nil or p == "" then
|
||||
return
|
||||
end
|
||||
if entry.bufnr and (p == "[No Name]" or vim.api.nvim_buf_get_option(entry.bufnr, "buftype") ~= "") then
|
||||
return
|
||||
end
|
||||
|
||||
@@ -301,7 +326,9 @@ previewers.qflist = defaulter(function(opts)
|
||||
local height = vim.api.nvim_win_get_height(win_id)
|
||||
|
||||
local p = from_entry.path(entry, true)
|
||||
if p == nil or p == '' then return end
|
||||
if p == nil or p == "" then
|
||||
return
|
||||
end
|
||||
local lnum = entry.lnum
|
||||
|
||||
local start, finish
|
||||
@@ -315,7 +342,7 @@ previewers.qflist = defaulter(function(opts)
|
||||
end
|
||||
|
||||
return maker(p, lnum, start, finish)
|
||||
end
|
||||
end,
|
||||
}
|
||||
end, {})
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
local context_manager = require('plenary.context_manager')
|
||||
local context_manager = require "plenary.context_manager"
|
||||
|
||||
local has_ts, _ = pcall(require, 'nvim-treesitter')
|
||||
local _, ts_configs = pcall(require, 'nvim-treesitter.configs')
|
||||
local _, ts_parsers = pcall(require, 'nvim-treesitter.parsers')
|
||||
local has_ts, _ = pcall(require, "nvim-treesitter")
|
||||
local _, ts_configs = pcall(require, "nvim-treesitter.configs")
|
||||
local _, ts_parsers = pcall(require, "nvim-treesitter.parsers")
|
||||
|
||||
local Job = require('plenary.job')
|
||||
local Job = require "plenary.job"
|
||||
|
||||
local utils = {}
|
||||
|
||||
@@ -30,33 +30,41 @@ utils.job_maker = function(cmd, bufnr, opts)
|
||||
-- if any of them are missing, cache will be skipped
|
||||
if opts.bufname ~= opts.value or not opts.bufname or not opts.value then
|
||||
local command = table.remove(cmd, 1)
|
||||
Job:new({
|
||||
command = command,
|
||||
args = cmd,
|
||||
env = opts.env,
|
||||
cwd = opts.cwd,
|
||||
on_exit = vim.schedule_wrap(function(j)
|
||||
if not vim.api.nvim_buf_is_valid(bufnr) then return end
|
||||
if opts.mode == "append" then
|
||||
vim.api.nvim_buf_set_lines(bufnr, -1, -1, false, j:result())
|
||||
elseif opts.mode == "insert" then
|
||||
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, j:result())
|
||||
end
|
||||
if opts.callback then opts.callback(bufnr, j:result()) end
|
||||
end)
|
||||
}):start()
|
||||
Job
|
||||
:new({
|
||||
command = command,
|
||||
args = cmd,
|
||||
env = opts.env,
|
||||
cwd = opts.cwd,
|
||||
on_exit = vim.schedule_wrap(function(j)
|
||||
if not vim.api.nvim_buf_is_valid(bufnr) then
|
||||
return
|
||||
end
|
||||
if opts.mode == "append" then
|
||||
vim.api.nvim_buf_set_lines(bufnr, -1, -1, false, j:result())
|
||||
elseif opts.mode == "insert" then
|
||||
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, j:result())
|
||||
end
|
||||
if opts.callback then
|
||||
opts.callback(bufnr, j:result())
|
||||
end
|
||||
end),
|
||||
})
|
||||
:start()
|
||||
else
|
||||
if opts.callback then opts.callback(bufnr) end
|
||||
if opts.callback then
|
||||
opts.callback(bufnr)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function has_filetype(ft)
|
||||
return ft and ft ~= ''
|
||||
return ft and ft ~= ""
|
||||
end
|
||||
|
||||
--- Attach default highlighter which will choose between regex and ts
|
||||
utils.highlighter = function(bufnr, ft)
|
||||
if not(utils.ts_highlighter(bufnr, ft)) then
|
||||
if not (utils.ts_highlighter(bufnr, ft)) then
|
||||
utils.regex_highlighter(bufnr, ft)
|
||||
end
|
||||
end
|
||||
@@ -82,8 +90,10 @@ local treesitter_attach = function(bufnr, ft)
|
||||
end
|
||||
vim.treesitter.highlighter.new(ts_parsers.get_parser(bufnr, lang))
|
||||
local is_table = type(config.additional_vim_regex_highlighting) == "table"
|
||||
if config.additional_vim_regex_highlighting and
|
||||
(not is_table or vim.tbl_contains(config.additional_vim_regex_highlighting, lang)) then
|
||||
if
|
||||
config.additional_vim_regex_highlighting
|
||||
and (not is_table or vim.tbl_contains(config.additional_vim_regex_highlighting, lang))
|
||||
then
|
||||
vim.api.nvim_buf_set_option(bufnr, "syntax", ft)
|
||||
end
|
||||
return true
|
||||
@@ -94,10 +104,10 @@ end
|
||||
-- Attach ts highlighter
|
||||
utils.ts_highlighter = function(bufnr, ft)
|
||||
if not has_ts then
|
||||
has_ts, _ = pcall(require, 'nvim-treesitter')
|
||||
has_ts, _ = pcall(require, "nvim-treesitter")
|
||||
if has_ts then
|
||||
_, ts_configs = pcall(require, 'nvim-treesitter.configs')
|
||||
_, ts_parsers = pcall(require, 'nvim-treesitter.parsers')
|
||||
_, ts_configs = pcall(require, "nvim-treesitter.configs")
|
||||
_, ts_parsers = pcall(require, "nvim-treesitter.parsers")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local log = require('telescope.log')
|
||||
local util = require('telescope.utils')
|
||||
local log = require "telescope.log"
|
||||
local util = require "telescope.utils"
|
||||
|
||||
local sorters = {}
|
||||
|
||||
@@ -12,7 +12,7 @@ local ngram_highlighter = function(ngram_len, prompt, display)
|
||||
if prompt:find(char, 1, true) then
|
||||
table.insert(highlights, {
|
||||
start = disp_index,
|
||||
finish = disp_index + ngram_len - 1
|
||||
finish = disp_index + ngram_len - 1,
|
||||
})
|
||||
end
|
||||
end
|
||||
@@ -22,7 +22,6 @@ end
|
||||
|
||||
local FILTERED = -1
|
||||
|
||||
|
||||
local Sorter = {}
|
||||
Sorter.__index = Sorter
|
||||
|
||||
@@ -51,9 +50,9 @@ function Sorter:new(opts)
|
||||
tags = opts.tags,
|
||||
|
||||
-- State management
|
||||
init = opts.init,
|
||||
start = opts.start,
|
||||
finish = opts.finish,
|
||||
init = opts.init,
|
||||
start = opts.start,
|
||||
finish = opts.finish,
|
||||
destroy = opts.destroy,
|
||||
|
||||
filter_function = opts.filter_function,
|
||||
@@ -62,17 +61,21 @@ function Sorter:new(opts)
|
||||
discard = opts.discard,
|
||||
_discard_state = {
|
||||
filtered = {},
|
||||
prompt = '',
|
||||
prompt = "",
|
||||
},
|
||||
}, Sorter)
|
||||
end
|
||||
|
||||
function Sorter:_init()
|
||||
if self.init then self:init() end
|
||||
if self.init then
|
||||
self:init()
|
||||
end
|
||||
end
|
||||
|
||||
function Sorter:_destroy()
|
||||
if self.destroy then self:destroy() end
|
||||
if self.destroy then
|
||||
self:destroy()
|
||||
end
|
||||
end
|
||||
|
||||
-- TODO: We could make this a bit smarter and cache results "as we go" and where they got filtered.
|
||||
@@ -81,7 +84,9 @@ end
|
||||
-- as he did in his example.
|
||||
-- Example can be found in ./scratch/prime_prompt_cache.lua
|
||||
function Sorter:_start(prompt)
|
||||
if self.start then self:start(prompt) end
|
||||
if self.start then
|
||||
self:start(prompt)
|
||||
end
|
||||
|
||||
if not self.discard then
|
||||
return
|
||||
@@ -91,10 +96,10 @@ function Sorter:_start(prompt)
|
||||
local len_previous = #previous
|
||||
|
||||
if #prompt < len_previous then
|
||||
log.debug("Reset discard because shorter prompt")
|
||||
log.debug "Reset discard because shorter prompt"
|
||||
self._discard_state.filtered = {}
|
||||
elseif string.sub(prompt, 1, len_previous) ~= previous then
|
||||
log.debug("Reset discard no match")
|
||||
log.debug "Reset discard no match"
|
||||
self._discard_state.filtered = {}
|
||||
end
|
||||
|
||||
@@ -102,13 +107,17 @@ function Sorter:_start(prompt)
|
||||
end
|
||||
|
||||
function Sorter:_finish(prompt)
|
||||
if self.finish then self:finish(prompt) end
|
||||
if self.finish then
|
||||
self:finish(prompt)
|
||||
end
|
||||
end
|
||||
|
||||
-- TODO: Consider doing something that makes it so we can skip the filter checks
|
||||
-- if we're not discarding. Also, that means we don't have to check otherwise as well :)
|
||||
function Sorter:score(prompt, entry, cb_add, cb_filter)
|
||||
if not entry or not entry.ordinal then return end
|
||||
if not entry or not entry.ordinal then
|
||||
return
|
||||
end
|
||||
|
||||
local ordinal = entry.ordinal
|
||||
if self:_was_discarded(prompt, ordinal) then
|
||||
@@ -117,7 +126,9 @@ function Sorter:score(prompt, entry, cb_add, cb_filter)
|
||||
|
||||
local filter_score
|
||||
if self.filter_function ~= nil then
|
||||
if self.tags then self.tags:insert(entry) end
|
||||
if self.tags then
|
||||
self.tags:insert(entry)
|
||||
end
|
||||
filter_score, prompt = self:filter_function(prompt, entry)
|
||||
end
|
||||
|
||||
@@ -159,7 +170,7 @@ sorters.Sorter = Sorter
|
||||
TelescopeCachedTails = TelescopeCachedTails or nil
|
||||
if not TelescopeCachedTails then
|
||||
local os_sep = util.get_separator()
|
||||
local match_string = '[^' .. os_sep .. ']*$'
|
||||
local match_string = "[^" .. os_sep .. "]*$"
|
||||
TelescopeCachedTails = setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
local tail = string.match(k, match_string)
|
||||
@@ -170,20 +181,21 @@ if not TelescopeCachedTails then
|
||||
})
|
||||
end
|
||||
|
||||
TelescopeCachedUppers = TelescopeCachedUppers or setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
local obj = {}
|
||||
for i = 1, #k do
|
||||
local s_byte = k:byte(i, i)
|
||||
if s_byte <= 90 and s_byte >= 65 then
|
||||
obj[s_byte] = true
|
||||
TelescopeCachedUppers = TelescopeCachedUppers
|
||||
or setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
local obj = {}
|
||||
for i = 1, #k do
|
||||
local s_byte = k:byte(i, i)
|
||||
if s_byte <= 90 and s_byte >= 65 then
|
||||
obj[s_byte] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
rawset(t, k, obj)
|
||||
return obj
|
||||
end
|
||||
})
|
||||
rawset(t, k, obj)
|
||||
return obj
|
||||
end,
|
||||
})
|
||||
|
||||
TelescopeCachedNgrams = TelescopeCachedNgrams or {}
|
||||
|
||||
@@ -201,7 +213,7 @@ sorters.get_fuzzy_file = function(opts)
|
||||
|
||||
local R = {}
|
||||
for i = 1, s:len() - n + 1 do
|
||||
R[#R+1] = s:sub(i, i+n-1)
|
||||
R[#R + 1] = s:sub(i, i + n - 1)
|
||||
end
|
||||
|
||||
if not TelescopeCachedNgrams[s] then
|
||||
@@ -267,19 +279,17 @@ sorters.get_fuzzy_file = function(opts)
|
||||
end
|
||||
|
||||
local denominator = (
|
||||
(10 * match_count / #prompt_lower_ngrams)
|
||||
-- biases for shorter strings
|
||||
+ 3 * match_count * ngram_len / #line
|
||||
+ consecutive_matches
|
||||
+ N / (contains_string or (2 * #line))
|
||||
|
||||
-- + 30/(c1 or 2*N)
|
||||
|
||||
-- TODO: It might be possible that this too strongly correlates,
|
||||
-- but it's unlikely for people to type capital letters without actually
|
||||
-- wanting to do something with a capital letter in it.
|
||||
+ uppers_matching
|
||||
) * tail_modifier
|
||||
(10 * match_count / #prompt_lower_ngrams)
|
||||
-- biases for shorter strings
|
||||
+ 3 * match_count * ngram_len / #line
|
||||
+ consecutive_matches
|
||||
+ N / (contains_string or (2 * #line))
|
||||
-- + 30/(c1 or 2*N)
|
||||
-- TODO: It might be possible that this too strongly correlates,
|
||||
-- but it's unlikely for people to type capital letters without actually
|
||||
-- wanting to do something with a capital letter in it.
|
||||
+ uppers_matching
|
||||
) * tail_modifier
|
||||
|
||||
if denominator == 0 or denominator ~= denominator then
|
||||
return -1
|
||||
@@ -310,7 +320,7 @@ sorters.get_generic_fuzzy_sorter = function(opts)
|
||||
|
||||
local R = {}
|
||||
for i = 1, s:len() - n + 1 do
|
||||
R[#R+1] = s:sub(i, i+n-1)
|
||||
R[#R + 1] = s:sub(i, i + n - 1)
|
||||
end
|
||||
|
||||
if not TelescopeCachedNgrams[s] then
|
||||
@@ -359,15 +369,15 @@ sorters.get_generic_fuzzy_sorter = function(opts)
|
||||
|
||||
-- TODO: Copied from ashkan.
|
||||
local denominator = (
|
||||
(10 * match_count / #prompt_ngrams)
|
||||
-- biases for shorter strings
|
||||
-- TODO(ashkan): this can bias towards repeated finds of the same
|
||||
-- subpattern with overlapping_ngrams
|
||||
+ 3 * match_count * ngram_len / #line
|
||||
+ consecutive_matches
|
||||
+ N / (contains_string or (2 * #line))
|
||||
-- + 30/(c1 or 2*N)
|
||||
)
|
||||
(10 * match_count / #prompt_ngrams)
|
||||
-- biases for shorter strings
|
||||
-- TODO(ashkan): this can bias towards repeated finds of the same
|
||||
-- subpattern with overlapping_ngrams
|
||||
+ 3 * match_count * ngram_len / #line
|
||||
+ consecutive_matches
|
||||
+ N / (contains_string or (2 * #line)) -- + 30/(c1 or 2*N)
|
||||
|
||||
)
|
||||
|
||||
if denominator == 0 or denominator ~= denominator then
|
||||
return -1
|
||||
@@ -406,17 +416,17 @@ sorters.fuzzy_with_index_bias = function(opts)
|
||||
else
|
||||
return math.min(math.pow(entry.index, 0.25), 2) * base_score
|
||||
end
|
||||
end
|
||||
end,
|
||||
}
|
||||
end
|
||||
|
||||
-- Sorter using the fzy algorithm
|
||||
sorters.get_fzy_sorter = function(opts)
|
||||
opts = opts or {}
|
||||
local fzy = opts.fzy_mod or require('telescope.algos.fzy')
|
||||
local fzy = opts.fzy_mod or require "telescope.algos.fzy"
|
||||
local OFFSET = -fzy.get_score_floor()
|
||||
|
||||
return sorters.Sorter:new{
|
||||
return sorters.Sorter:new {
|
||||
discard = true,
|
||||
|
||||
scoring_function = function(_, prompt, line)
|
||||
@@ -454,10 +464,12 @@ end
|
||||
|
||||
sorters.highlighter_only = function(opts)
|
||||
opts = opts or {}
|
||||
local fzy = opts.fzy_mod or require('telescope.algos.fzy')
|
||||
local fzy = opts.fzy_mod or require "telescope.algos.fzy"
|
||||
|
||||
return Sorter:new {
|
||||
scoring_function = function() return 0 end,
|
||||
scoring_function = function()
|
||||
return 0
|
||||
end,
|
||||
|
||||
highlighter = function(_, prompt, display)
|
||||
return fzy.positions(prompt, display)
|
||||
@@ -467,7 +479,9 @@ end
|
||||
|
||||
sorters.empty = function()
|
||||
return Sorter:new {
|
||||
scoring_function = function() return 0 end,
|
||||
scoring_function = function()
|
||||
return 0
|
||||
end,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -475,8 +489,8 @@ end
|
||||
sorters.get_levenshtein_sorter = function()
|
||||
return Sorter:new {
|
||||
scoring_function = function(_, prompt, line)
|
||||
return require('telescope.algos.string_distance')(prompt, line)
|
||||
end
|
||||
return require "telescope.algos.string_distance"(prompt, line)
|
||||
end,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -490,7 +504,7 @@ local substr_highlighter = function(_, prompt, display)
|
||||
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})
|
||||
table.insert(highlights, { start = hl_start, finish = hl_end })
|
||||
end
|
||||
end
|
||||
|
||||
@@ -501,20 +515,20 @@ sorters.get_substr_matcher = function()
|
||||
return Sorter:new {
|
||||
highlighter = substr_highlighter,
|
||||
scoring_function = function(_, prompt, _, entry)
|
||||
local display = entry.ordinal:lower()
|
||||
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
|
||||
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
|
||||
end
|
||||
|
||||
return matched == total_search_terms and entry.index or -1
|
||||
end
|
||||
return matched == total_search_terms and entry.index or -1
|
||||
end,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -552,25 +566,29 @@ local filter_function = function(opts)
|
||||
end
|
||||
|
||||
local function create_tag_set(tag)
|
||||
tag = vim.F.if_nil(tag, 'ordinal')
|
||||
tag = vim.F.if_nil(tag, "ordinal")
|
||||
local set = {}
|
||||
return setmetatable(set, {
|
||||
__index = {
|
||||
insert = function(set_, entry)
|
||||
local value = entry[tag]
|
||||
if not set_[value] then set_[value] = true end
|
||||
end
|
||||
}
|
||||
if not set_[value] then
|
||||
set_[value] = true
|
||||
end
|
||||
end,
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
sorters.prefilter = function(opts)
|
||||
local sorter = opts.sorter
|
||||
opts.delimiter = util.get_default(opts.delimiter, ':')
|
||||
opts.delimiter = util.get_default(opts.delimiter, ":")
|
||||
sorter._delimiter = opts.delimiter
|
||||
sorter.tags = create_tag_set(opts.tag)
|
||||
sorter.filter_function = filter_function(opts)
|
||||
sorter._was_discarded = function() return false end
|
||||
sorter._was_discarded = function()
|
||||
return false
|
||||
end
|
||||
return sorter
|
||||
end
|
||||
|
||||
|
||||
@@ -48,10 +48,10 @@ function themes.get_dropdown(opts)
|
||||
|
||||
border = true,
|
||||
borderchars = {
|
||||
{ "─", "│", "─", "│", "╭", "╮", "╯", "╰"},
|
||||
prompt = {"─", "│", " ", "│", "╭", "╮", "│", "│"},
|
||||
results = {"─", "│", "─", "│", "├", "┤", "╯", "╰"},
|
||||
preview = { "─", "│", "─", "│", "╭", "╮", "╯", "╰"},
|
||||
{ "─", "│", "─", "│", "╭", "╮", "╯", "╰" },
|
||||
prompt = { "─", "│", " ", "│", "╭", "╮", "│", "│" },
|
||||
results = { "─", "│", "─", "│", "├", "┤", "╯", "╰" },
|
||||
preview = { "─", "│", "─", "│", "╭", "╮", "╯", "╰" },
|
||||
},
|
||||
}
|
||||
|
||||
@@ -71,11 +71,11 @@ function themes.get_cursor(opts)
|
||||
opts = opts or {}
|
||||
|
||||
local theme_opts = {
|
||||
theme = 'cursor',
|
||||
theme = "cursor",
|
||||
|
||||
sorting_strategy = 'ascending',
|
||||
sorting_strategy = "ascending",
|
||||
results_title = false,
|
||||
layout_strategy = 'cursor',
|
||||
layout_strategy = "cursor",
|
||||
layout_config = {
|
||||
width = function(_, _, _)
|
||||
return 80
|
||||
@@ -86,14 +86,14 @@ function themes.get_cursor(opts)
|
||||
end,
|
||||
},
|
||||
borderchars = {
|
||||
{ '─', '│', '─', '│', '╭', '╮', '╯', '╰'},
|
||||
prompt = {'─', '│', ' ', '│', '╭', '╮', '│', '│'},
|
||||
results = {'─', '│', '─', '│', '├', '┤', '╯', '╰'},
|
||||
preview = { '─', '│', '─', '│', '╭', '╮', '╯', '╰'},
|
||||
{ "─", "│", "─", "│", "╭", "╮", "╯", "╰" },
|
||||
prompt = { "─", "│", " ", "│", "╭", "╮", "│", "│" },
|
||||
results = { "─", "│", "─", "│", "├", "┤", "╯", "╰" },
|
||||
preview = { "─", "│", "─", "│", "╭", "╮", "╯", "╰" },
|
||||
},
|
||||
}
|
||||
|
||||
return vim.tbl_deep_extend('force', theme_opts, opts)
|
||||
return vim.tbl_deep_extend("force", theme_opts, opts)
|
||||
end
|
||||
|
||||
--- Ivy style theme.
|
||||
@@ -126,7 +126,7 @@ function themes.get_ivy(opts)
|
||||
prompt = { "─", " ", " ", " ", "─", "─", " ", " " },
|
||||
results = { " " },
|
||||
-- results = { "a", "b", "c", "d", "e", "f", "g", "h" },
|
||||
preview = { "─", "│", "─", "│", "╭", "╮", "╯", "╰"},
|
||||
preview = { "─", "│", "─", "│", "╭", "╮", "╯", "╰" },
|
||||
},
|
||||
}, opts)
|
||||
end
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
local has_devicons, devicons = pcall(require, 'nvim-web-devicons')
|
||||
local has_devicons, devicons = pcall(require, "nvim-web-devicons")
|
||||
|
||||
local Path = require('plenary.path')
|
||||
local Job = require('plenary.job')
|
||||
local Path = require "plenary.path"
|
||||
local Job = require "plenary.job"
|
||||
|
||||
local log = require('telescope.log')
|
||||
local log = require "telescope.log"
|
||||
|
||||
local utils = {}
|
||||
|
||||
@@ -47,7 +47,7 @@ utils.default_table_mt = {
|
||||
local obj = {}
|
||||
rawset(t, k, obj)
|
||||
return obj
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
utils.repeated_table = function(n, val)
|
||||
@@ -62,13 +62,14 @@ utils.quickfix_items_to_entries = function(locations)
|
||||
local results = {}
|
||||
|
||||
for _, entry in ipairs(locations) do
|
||||
local vimgrep_str = entry.vimgrep_str or string.format(
|
||||
"%s:%s:%s: %s",
|
||||
vim.fn.fnamemodify(entry.display_filename or entry.filename, ":."),
|
||||
entry.lnum,
|
||||
entry.col,
|
||||
entry.text
|
||||
)
|
||||
local vimgrep_str = entry.vimgrep_str
|
||||
or string.format(
|
||||
"%s:%s:%s: %s",
|
||||
vim.fn.fnamemodify(entry.display_filename or entry.filename, ":."),
|
||||
entry.lnum,
|
||||
entry.col,
|
||||
entry.text
|
||||
)
|
||||
|
||||
table.insert(results, {
|
||||
valid = true,
|
||||
@@ -119,7 +120,7 @@ utils.filter_symbols = function(results, opts)
|
||||
end
|
||||
end
|
||||
else
|
||||
print("Please pass filtering symbols as either a string or a list of strings")
|
||||
print "Please pass filtering symbols as either a string or a list of strings"
|
||||
return
|
||||
end
|
||||
|
||||
@@ -131,7 +132,7 @@ utils.filter_symbols = function(results, opts)
|
||||
if filename_to_bufnr[symbol.filename] == nil then
|
||||
filename_to_bufnr[symbol.filename] = vim.uri_to_bufnr(vim.uri_from_fname(symbol.filename))
|
||||
end
|
||||
symbol['bufnr'] = filename_to_bufnr[symbol.filename]
|
||||
symbol["bufnr"] = filename_to_bufnr[symbol.filename]
|
||||
end
|
||||
table.sort(filtered_symbols, function(a, b)
|
||||
if a.bufnr == b.bufnr then
|
||||
@@ -145,17 +146,17 @@ utils.filter_symbols = function(results, opts)
|
||||
end
|
||||
return a.bufnr < b.bufnr
|
||||
end)
|
||||
return filtered_symbols
|
||||
return filtered_symbols
|
||||
end
|
||||
-- only account for string|table as function otherwise already printed message and returned nil
|
||||
local symbols = type(opts.symbols) == 'string' and opts.symbols or table.concat(opts.symbols, ', ')
|
||||
local symbols = type(opts.symbols) == "string" and opts.symbols or table.concat(opts.symbols, ", ")
|
||||
print(string.format("%s symbol(s) were not part of the query results", symbols))
|
||||
return
|
||||
end
|
||||
|
||||
local convert_diagnostic_type = function(severity)
|
||||
-- convert from string to int
|
||||
if type(severity) == 'string' then
|
||||
if type(severity) == "string" then
|
||||
-- make sure that e.g. error is uppercased to Error
|
||||
return vim.lsp.protocol.DiagnosticSeverity[severity:gsub("^%l", string.upper)]
|
||||
end
|
||||
@@ -186,20 +187,20 @@ utils.diagnostics_to_tbl = function(opts)
|
||||
opts.severity_bound = convert_diagnostic_type(opts.severity_bound)
|
||||
|
||||
local validate_severity = 0
|
||||
for _, v in ipairs({opts.severity, opts.severity_limit, opts.severity_bound}) do
|
||||
for _, v in ipairs { opts.severity, opts.severity_limit, opts.severity_bound } do
|
||||
if v ~= nil then
|
||||
validate_severity = validate_severity + 1
|
||||
end
|
||||
if validate_severity > 1 then
|
||||
print('Please pass valid severity parameters')
|
||||
print "Please pass valid severity parameters"
|
||||
return {}
|
||||
end
|
||||
end
|
||||
|
||||
local preprocess_diag = function(diag, bufnr)
|
||||
local filename = vim.api.nvim_buf_get_name(bufnr)
|
||||
local start = diag.range['start']
|
||||
local finish = diag.range['end']
|
||||
local start = diag.range["start"]
|
||||
local finish = diag.range["end"]
|
||||
local row = start.line
|
||||
local col = start.character
|
||||
|
||||
@@ -212,13 +213,13 @@ utils.diagnostics_to_tbl = function(opts)
|
||||
finish = finish,
|
||||
-- remove line break to avoid display issues
|
||||
text = vim.trim(diag.message:gsub("[\n]", "")),
|
||||
type = lsp_type_diagnostic[diag.severity] or lsp_type_diagnostic[1]
|
||||
type = lsp_type_diagnostic[diag.severity] or lsp_type_diagnostic[1],
|
||||
}
|
||||
return buffer_diag
|
||||
end
|
||||
|
||||
local buffer_diags = opts.get_all and vim.lsp.diagnostic.get_all() or
|
||||
{[current_buf] = vim.lsp.diagnostic.get(current_buf, opts.client_id)}
|
||||
local buffer_diags = opts.get_all and vim.lsp.diagnostic.get_all()
|
||||
or { [current_buf] = vim.lsp.diagnostic.get(current_buf, opts.client_id) }
|
||||
for bufnr, diags in pairs(buffer_diags) do
|
||||
for _, diag in ipairs(diags) do
|
||||
-- workspace diagnostics may include empty tables for unused bufnr
|
||||
@@ -253,14 +254,14 @@ utils.diagnostics_to_tbl = function(opts)
|
||||
return items
|
||||
end
|
||||
|
||||
utils.path_shorten = function(filename,len)
|
||||
log.warn("`utils.path_shorten` is deprecated. Use `require('plenary.path').shorten`.")
|
||||
utils.path_shorten = function(filename, len)
|
||||
log.warn "`utils.path_shorten` is deprecated. Use `require('plenary.path').shorten`."
|
||||
return Path:new(filename):shorten(len)
|
||||
end
|
||||
|
||||
utils.path_tail = (function()
|
||||
local os_sep = utils.get_separator()
|
||||
local match_string = '[^' .. os_sep .. ']*$'
|
||||
local match_string = "[^" .. os_sep .. "]*$"
|
||||
|
||||
return function(path)
|
||||
return string.match(path, match_string)
|
||||
@@ -268,25 +269,25 @@ utils.path_tail = (function()
|
||||
end)()
|
||||
|
||||
utils.is_path_hidden = function(opts, path_display)
|
||||
path_display = path_display or utils.get_default(opts.path_display, require('telescope.config').values.path_display)
|
||||
path_display = path_display or utils.get_default(opts.path_display, require("telescope.config").values.path_display)
|
||||
|
||||
return path_display == nil or path_display == "hidden" or
|
||||
type(path_display) ~= "table" or vim.tbl_contains(path_display, "hidden") or path_display.hidden
|
||||
return path_display == nil
|
||||
or path_display == "hidden"
|
||||
or type(path_display) ~= "table"
|
||||
or vim.tbl_contains(path_display, "hidden")
|
||||
or path_display.hidden
|
||||
end
|
||||
|
||||
utils.transform_path = function(opts, path)
|
||||
local path_display = utils.get_default(opts.path_display, require('telescope.config').values.path_display)
|
||||
local path_display = utils.get_default(opts.path_display, require("telescope.config").values.path_display)
|
||||
|
||||
local transformed_path = path
|
||||
|
||||
if type(path_display) == "function" then
|
||||
return path_display(opts, transformed_path)
|
||||
|
||||
elseif utils.is_path_hidden(nil, path_display) then
|
||||
return ''
|
||||
|
||||
return ""
|
||||
elseif type(path_display) == "table" then
|
||||
|
||||
if vim.tbl_contains(path_display, "tail") or path_display.tail then
|
||||
transformed_path = utils.path_tail(transformed_path)
|
||||
else
|
||||
@@ -298,7 +299,7 @@ utils.transform_path = function(opts, path)
|
||||
cwd = vim.fn.expand(opts.cwd)
|
||||
end
|
||||
else
|
||||
cwd = vim.loop.cwd();
|
||||
cwd = vim.loop.cwd()
|
||||
end
|
||||
transformed_path = Path:new(transformed_path):make_relative(cwd)
|
||||
end
|
||||
@@ -310,8 +311,7 @@ utils.transform_path = function(opts, path)
|
||||
|
||||
return transformed_path
|
||||
else
|
||||
log.warn("`path_display` must be either a function or a table.",
|
||||
"See `:help telescope.defaults.path_display.")
|
||||
log.warn("`path_display` must be either a function or a table.", "See `:help telescope.defaults.path_display.")
|
||||
return transformed_path
|
||||
end
|
||||
end
|
||||
@@ -338,31 +338,39 @@ function utils.make_default_callable(f, default_opts)
|
||||
if not ok then
|
||||
error(debug.traceback(err))
|
||||
end
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
|
||||
function utils.job_is_running(job_id)
|
||||
if job_id == nil then return false end
|
||||
return vim.fn.jobwait({job_id}, 0)[1] == -1
|
||||
if job_id == nil then
|
||||
return false
|
||||
end
|
||||
return vim.fn.jobwait({ job_id }, 0)[1] == -1
|
||||
end
|
||||
|
||||
function utils.buf_delete(bufnr)
|
||||
if bufnr == nil then return end
|
||||
if bufnr == nil then
|
||||
return
|
||||
end
|
||||
|
||||
-- Suppress the buffer deleted message for those with &report<2
|
||||
local start_report = vim.o.report
|
||||
if start_report < 2 then vim.o.report = 2 end
|
||||
if start_report < 2 then
|
||||
vim.o.report = 2
|
||||
end
|
||||
|
||||
if vim.api.nvim_buf_is_valid(bufnr) and vim.api.nvim_buf_is_loaded(bufnr) then
|
||||
vim.api.nvim_buf_delete(bufnr, { force = true })
|
||||
end
|
||||
|
||||
if start_report < 2 then vim.o.report = start_report end
|
||||
if start_report < 2 then
|
||||
vim.o.report = start_report
|
||||
end
|
||||
end
|
||||
|
||||
function utils.max_split(s, pattern, maxsplit)
|
||||
pattern = pattern or ' '
|
||||
pattern = pattern or " "
|
||||
maxsplit = maxsplit or -1
|
||||
|
||||
local t = {}
|
||||
@@ -393,12 +401,11 @@ function utils.max_split(s, pattern, maxsplit)
|
||||
return t
|
||||
end
|
||||
|
||||
|
||||
function utils.data_directory()
|
||||
local sourced_file = require('plenary.debug_utils').sourced_filepath()
|
||||
local sourced_file = require("plenary.debug_utils").sourced_filepath()
|
||||
local base_directory = vim.fn.fnamemodify(sourced_file, ":h:h:h")
|
||||
|
||||
return Path:new({base_directory, 'data'}):absolute() .. Path.path.sep
|
||||
return Path:new({ base_directory, "data" }):absolute() .. Path.path.sep
|
||||
end
|
||||
|
||||
function utils.display_termcodes(str)
|
||||
@@ -407,31 +414,38 @@ end
|
||||
|
||||
function utils.get_os_command_output(cmd, cwd)
|
||||
if type(cmd) ~= "table" then
|
||||
print('Telescope: [get_os_command_output]: cmd has to be a table')
|
||||
print "Telescope: [get_os_command_output]: cmd has to be a table"
|
||||
return {}
|
||||
end
|
||||
local command = table.remove(cmd, 1)
|
||||
local stderr = {}
|
||||
local stdout, ret = Job:new({ command = command, args = cmd, cwd = cwd, on_stderr = function(_, data)
|
||||
table.insert(stderr, data)
|
||||
end }):sync()
|
||||
local stdout, ret = Job
|
||||
:new({
|
||||
command = command,
|
||||
args = cmd,
|
||||
cwd = cwd,
|
||||
on_stderr = function(_, data)
|
||||
table.insert(stderr, data)
|
||||
end,
|
||||
})
|
||||
:sync()
|
||||
return stdout, ret, stderr
|
||||
end
|
||||
|
||||
utils.strdisplaywidth = function()
|
||||
error("strdisplaywidth deprecated. please use plenary.strings.strdisplaywidth")
|
||||
error "strdisplaywidth deprecated. please use plenary.strings.strdisplaywidth"
|
||||
end
|
||||
|
||||
utils.utf_ptr2len = function()
|
||||
error("utf_ptr2len deprecated. please use plenary.strings.utf_ptr2len")
|
||||
error "utf_ptr2len deprecated. please use plenary.strings.utf_ptr2len"
|
||||
end
|
||||
|
||||
utils.strcharpart = function()
|
||||
error("strcharpart deprecated. please use plenary.strings.strcharpart")
|
||||
error "strcharpart deprecated. please use plenary.strings.strcharpart"
|
||||
end
|
||||
|
||||
utils.align_str = function()
|
||||
error("align_str deprecated. please use plenary.strings.align_str")
|
||||
error "align_str deprecated. please use plenary.strings.align_str"
|
||||
end
|
||||
|
||||
utils.transform_devicons = (function()
|
||||
@@ -441,13 +455,13 @@ utils.transform_devicons = (function()
|
||||
end
|
||||
|
||||
return function(filename, display, disable_devicons)
|
||||
local conf = require('telescope.config').values
|
||||
local conf = require("telescope.config").values
|
||||
if disable_devicons or not filename then
|
||||
return display
|
||||
end
|
||||
|
||||
local icon, icon_highlight = devicons.get_icon(filename, string.match(filename, '%a+$'), { default = true })
|
||||
local icon_display = (icon or ' ') .. ' ' .. (display or '')
|
||||
local icon, icon_highlight = devicons.get_icon(filename, string.match(filename, "%a+$"), { default = true })
|
||||
local icon_display = (icon or " ") .. " " .. (display or "")
|
||||
|
||||
if conf.color_devicons then
|
||||
return icon_display, icon_highlight
|
||||
@@ -469,12 +483,12 @@ utils.get_devicons = (function()
|
||||
end
|
||||
|
||||
return function(filename, disable_devicons)
|
||||
local conf = require('telescope.config').values
|
||||
local conf = require("telescope.config").values
|
||||
if disable_devicons or not filename then
|
||||
return ''
|
||||
return ""
|
||||
end
|
||||
|
||||
local icon, icon_highlight = devicons.get_icon(filename, string.match(filename, '%a+$'), { default = true })
|
||||
local icon, icon_highlight = devicons.get_icon(filename, string.match(filename, "%a+$"), { default = true })
|
||||
if conf.color_devicons then
|
||||
return icon, icon_highlight
|
||||
else
|
||||
@@ -483,7 +497,7 @@ utils.get_devicons = (function()
|
||||
end
|
||||
else
|
||||
return function(_, _)
|
||||
return ''
|
||||
return ""
|
||||
end
|
||||
end
|
||||
end)()
|
||||
|
||||
@@ -1,70 +1,92 @@
|
||||
local actions = require('telescope.actions')
|
||||
local action_set = require('telescope.actions.set')
|
||||
local actions = require "telescope.actions"
|
||||
local action_set = require "telescope.actions.set"
|
||||
|
||||
local transform_mod = require('telescope.actions.mt').transform_mod
|
||||
local transform_mod = require("telescope.actions.mt").transform_mod
|
||||
|
||||
local eq = function(a, b)
|
||||
assert.are.same(a, b)
|
||||
end
|
||||
|
||||
describe('actions', function()
|
||||
it('should allow creating custom actions', function()
|
||||
describe("actions", function()
|
||||
it("should allow creating custom actions", function()
|
||||
local a = transform_mod {
|
||||
x = function() return 5 end,
|
||||
x = function()
|
||||
return 5
|
||||
end,
|
||||
}
|
||||
|
||||
|
||||
eq(5, a.x())
|
||||
end)
|
||||
|
||||
it('allows adding actions', function()
|
||||
it("allows adding actions", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "x" end,
|
||||
y = function() return "y" end,
|
||||
x = function()
|
||||
return "x"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
local x_plus_y = a.x + a.y
|
||||
|
||||
eq({"x", "y"}, {x_plus_y()})
|
||||
eq({ "x", "y" }, { x_plus_y() })
|
||||
end)
|
||||
|
||||
it('ignores nils from added actions', function()
|
||||
it("ignores nils from added actions", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "x" end,
|
||||
y = function() return "y" end,
|
||||
nil_maker = function() return nil end,
|
||||
x = function()
|
||||
return "x"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
nil_maker = function()
|
||||
return nil
|
||||
end,
|
||||
}
|
||||
|
||||
local x_plus_y = a.x + a.nil_maker + a.y
|
||||
|
||||
eq({"x", "y"}, {x_plus_y()})
|
||||
eq({ "x", "y" }, { x_plus_y() })
|
||||
end)
|
||||
|
||||
it('allows overriding an action', function()
|
||||
it("allows overriding an action", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "x" end,
|
||||
y = function() return "y" end,
|
||||
x = function()
|
||||
return "x"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
-- actions.file_goto_selection_edit:replace(...)
|
||||
a.x:replace(function() return "foo" end)
|
||||
a.x:replace(function()
|
||||
return "foo"
|
||||
end)
|
||||
eq("foo", a.x())
|
||||
|
||||
a._clear()
|
||||
eq("x", a.x())
|
||||
end)
|
||||
|
||||
it('allows overriding an action only in specific cases with if', function()
|
||||
it("allows overriding an action only in specific cases with if", function()
|
||||
local a = transform_mod {
|
||||
x = function(e) return e * 10 end,
|
||||
y = function() return "y" end,
|
||||
x = function(e)
|
||||
return e * 10
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
-- actions.file_goto_selection_edit:replace(...)
|
||||
a.x:replace_if(
|
||||
function(e) return e > 0 end,
|
||||
function(e) return (e / 10) end
|
||||
)
|
||||
a.x:replace_if(function(e)
|
||||
return e > 0
|
||||
end, function(e)
|
||||
return (e / 10)
|
||||
end)
|
||||
eq(-100, a.x(-10))
|
||||
eq(10, a.x(100))
|
||||
eq(1, a.x(10))
|
||||
@@ -73,16 +95,28 @@ describe('actions', function()
|
||||
eq(100, a.x(10))
|
||||
end)
|
||||
|
||||
it('allows overriding an action only in specific cases with mod', function()
|
||||
it("allows overriding an action only in specific cases with mod", function()
|
||||
local a = transform_mod {
|
||||
x = function(e) return e * 10 end,
|
||||
y = function() return "y" end,
|
||||
x = function(e)
|
||||
return e * 10
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
-- actions.file_goto_selection_edit:replace(...)
|
||||
a.x:replace_map {
|
||||
[function(e) return e > 0 end] = function(e) return (e / 10) end,
|
||||
[function(e) return e == 0 end] = function(e) return (e + 10) end,
|
||||
[function(e)
|
||||
return e > 0
|
||||
end] = function(e)
|
||||
return (e / 10)
|
||||
end,
|
||||
[function(e)
|
||||
return e == 0
|
||||
end] = function(e)
|
||||
return (e + 10)
|
||||
end,
|
||||
}
|
||||
|
||||
eq(-100, a.x(-10))
|
||||
@@ -94,33 +128,51 @@ describe('actions', function()
|
||||
eq(100, a.x(10))
|
||||
end)
|
||||
|
||||
it('continuous replacement', function()
|
||||
it("continuous replacement", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "cleared" end,
|
||||
y = function() return "y" end,
|
||||
x = function()
|
||||
return "cleared"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
-- Replace original, which becomes new fallback
|
||||
a.x:replace(function() return "negative" end)
|
||||
a.x:replace(function()
|
||||
return "negative"
|
||||
end)
|
||||
|
||||
-- actions.file_goto_selection_edit:replace(...)
|
||||
a.x:replace_map {
|
||||
[function(e) return e > 0 end] = function(e) return "positive" end,
|
||||
[function(e) return e == 0 end] = function(e) return "zero" end,
|
||||
[function(e)
|
||||
return e > 0
|
||||
end] = function(e)
|
||||
return "positive"
|
||||
end,
|
||||
[function(e)
|
||||
return e == 0
|
||||
end] = function(e)
|
||||
return "zero"
|
||||
end,
|
||||
}
|
||||
|
||||
eq("positive", a.x(10))
|
||||
eq("zero" , a.x(0))
|
||||
eq("zero", a.x(0))
|
||||
eq("negative", a.x(-10))
|
||||
|
||||
a._clear()
|
||||
eq("cleared", a.x(10))
|
||||
end)
|
||||
|
||||
it('enhance.pre', function()
|
||||
it("enhance.pre", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "x" end,
|
||||
y = function() return "y" end,
|
||||
x = function()
|
||||
return "x"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
local called_pre = false
|
||||
@@ -134,10 +186,14 @@ describe('actions', function()
|
||||
eq(true, called_pre)
|
||||
end)
|
||||
|
||||
it('enhance.post', function()
|
||||
it("enhance.post", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "x" end,
|
||||
y = function() return "y" end,
|
||||
x = function()
|
||||
return "x"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
local called_post = false
|
||||
@@ -151,10 +207,14 @@ describe('actions', function()
|
||||
eq(true, called_post)
|
||||
end)
|
||||
|
||||
it('can call both', function()
|
||||
it("can call both", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "x" end,
|
||||
y = function() return "y" end,
|
||||
x = function()
|
||||
return "x"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
local called_count = 0
|
||||
@@ -171,10 +231,14 @@ describe('actions', function()
|
||||
eq(2, called_count)
|
||||
end)
|
||||
|
||||
it('can call both even when combined', function()
|
||||
it("can call both even when combined", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "x" end,
|
||||
y = function() return "y" end,
|
||||
x = function()
|
||||
return "x"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
local called_count = 0
|
||||
@@ -188,7 +252,7 @@ describe('actions', function()
|
||||
}
|
||||
|
||||
a.x:enhance {
|
||||
post = count_inc
|
||||
post = count_inc,
|
||||
}
|
||||
|
||||
local x_plus_y = a.x + a.y
|
||||
@@ -197,10 +261,14 @@ describe('actions', function()
|
||||
eq(3, called_count)
|
||||
end)
|
||||
|
||||
it('clears enhance', function()
|
||||
it("clears enhance", function()
|
||||
local a = transform_mod {
|
||||
x = function() return "x" end,
|
||||
y = function() return "y" end,
|
||||
x = function()
|
||||
return "x"
|
||||
end,
|
||||
y = function()
|
||||
return "y"
|
||||
end,
|
||||
}
|
||||
|
||||
local called_post = false
|
||||
@@ -217,31 +285,41 @@ describe('actions', function()
|
||||
eq(false, called_post)
|
||||
end)
|
||||
|
||||
it('handles passing arguments', function()
|
||||
it("handles passing arguments", function()
|
||||
local a = transform_mod {
|
||||
x = function(bufnr) return string.format("bufnr: %s") end,
|
||||
x = function(bufnr)
|
||||
return string.format "bufnr: %s"
|
||||
end,
|
||||
}
|
||||
|
||||
a.x:replace(function(bufnr) return string.format("modified: %s", bufnr) end)
|
||||
a.x:replace(function(bufnr)
|
||||
return string.format("modified: %s", bufnr)
|
||||
end)
|
||||
eq("modified: 5", a.x(5))
|
||||
end)
|
||||
|
||||
describe('action_set', function()
|
||||
it('can replace `action_set.edit`', function()
|
||||
action_set.edit:replace(function(_, arg) return "replaced:" .. arg end)
|
||||
describe("action_set", function()
|
||||
it("can replace `action_set.edit`", function()
|
||||
action_set.edit:replace(function(_, arg)
|
||||
return "replaced:" .. arg
|
||||
end)
|
||||
eq("replaced:edit", actions.file_edit())
|
||||
eq("replaced:vnew", actions.file_vsplit())
|
||||
end)
|
||||
|
||||
it('handles backwards compat with select and edit files', function()
|
||||
it("handles backwards compat with select and edit files", function()
|
||||
-- Reproduce steps:
|
||||
-- In config, we have { ["<CR>"] = actions.select, ... }
|
||||
-- In caller, we have actions._goto:replace(...)
|
||||
-- Person calls `select`, does not see update
|
||||
action_set.edit:replace(function(_, arg) return "default_to_edit:" .. arg end)
|
||||
action_set.edit:replace(function(_, arg)
|
||||
return "default_to_edit:" .. arg
|
||||
end)
|
||||
eq("default_to_edit:edit", actions.select_default())
|
||||
|
||||
action_set.select:replace(function(_, arg) return "override_with_select:" .. arg end)
|
||||
action_set.select:replace(function(_, arg)
|
||||
return "override_with_select:" .. arg
|
||||
end)
|
||||
eq("override_with_select:default", actions.select_default())
|
||||
|
||||
-- Sometimes you might want to change the default selection...
|
||||
|
||||
@@ -1,30 +1,32 @@
|
||||
local entry_display = require('telescope.pickers.entry_display')
|
||||
local entry_display = require "telescope.pickers.entry_display"
|
||||
|
||||
describe('truncate', function()
|
||||
for _, ambiwidth in ipairs{'single', 'double'} do
|
||||
for _, case in ipairs{
|
||||
{args = {'abcde', 6}, expected = {single = 'abcde', double = 'abcde'}},
|
||||
{args = {'abcde', 5}, expected = {single = 'abcde', double = 'abcde'}},
|
||||
{args = {'abcde', 4}, expected = {single = 'abc…', double = 'ab…'}},
|
||||
{args = {'アイウエオ', 11}, expected = {single = 'アイウエオ', double = 'アイウエオ'}},
|
||||
{args = {'アイウエオ', 10}, expected = {single = 'アイウエオ', double = 'アイウエオ'}},
|
||||
{args = {'アイウエオ', 9}, expected = {single = 'アイウエ…', double = 'アイウ…'}},
|
||||
{args = {'アイウエオ', 8}, expected = {single = 'アイウ…', double = 'アイウ…'}},
|
||||
{args = {'├─┤', 7}, expected = {single = '├─┤', double = '├─┤'}},
|
||||
{args = {'├─┤', 6}, expected = {single = '├─┤', double = '├─┤'}},
|
||||
{args = {'├─┤', 5}, expected = {single = '├─┤', double = '├…'}},
|
||||
{args = {'├─┤', 4}, expected = {single = '├─┤', double = '├…'}},
|
||||
{args = {'├─┤', 3}, expected = {single = '├─┤', double = '…'}},
|
||||
{args = {'├─┤', 2}, expected = {single = '├…', double = '…'}},
|
||||
describe("truncate", function()
|
||||
for _, ambiwidth in ipairs { "single", "double" } do
|
||||
for _, case in ipairs {
|
||||
{ args = { "abcde", 6 }, expected = { single = "abcde", double = "abcde" } },
|
||||
{ args = { "abcde", 5 }, expected = { single = "abcde", double = "abcde" } },
|
||||
{ args = { "abcde", 4 }, expected = { single = "abc…", double = "ab…" } },
|
||||
{ args = { "アイウエオ", 11 }, expected = { single = "アイウエオ", double = "アイウエオ" } },
|
||||
{ args = { "アイウエオ", 10 }, expected = { single = "アイウエオ", double = "アイウエオ" } },
|
||||
{ args = { "アイウエオ", 9 }, expected = { single = "アイウエ…", double = "アイウ…" } },
|
||||
{ args = { "アイウエオ", 8 }, expected = { single = "アイウ…", double = "アイウ…" } },
|
||||
{ args = { "├─┤", 7 }, expected = { single = "├─┤", double = "├─┤" } },
|
||||
{ args = { "├─┤", 6 }, expected = { single = "├─┤", double = "├─┤" } },
|
||||
{ args = { "├─┤", 5 }, expected = { single = "├─┤", double = "├…" } },
|
||||
{ args = { "├─┤", 4 }, expected = { single = "├─┤", double = "├…" } },
|
||||
{ args = { "├─┤", 3 }, expected = { single = "├─┤", double = "…" } },
|
||||
{ args = { "├─┤", 2 }, expected = { single = "├…", double = "…" } },
|
||||
} do
|
||||
local msg = ('can truncate: ambiwidth = %s, [%s, %d] -> %s'):format(ambiwidth, case.args[1], case.args[2], case.expected[ambiwidth])
|
||||
local msg = ("can truncate: ambiwidth = %s, [%s, %d] -> %s"):format(
|
||||
ambiwidth,
|
||||
case.args[1],
|
||||
case.args[2],
|
||||
case.expected[ambiwidth]
|
||||
)
|
||||
it(msg, function()
|
||||
local original = vim.o.ambiwidth
|
||||
vim.o.ambiwidth = ambiwidth
|
||||
assert.are.same(
|
||||
case.expected[ambiwidth],
|
||||
entry_display.truncate(case.args[1], case.args[2])
|
||||
)
|
||||
assert.are.same(case.expected[ambiwidth], entry_display.truncate(case.args[1], case.args[2]))
|
||||
vim.o.ambiwidth = original
|
||||
end)
|
||||
end
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
local EntryManager = require('telescope.entry_manager')
|
||||
local EntryManager = require "telescope.entry_manager"
|
||||
|
||||
local eq = assert.are.same
|
||||
|
||||
describe('process_result', function()
|
||||
it('works with one entry', function()
|
||||
describe("process_result", function()
|
||||
it("works with one entry", function()
|
||||
local manager = EntryManager:new(5, nil)
|
||||
|
||||
manager:add_entry(nil, 1, "hello")
|
||||
@@ -11,7 +11,7 @@ describe('process_result', function()
|
||||
eq(1, manager:get_score(1))
|
||||
end)
|
||||
|
||||
it('works with two entries', function()
|
||||
it("works with two entries", function()
|
||||
local manager = EntryManager:new(5, nil)
|
||||
|
||||
manager:add_entry(nil, 1, "hello")
|
||||
@@ -23,18 +23,22 @@ describe('process_result', function()
|
||||
eq("later", manager:get_entry(2))
|
||||
end)
|
||||
|
||||
it('calls functions when inserting', function()
|
||||
it("calls functions when inserting", function()
|
||||
local called_count = 0
|
||||
local manager = EntryManager:new(5, function() called_count = called_count + 1 end)
|
||||
local manager = EntryManager:new(5, function()
|
||||
called_count = called_count + 1
|
||||
end)
|
||||
|
||||
assert(called_count == 0)
|
||||
manager:add_entry(nil, 1, "hello")
|
||||
assert(called_count == 1)
|
||||
end)
|
||||
|
||||
it('calls functions when inserting twice', function()
|
||||
it("calls functions when inserting twice", function()
|
||||
local called_count = 0
|
||||
local manager = EntryManager:new(5, function() called_count = called_count + 1 end)
|
||||
local manager = EntryManager:new(5, function()
|
||||
called_count = called_count + 1
|
||||
end)
|
||||
|
||||
assert(called_count == 0)
|
||||
manager:add_entry(nil, 1, "hello")
|
||||
@@ -42,9 +46,11 @@ describe('process_result', function()
|
||||
assert(called_count == 2)
|
||||
end)
|
||||
|
||||
it('correctly sorts lower scores', function()
|
||||
it("correctly sorts lower scores", function()
|
||||
local called_count = 0
|
||||
local manager = EntryManager:new(5, function() called_count = called_count + 1 end)
|
||||
local manager = EntryManager:new(5, function()
|
||||
called_count = called_count + 1
|
||||
end)
|
||||
manager:add_entry(nil, 5, "worse result")
|
||||
manager:add_entry(nil, 2, "better result")
|
||||
|
||||
@@ -54,9 +60,11 @@ describe('process_result', function()
|
||||
eq(2, called_count)
|
||||
end)
|
||||
|
||||
it('respects max results', function()
|
||||
it("respects max results", function()
|
||||
local called_count = 0
|
||||
local manager = EntryManager:new(1, function() called_count = called_count + 1 end)
|
||||
local manager = EntryManager:new(1, function()
|
||||
called_count = called_count + 1
|
||||
end)
|
||||
manager:add_entry(nil, 2, "better result")
|
||||
manager:add_entry(nil, 5, "worse result")
|
||||
|
||||
@@ -64,24 +72,28 @@ describe('process_result', function()
|
||||
eq(1, called_count)
|
||||
end)
|
||||
|
||||
it('should allow simple entries', function()
|
||||
it("should allow simple entries", function()
|
||||
local manager = EntryManager:new(5)
|
||||
|
||||
local counts_executed = 0
|
||||
manager:add_entry(nil, 1, setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
local val = nil
|
||||
if k == "ordinal" then
|
||||
counts_executed = counts_executed + 1
|
||||
manager:add_entry(
|
||||
nil,
|
||||
1,
|
||||
setmetatable({}, {
|
||||
__index = function(t, k)
|
||||
local val = nil
|
||||
if k == "ordinal" then
|
||||
counts_executed = counts_executed + 1
|
||||
|
||||
-- This could be expensive, only call later
|
||||
val = "wow"
|
||||
end
|
||||
-- This could be expensive, only call later
|
||||
val = "wow"
|
||||
end
|
||||
|
||||
rawset(t, k, val)
|
||||
return val
|
||||
end,
|
||||
}))
|
||||
rawset(t, k, val)
|
||||
return val
|
||||
end,
|
||||
})
|
||||
)
|
||||
|
||||
eq("wow", manager:get_ordinal(1))
|
||||
eq("wow", manager:get_ordinal(1))
|
||||
@@ -90,7 +102,7 @@ describe('process_result', function()
|
||||
eq(1, counts_executed)
|
||||
end)
|
||||
|
||||
it('should not loop a bunch', function()
|
||||
it("should not loop a bunch", function()
|
||||
local info = {}
|
||||
local manager = EntryManager:new(5, nil, info)
|
||||
manager:add_entry(nil, 4, "better result")
|
||||
@@ -102,7 +114,7 @@ describe('process_result', function()
|
||||
eq(2, info.looped)
|
||||
end)
|
||||
|
||||
it('should not loop a bunch, part 2', function()
|
||||
it("should not loop a bunch, part 2", function()
|
||||
local info = {}
|
||||
local manager = EntryManager:new(5, nil, info)
|
||||
manager:add_entry(nil, 4, "better result")
|
||||
@@ -115,7 +127,7 @@ describe('process_result', function()
|
||||
eq(3, info.looped)
|
||||
end)
|
||||
|
||||
it('should update worst score in all append case', function()
|
||||
it("should update worst score in all append case", function()
|
||||
local manager = EntryManager:new(2, nil)
|
||||
manager:add_entry(nil, 2, "result 2")
|
||||
manager:add_entry(nil, 3, "result 3")
|
||||
@@ -124,9 +136,11 @@ describe('process_result', function()
|
||||
eq(3, manager.worst_acceptable_score)
|
||||
end)
|
||||
|
||||
it('should update worst score in all prepend case', function()
|
||||
it("should update worst score in all prepend case", function()
|
||||
local called_count = 0
|
||||
local manager = EntryManager:new(2, function() called_count = called_count + 1 end)
|
||||
local manager = EntryManager:new(2, function()
|
||||
called_count = called_count + 1
|
||||
end)
|
||||
manager:add_entry(nil, 5, "worse result")
|
||||
manager:add_entry(nil, 4, "less worse result")
|
||||
manager:add_entry(nil, 2, "better result")
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
-- local tester = require('telescope.pickers._test')
|
||||
local config = require('telescope.config')
|
||||
local resolve = require('telescope.config.resolve')
|
||||
local layout_strats = require('telescope.pickers.layout_strategies')
|
||||
local config = require "telescope.config"
|
||||
local resolve = require "telescope.config.resolve"
|
||||
local layout_strats = require "telescope.pickers.layout_strategies"
|
||||
|
||||
local validate_layout_config = layout_strats._validate_layout_config
|
||||
|
||||
local eq = assert.are.same
|
||||
|
||||
describe('layout_strategies', function()
|
||||
it('should have validator', function()
|
||||
describe("layout_strategies", function()
|
||||
it("should have validator", function()
|
||||
assert(validate_layout_config, "Has validator")
|
||||
end)
|
||||
|
||||
@@ -23,13 +23,19 @@ describe('layout_strategies', function()
|
||||
end)
|
||||
end
|
||||
|
||||
test_height('should handle numbers', 10, 10)
|
||||
test_height("should handle numbers", 10, 10)
|
||||
|
||||
test_height('should handle percentage: 100', 10, 0.1, { max_lines = 100 })
|
||||
test_height('should handle percentage: 110', 11, 0.1, { max_lines = 110 })
|
||||
test_height("should handle percentage: 100", 10, 0.1, { max_lines = 100 })
|
||||
test_height("should handle percentage: 110", 11, 0.1, { max_lines = 110 })
|
||||
|
||||
test_height('should call functions: simple', 5, function() return 5 end)
|
||||
test_height('should call functions: percentage', 15, function(_, _, lines) return 0.1 * lines end, { max_lines = 150 })
|
||||
test_height("should call functions: simple", 5, function()
|
||||
return 5
|
||||
end)
|
||||
test_height("should call functions: percentage", 15, function(_, _, lines)
|
||||
return 0.1 * lines
|
||||
end, {
|
||||
max_lines = 150,
|
||||
})
|
||||
|
||||
local test_defaults_key = function(should, key, strat, output, ours, theirs, override)
|
||||
ours = ours or {}
|
||||
@@ -38,65 +44,119 @@ describe('layout_strategies', function()
|
||||
|
||||
it(should, function()
|
||||
config.clear_defaults()
|
||||
config.set_defaults({layout_config=theirs}, {layout_config={ours,'description'}})
|
||||
config.set_defaults({ layout_config = theirs }, { layout_config = { ours, "description" } })
|
||||
local layout_config = validate_layout_config(strat, layout_strats._configurations[strat], override)
|
||||
eq(output, layout_config[key])
|
||||
end)
|
||||
end
|
||||
|
||||
test_defaults_key("should use ours if theirs and override don't give the key",
|
||||
'height','horizontal',50,
|
||||
{height=50}, {width=100}, {width=120}
|
||||
test_defaults_key(
|
||||
"should use ours if theirs and override don't give the key",
|
||||
"height",
|
||||
"horizontal",
|
||||
50,
|
||||
{ height = 50 },
|
||||
{ width = 100 },
|
||||
{ width = 120 }
|
||||
)
|
||||
|
||||
test_defaults_key("should use ours if theirs and override don't give the key for this strategy",
|
||||
'height','horizontal',50,
|
||||
{height=50}, {vertical={height=100}}, {vertical={height=120}}
|
||||
test_defaults_key(
|
||||
"should use ours if theirs and override don't give the key for this strategy",
|
||||
"height",
|
||||
"horizontal",
|
||||
50,
|
||||
{ height = 50 },
|
||||
{ vertical = { height = 100 } },
|
||||
{ vertical = { height = 120 } }
|
||||
)
|
||||
|
||||
test_defaults_key("should use theirs if override doesn't give the key",
|
||||
'height','horizontal',100,
|
||||
{height=50}, {height=100}, {width=120}
|
||||
test_defaults_key(
|
||||
"should use theirs if override doesn't give the key",
|
||||
"height",
|
||||
"horizontal",
|
||||
100,
|
||||
{ height = 50 },
|
||||
{ height = 100 },
|
||||
{ width = 120 }
|
||||
)
|
||||
|
||||
test_defaults_key("should use override if key given",
|
||||
'height','horizontal',120,
|
||||
{height=50}, {height=100}, {height=120}
|
||||
test_defaults_key(
|
||||
"should use override if key given",
|
||||
"height",
|
||||
"horizontal",
|
||||
120,
|
||||
{ height = 50 },
|
||||
{ height = 100 },
|
||||
{ height = 120 }
|
||||
)
|
||||
|
||||
test_defaults_key("should use override if key given for this strategy",
|
||||
'height','horizontal',120,
|
||||
{height=50}, {height=100}, {horizontal={height=120}}
|
||||
test_defaults_key(
|
||||
"should use override if key given for this strategy",
|
||||
"height",
|
||||
"horizontal",
|
||||
120,
|
||||
{ height = 50 },
|
||||
{ height = 100 },
|
||||
{ horizontal = { height = 120 } }
|
||||
)
|
||||
|
||||
test_defaults_key("should use theirs if override doesn't give key (even if ours has strategy specific)",
|
||||
'height','horizontal',100,
|
||||
{horizontal={height=50}}, {height=100}, {width=120}
|
||||
test_defaults_key(
|
||||
"should use theirs if override doesn't give key (even if ours has strategy specific)",
|
||||
"height",
|
||||
"horizontal",
|
||||
100,
|
||||
{ horizontal = { height = 50 } },
|
||||
{ height = 100 },
|
||||
{ width = 120 }
|
||||
)
|
||||
|
||||
test_defaults_key("should use override (even if ours has strategy specific)",
|
||||
'height','horizontal',120,
|
||||
{horizontal={height=50}}, {height=100}, {height=120}
|
||||
test_defaults_key(
|
||||
"should use override (even if ours has strategy specific)",
|
||||
"height",
|
||||
"horizontal",
|
||||
120,
|
||||
{ horizontal = { height = 50 } },
|
||||
{ height = 100 },
|
||||
{ height = 120 }
|
||||
)
|
||||
|
||||
test_defaults_key("should use override (even if theirs has strategy specific)",
|
||||
'height','horizontal',120,
|
||||
{height=50}, {horizontal={height=100}}, {height=120}
|
||||
test_defaults_key(
|
||||
"should use override (even if theirs has strategy specific)",
|
||||
"height",
|
||||
"horizontal",
|
||||
120,
|
||||
{ height = 50 },
|
||||
{ horizontal = { height = 100 } },
|
||||
{ height = 120 }
|
||||
)
|
||||
|
||||
test_defaults_key("should use override (even if ours and theirs have strategy specific)",
|
||||
'height','horizontal',120,
|
||||
{horizontal={height=50}}, {horizontal={height=100}}, {height=120}
|
||||
test_defaults_key(
|
||||
"should use override (even if ours and theirs have strategy specific)",
|
||||
"height",
|
||||
"horizontal",
|
||||
120,
|
||||
{ horizontal = { height = 50 } },
|
||||
{ horizontal = { height = 100 } },
|
||||
{ height = 120 }
|
||||
)
|
||||
|
||||
test_defaults_key("should handle user config overriding a table with a number",
|
||||
'height','horizontal',120,
|
||||
{height={padding=5}},{height=120},{}
|
||||
test_defaults_key(
|
||||
"should handle user config overriding a table with a number",
|
||||
"height",
|
||||
"horizontal",
|
||||
120,
|
||||
{ height = { padding = 5 } },
|
||||
{ height = 120 },
|
||||
{}
|
||||
)
|
||||
|
||||
test_defaults_key("should handle user oneshot overriding a table with a number",
|
||||
'height','horizontal',120,
|
||||
{},{height={padding=5}},{height=120}
|
||||
test_defaults_key(
|
||||
"should handle user oneshot overriding a table with a number",
|
||||
"height",
|
||||
"horizontal",
|
||||
120,
|
||||
{},
|
||||
{ height = { padding = 5 } },
|
||||
{ height = 120 }
|
||||
)
|
||||
|
||||
end)
|
||||
|
||||
@@ -1,131 +1,131 @@
|
||||
local LinkedList = require('telescope.algos.linked_list')
|
||||
local LinkedList = require "telescope.algos.linked_list"
|
||||
|
||||
describe('LinkedList', function()
|
||||
it('can create a list', function()
|
||||
describe("LinkedList", function()
|
||||
it("can create a list", function()
|
||||
local l = LinkedList:new()
|
||||
|
||||
assert.are.same(0, l.size)
|
||||
end)
|
||||
|
||||
it('can add a single entry to the list', function()
|
||||
it("can add a single entry to the list", function()
|
||||
local l = LinkedList:new()
|
||||
l:append('hello')
|
||||
l:append "hello"
|
||||
|
||||
assert.are.same(1, l.size)
|
||||
end)
|
||||
|
||||
it('can iterate over one item', function()
|
||||
it("can iterate over one item", function()
|
||||
local l = LinkedList:new()
|
||||
l:append('hello')
|
||||
l:append "hello"
|
||||
|
||||
for val in l:iter() do
|
||||
assert.are.same('hello', val)
|
||||
assert.are.same("hello", val)
|
||||
end
|
||||
end)
|
||||
|
||||
it('iterates in order', function()
|
||||
it("iterates in order", function()
|
||||
local l = LinkedList:new()
|
||||
l:append('hello')
|
||||
l:append('world')
|
||||
l:append "hello"
|
||||
l:append "world"
|
||||
|
||||
local x = {}
|
||||
for val in l:iter() do
|
||||
table.insert(x, val)
|
||||
end
|
||||
|
||||
assert.are.same({'hello', 'world'}, x)
|
||||
assert.are.same({ "hello", "world" }, x)
|
||||
end)
|
||||
|
||||
it('iterates in order, for prepend', function()
|
||||
it("iterates in order, for prepend", function()
|
||||
local l = LinkedList:new()
|
||||
l:prepend('world')
|
||||
l:prepend('hello')
|
||||
l:prepend "world"
|
||||
l:prepend "hello"
|
||||
|
||||
local x = {}
|
||||
for val in l:iter() do
|
||||
table.insert(x, val)
|
||||
end
|
||||
|
||||
assert.are.same({'hello', 'world'}, x)
|
||||
assert.are.same({ "hello", "world" }, x)
|
||||
end)
|
||||
|
||||
it('iterates in order, for combo', function()
|
||||
it("iterates in order, for combo", function()
|
||||
local l = LinkedList:new()
|
||||
l:prepend('world')
|
||||
l:prepend('hello')
|
||||
l:append('last')
|
||||
l:prepend('first')
|
||||
l:prepend "world"
|
||||
l:prepend "hello"
|
||||
l:append "last"
|
||||
l:prepend "first"
|
||||
|
||||
local x = {}
|
||||
for val in l:iter() do
|
||||
table.insert(x, val)
|
||||
end
|
||||
|
||||
assert.are.same({'first', 'hello', 'world', 'last'}, x)
|
||||
assert.are.same({ "first", "hello", "world", "last" }, x)
|
||||
assert.are.same(#x, l.size)
|
||||
end)
|
||||
|
||||
it('has ipairs', function()
|
||||
it("has ipairs", function()
|
||||
local l = LinkedList:new()
|
||||
l:prepend('world')
|
||||
l:prepend('hello')
|
||||
l:append('last')
|
||||
l:prepend('first')
|
||||
l:prepend "world"
|
||||
l:prepend "hello"
|
||||
l:append "last"
|
||||
l:prepend "first"
|
||||
|
||||
local x = {}
|
||||
for v in l:iter() do
|
||||
table.insert(x, v)
|
||||
end
|
||||
assert.are.same({'first', 'hello', 'world', 'last'}, x)
|
||||
assert.are.same({ "first", "hello", "world", "last" }, x)
|
||||
|
||||
local expected = {}
|
||||
for i, v in ipairs(x) do
|
||||
table.insert(expected, {i, v})
|
||||
table.insert(expected, { i, v })
|
||||
end
|
||||
|
||||
local actual = {}
|
||||
for i, v in l:ipairs() do
|
||||
table.insert(actual, {i, v})
|
||||
table.insert(actual, { i, v })
|
||||
end
|
||||
|
||||
assert.are.same(expected, actual)
|
||||
end)
|
||||
|
||||
describe('track_at', function()
|
||||
it('should update tracked when only appending', function()
|
||||
describe("track_at", function()
|
||||
it("should update tracked when only appending", function()
|
||||
local l = LinkedList:new { track_at = 2 }
|
||||
l:append("first")
|
||||
l:append("second")
|
||||
l:append("third")
|
||||
l:append "first"
|
||||
l:append "second"
|
||||
l:append "third"
|
||||
|
||||
assert.are.same("second", l.tracked)
|
||||
end)
|
||||
|
||||
it('should update tracked when first some prepend and then append', function()
|
||||
it("should update tracked when first some prepend and then append", function()
|
||||
local l = LinkedList:new { track_at = 2 }
|
||||
l:prepend("first")
|
||||
l:append("second")
|
||||
l:append("third")
|
||||
l:prepend "first"
|
||||
l:append "second"
|
||||
l:append "third"
|
||||
|
||||
assert.are.same("second", l.tracked)
|
||||
end)
|
||||
|
||||
it('should update when only prepending', function()
|
||||
it("should update when only prepending", function()
|
||||
local l = LinkedList:new { track_at = 2 }
|
||||
l:prepend("third")
|
||||
l:prepend("second")
|
||||
l:prepend("first")
|
||||
l:prepend "third"
|
||||
l:prepend "second"
|
||||
l:prepend "first"
|
||||
|
||||
assert.are.same("second", l.tracked)
|
||||
end)
|
||||
|
||||
it('should update when lots of prepend and append', function()
|
||||
it("should update when lots of prepend and append", function()
|
||||
local l = LinkedList:new { track_at = 2 }
|
||||
l:prepend("third")
|
||||
l:prepend("second")
|
||||
l:prepend("first")
|
||||
l:append("fourth")
|
||||
l:prepend("zeroth")
|
||||
l:prepend "third"
|
||||
l:prepend "second"
|
||||
l:prepend "first"
|
||||
l:append "fourth"
|
||||
l:prepend "zeroth"
|
||||
|
||||
assert.are.same("first", l.tracked)
|
||||
end)
|
||||
|
||||
@@ -1,26 +1,27 @@
|
||||
require('plenary.reload').reload_module('telescope')
|
||||
require("plenary.reload").reload_module "telescope"
|
||||
|
||||
local tester = require('telescope.pickers._test')
|
||||
local tester = require "telescope.pickers._test"
|
||||
|
||||
local disp = function(val)
|
||||
return vim.inspect(val, { newline = " ", indent = "" })
|
||||
end
|
||||
|
||||
describe('builtin.find_files', function()
|
||||
it('should find the readme', function()
|
||||
tester.run_file('find_files__readme')
|
||||
describe("builtin.find_files", function()
|
||||
it("should find the readme", function()
|
||||
tester.run_file "find_files__readme"
|
||||
end)
|
||||
|
||||
it('should be able to move selections', function()
|
||||
tester.run_file('find_files__with_ctrl_n')
|
||||
it("should be able to move selections", function()
|
||||
tester.run_file "find_files__with_ctrl_n"
|
||||
end)
|
||||
|
||||
for _, configuration in ipairs {
|
||||
{ sorting_strategy = 'descending', },
|
||||
{ sorting_strategy = 'ascending', },
|
||||
{ sorting_strategy = "descending" },
|
||||
{ sorting_strategy = "ascending" },
|
||||
} do
|
||||
it('should not display devicons when disabled: ' .. disp(configuration), function()
|
||||
tester.run_string(string.format([[
|
||||
it("should not display devicons when disabled: " .. disp(configuration), function()
|
||||
tester.run_string(string.format(
|
||||
[[
|
||||
local max_results = 5
|
||||
|
||||
tester.builtin_picker('find_files', 'README.md', {
|
||||
@@ -41,18 +42,21 @@ describe('builtin.find_files', function()
|
||||
width = 0.9,
|
||||
},
|
||||
}, vim.fn.json_decode([==[%s]==])))
|
||||
]], vim.fn.json_encode(configuration)))
|
||||
]],
|
||||
vim.fn.json_encode(configuration)
|
||||
))
|
||||
end)
|
||||
|
||||
it('should only save one line for ascending, but many for descending', function()
|
||||
it("should only save one line for ascending, but many for descending", function()
|
||||
local expected
|
||||
if configuration.sorting_strategy == 'descending' then
|
||||
if configuration.sorting_strategy == "descending" then
|
||||
expected = 5
|
||||
else
|
||||
expected = 1
|
||||
end
|
||||
|
||||
tester.run_string(string.format([[
|
||||
tester.run_string(string.format(
|
||||
[[
|
||||
tester.builtin_picker('find_files', 'README.md', {
|
||||
post_typed = {
|
||||
{ %s, function() return #GetResults() end },
|
||||
@@ -66,15 +70,19 @@ describe('builtin.find_files', function()
|
||||
width = 0.9,
|
||||
},
|
||||
}, vim.fn.json_decode([==[%s]==])))
|
||||
]], expected, vim.fn.json_encode(configuration)))
|
||||
]],
|
||||
expected,
|
||||
vim.fn.json_encode(configuration)
|
||||
))
|
||||
end)
|
||||
|
||||
it('use devicons, if it has it when enabled', function()
|
||||
if not pcall(require, 'nvim-web-devicons') then
|
||||
it("use devicons, if it has it when enabled", function()
|
||||
if not pcall(require, "nvim-web-devicons") then
|
||||
return
|
||||
end
|
||||
|
||||
tester.run_string(string.format([[
|
||||
tester.run_string(string.format(
|
||||
[[
|
||||
tester.builtin_picker('find_files', 'README.md', {
|
||||
post_typed = {
|
||||
{ "> README.md", GetPrompt },
|
||||
@@ -88,11 +96,13 @@ describe('builtin.find_files', function()
|
||||
disable_devicons = false,
|
||||
sorter = require('telescope.sorters').get_fzy_sorter(),
|
||||
}, vim.fn.json_decode([==[%s]==])))
|
||||
]], vim.fn.json_encode(configuration)))
|
||||
]],
|
||||
vim.fn.json_encode(configuration)
|
||||
))
|
||||
end)
|
||||
end
|
||||
|
||||
it('should find the readme, using lowercase', function()
|
||||
it("should find the readme, using lowercase", function()
|
||||
tester.run_string [[
|
||||
tester.builtin_picker('find_files', 'readme.md', {
|
||||
post_close = {
|
||||
@@ -102,7 +112,7 @@ describe('builtin.find_files', function()
|
||||
]]
|
||||
end)
|
||||
|
||||
it('should find the pickers.lua, using lowercase', function()
|
||||
it("should find the pickers.lua, using lowercase", function()
|
||||
tester.run_string [[
|
||||
tester.builtin_picker('find_files', 'pickers.lua', {
|
||||
post_close = {
|
||||
@@ -112,7 +122,7 @@ describe('builtin.find_files', function()
|
||||
]]
|
||||
end)
|
||||
|
||||
it('should find the pickers.lua', function()
|
||||
it("should find the pickers.lua", function()
|
||||
tester.run_string [[
|
||||
tester.builtin_picker('find_files', 'pickers.lua', {
|
||||
post_close = {
|
||||
@@ -123,7 +133,7 @@ describe('builtin.find_files', function()
|
||||
]]
|
||||
end)
|
||||
|
||||
it('should be able to c-n the items', function()
|
||||
it("should be able to c-n the items", function()
|
||||
tester.run_string [[
|
||||
tester.builtin_picker('find_files', 'fixtures/file<c-p>', {
|
||||
post_typed = {
|
||||
@@ -151,7 +161,7 @@ describe('builtin.find_files', function()
|
||||
]]
|
||||
end)
|
||||
|
||||
it('should be able to get the current selection', function()
|
||||
it("should be able to get the current selection", function()
|
||||
tester.run_string [[
|
||||
tester.builtin_picker('find_files', 'fixtures/file_abc', {
|
||||
post_typed = {
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
require('plenary.reload').reload_module('telescope')
|
||||
require("plenary.reload").reload_module "telescope"
|
||||
|
||||
local tester = require('telescope.pickers._test')
|
||||
local tester = require "telescope.pickers._test"
|
||||
|
||||
local log = require('telescope.log')
|
||||
local log = require "telescope.log"
|
||||
log.use_console = false
|
||||
|
||||
describe('scrolling strategies', function()
|
||||
it('should handle cycling for full list', function()
|
||||
describe("scrolling strategies", function()
|
||||
it("should handle cycling for full list", function()
|
||||
tester.run_file [[find_files__scrolling_descending_cycle]]
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -2,12 +2,11 @@ local eq = function(a, b)
|
||||
assert.are.same(a, b)
|
||||
end
|
||||
|
||||
local resolve = require('telescope.config.resolve')
|
||||
local resolve = require "telescope.config.resolve"
|
||||
|
||||
|
||||
describe('telescope.config.resolve', function()
|
||||
describe('win_option', function()
|
||||
it('should resolve for percentages', function()
|
||||
describe("telescope.config.resolve", function()
|
||||
describe("win_option", function()
|
||||
it("should resolve for percentages", function()
|
||||
local height_config = 0.8
|
||||
local opt = resolve.win_option(height_config)
|
||||
|
||||
@@ -16,7 +15,7 @@ describe('telescope.config.resolve', function()
|
||||
eq(height_config, opt.results)
|
||||
end)
|
||||
|
||||
it('should resolve for percetnages with default', function()
|
||||
it("should resolve for percetnages with default", function()
|
||||
local height_config = 0.8
|
||||
local opt = resolve.win_option(nil, height_config)
|
||||
|
||||
@@ -25,8 +24,8 @@ describe('telescope.config.resolve', function()
|
||||
eq(height_config, opt.results)
|
||||
end)
|
||||
|
||||
it('should resolve table values', function()
|
||||
local table_val = {'a'}
|
||||
it("should resolve table values", function()
|
||||
local table_val = { "a" }
|
||||
local opt = resolve.win_option(nil, table_val)
|
||||
|
||||
eq(table_val, opt.preview)
|
||||
@@ -34,32 +33,32 @@ describe('telescope.config.resolve', function()
|
||||
eq(table_val, opt.results)
|
||||
end)
|
||||
|
||||
it('should allow overrides for different wins', function()
|
||||
local prompt_override = {'a', prompt = 'b'}
|
||||
it("should allow overrides for different wins", function()
|
||||
local prompt_override = { "a", prompt = "b" }
|
||||
local opt = resolve.win_option(prompt_override)
|
||||
eq('a', opt.preview)
|
||||
eq('a', opt.results)
|
||||
eq('b', opt.prompt)
|
||||
eq("a", opt.preview)
|
||||
eq("a", opt.results)
|
||||
eq("b", opt.prompt)
|
||||
end)
|
||||
|
||||
it('should allow overrides for all wins', function()
|
||||
local all_specified = {preview = 'a', prompt = 'b', results = 'c'}
|
||||
it("should allow overrides for all wins", function()
|
||||
local all_specified = { preview = "a", prompt = "b", results = "c" }
|
||||
local opt = resolve.win_option(all_specified)
|
||||
eq('a', opt.preview)
|
||||
eq('b', opt.prompt)
|
||||
eq('c', opt.results)
|
||||
eq("a", opt.preview)
|
||||
eq("b", opt.prompt)
|
||||
eq("c", opt.results)
|
||||
end)
|
||||
|
||||
it('should allow some specified with a simple default', function()
|
||||
local some_specified = {prompt = 'b', results = 'c'}
|
||||
local opt = resolve.win_option(some_specified, 'a')
|
||||
eq('a', opt.preview)
|
||||
eq('b', opt.prompt)
|
||||
eq('c', opt.results)
|
||||
it("should allow some specified with a simple default", function()
|
||||
local some_specified = { prompt = "b", results = "c" }
|
||||
local opt = resolve.win_option(some_specified, "a")
|
||||
eq("a", opt.preview)
|
||||
eq("b", opt.prompt)
|
||||
eq("c", opt.results)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('resolve_height/width', function()
|
||||
describe("resolve_height/width", function()
|
||||
eq(10, resolve.resolve_height(0.1)(nil, 24, 100))
|
||||
eq(2, resolve.resolve_width(0.1)(nil, 24, 100))
|
||||
|
||||
|
||||
@@ -1,144 +1,143 @@
|
||||
local p_scroller = require('telescope.pickers.scroller')
|
||||
local p_scroller = require "telescope.pickers.scroller"
|
||||
|
||||
local log = require('telescope.log')
|
||||
local log = require "telescope.log"
|
||||
log.use_console = false
|
||||
|
||||
local eq = assert.are.same
|
||||
|
||||
describe('scroller', function()
|
||||
describe("scroller", function()
|
||||
local max_results = 10
|
||||
|
||||
describe('ascending cycle', function()
|
||||
local cycle_scroller = p_scroller.create('cycle', 'ascending')
|
||||
describe("ascending cycle", function()
|
||||
local cycle_scroller = p_scroller.create("cycle", "ascending")
|
||||
|
||||
it('should return values within the max results', function()
|
||||
it("should return values within the max results", function()
|
||||
eq(5, cycle_scroller(max_results, max_results, 5))
|
||||
end)
|
||||
|
||||
it('should return 0 at 0', function()
|
||||
it("should return 0 at 0", function()
|
||||
eq(0, cycle_scroller(max_results, max_results, 0))
|
||||
end)
|
||||
|
||||
it('should cycle you to the top when you go below 0', function()
|
||||
it("should cycle you to the top when you go below 0", function()
|
||||
eq(max_results - 1, cycle_scroller(max_results, max_results, -1))
|
||||
end)
|
||||
|
||||
it('should cycle you to 0 when you go past the results', function()
|
||||
it("should cycle you to 0 when you go past the results", function()
|
||||
eq(0, cycle_scroller(max_results, max_results, max_results + 1))
|
||||
end)
|
||||
|
||||
it('should cycle when current results is less than max_results', function()
|
||||
it("should cycle when current results is less than max_results", function()
|
||||
eq(0, cycle_scroller(max_results, 5, 7))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('ascending limit', function()
|
||||
local limit_scroller = p_scroller.create('limit', 'ascending')
|
||||
describe("ascending limit", function()
|
||||
local limit_scroller = p_scroller.create("limit", "ascending")
|
||||
|
||||
it('should return values within the max results', function()
|
||||
it("should return values within the max results", function()
|
||||
eq(5, limit_scroller(max_results, max_results, 5))
|
||||
end)
|
||||
|
||||
it('should return 0 at 0', function()
|
||||
it("should return 0 at 0", function()
|
||||
eq(0, limit_scroller(max_results, max_results, 0))
|
||||
end)
|
||||
|
||||
it('should not cycle', function()
|
||||
it("should not cycle", function()
|
||||
eq(0, limit_scroller(max_results, max_results, -1))
|
||||
end)
|
||||
|
||||
it('should not cycle you to 0 when you go past the results', function()
|
||||
it("should not cycle you to 0 when you go past the results", function()
|
||||
eq(max_results - 1, limit_scroller(max_results, max_results, max_results + 1))
|
||||
end)
|
||||
|
||||
it('should stay at current results when current results is less than max_results', function()
|
||||
it("should stay at current results when current results is less than max_results", function()
|
||||
local current = 5
|
||||
eq(current - 1, limit_scroller(max_results, current, 7))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('descending cycle', function()
|
||||
local cycle_scroller = p_scroller.create('cycle', 'descending')
|
||||
describe("descending cycle", function()
|
||||
local cycle_scroller = p_scroller.create("cycle", "descending")
|
||||
|
||||
it('should return values within the max results', function()
|
||||
it("should return values within the max results", function()
|
||||
eq(5, cycle_scroller(max_results, max_results, 5))
|
||||
end)
|
||||
|
||||
it('should return max_results - 1 at 0', function()
|
||||
it("should return max_results - 1 at 0", function()
|
||||
eq(0, cycle_scroller(max_results, max_results, 0))
|
||||
end)
|
||||
|
||||
it('should cycle you to the bot when you go below 0', function()
|
||||
it("should cycle you to the bot when you go below 0", function()
|
||||
eq(max_results - 1, cycle_scroller(max_results, max_results, -1))
|
||||
end)
|
||||
|
||||
it('should cycle you to 0 when you go past the results', function()
|
||||
it("should cycle you to 0 when you go past the results", function()
|
||||
eq(0, cycle_scroller(max_results, max_results, max_results + 1))
|
||||
end)
|
||||
|
||||
it('should cycle when current results is less than max_results', function()
|
||||
it("should cycle when current results is less than max_results", function()
|
||||
eq(9, cycle_scroller(max_results, 5, 4))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('descending limit', function()
|
||||
local limit_scroller = p_scroller.create('limit', 'descending')
|
||||
describe("descending limit", function()
|
||||
local limit_scroller = p_scroller.create("limit", "descending")
|
||||
|
||||
it('should return values within the max results', function()
|
||||
it("should return values within the max results", function()
|
||||
eq(5, limit_scroller(max_results, max_results, 5))
|
||||
end)
|
||||
|
||||
it('should return 0 at 0', function()
|
||||
it("should return 0 at 0", function()
|
||||
eq(0, limit_scroller(max_results, max_results, 0))
|
||||
end)
|
||||
|
||||
it('should not cycle', function()
|
||||
it("should not cycle", function()
|
||||
eq(0, limit_scroller(max_results, max_results, -1))
|
||||
end)
|
||||
|
||||
it('should not cycle you to 0 when you go past the results', function()
|
||||
it("should not cycle you to 0 when you go past the results", function()
|
||||
eq(max_results - 1, limit_scroller(max_results, max_results, max_results + 1))
|
||||
end)
|
||||
|
||||
it('should stay at current results when current results is less than max_results', function()
|
||||
it("should stay at current results when current results is less than max_results", function()
|
||||
local current = 5
|
||||
eq(max_results - current, limit_scroller(max_results, current, 4))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('https://github.com/nvim-telescope/telescope.nvim/pull/293#issuecomment-751463224', function()
|
||||
it('should handle having many more results than necessary', function()
|
||||
local scroller = p_scroller.create('cycle', 'descending')
|
||||
describe("https://github.com/nvim-telescope/telescope.nvim/pull/293#issuecomment-751463224", function()
|
||||
it("should handle having many more results than necessary", function()
|
||||
local scroller = p_scroller.create("cycle", "descending")
|
||||
|
||||
-- 23 112 23
|
||||
eq(0, scroller(23, 112, 23))
|
||||
end)
|
||||
end)
|
||||
|
||||
describe("should give top, middle and bottom index", function()
|
||||
it("should handle ascending", function()
|
||||
eq(0, p_scroller.top("ascending", 20, 1000))
|
||||
eq(19, p_scroller.bottom("ascending", 20, 1000))
|
||||
|
||||
describe('should give top, middle and bottom index', function()
|
||||
it('should handle ascending', function()
|
||||
eq(0, p_scroller.top('ascending', 20, 1000))
|
||||
eq(19, p_scroller.bottom('ascending', 20, 1000))
|
||||
eq(0, p_scroller.top("ascending", 20, 10))
|
||||
eq(9, p_scroller.bottom("ascending", 20, 10))
|
||||
|
||||
eq(0, p_scroller.top('ascending', 20, 10))
|
||||
eq(9, p_scroller.bottom('ascending', 20, 10))
|
||||
|
||||
eq(5, p_scroller.middle('ascending', 11, 100))
|
||||
eq(10, p_scroller.middle('ascending', 20, 100))
|
||||
eq(12, p_scroller.middle('ascending', 25, 100))
|
||||
eq(5, p_scroller.middle("ascending", 11, 100))
|
||||
eq(10, p_scroller.middle("ascending", 20, 100))
|
||||
eq(12, p_scroller.middle("ascending", 25, 100))
|
||||
end)
|
||||
|
||||
it('should handle descending', function()
|
||||
eq(0, p_scroller.top('descending', 20, 1000))
|
||||
eq(19, p_scroller.bottom('descending', 20, 1000))
|
||||
it("should handle descending", function()
|
||||
eq(0, p_scroller.top("descending", 20, 1000))
|
||||
eq(19, p_scroller.bottom("descending", 20, 1000))
|
||||
|
||||
eq(10, p_scroller.top('descending', 20, 10))
|
||||
eq(19, p_scroller.bottom('descending', 20, 10))
|
||||
eq(10, p_scroller.top("descending", 20, 10))
|
||||
eq(19, p_scroller.bottom("descending", 20, 10))
|
||||
|
||||
eq(25, p_scroller.middle('descending', 30, 10))
|
||||
eq(50, p_scroller.middle('descending', 60, 20))
|
||||
eq(105, p_scroller.middle('descending', 120, 30))
|
||||
eq(25, p_scroller.middle("descending", 30, 10))
|
||||
eq(50, p_scroller.middle("descending", 60, 20))
|
||||
eq(105, p_scroller.middle("descending", 120, 30))
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
||||
@@ -1,111 +1,108 @@
|
||||
local picker = require('telescope.pickers')
|
||||
local picker = require "telescope.pickers"
|
||||
|
||||
local eq = assert.are.same
|
||||
|
||||
describe('telescope', function()
|
||||
describe('Picker', function()
|
||||
describe('window_dimensions', function()
|
||||
it('', function()
|
||||
describe("telescope", function()
|
||||
describe("Picker", function()
|
||||
describe("window_dimensions", function()
|
||||
it("", function()
|
||||
assert(true)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('attach_mappings', function()
|
||||
it('should allow for passing in a function', function()
|
||||
local p = picker.new({}, { attach_mappings = function() return 1 end })
|
||||
describe("attach_mappings", function()
|
||||
it("should allow for passing in a function", function()
|
||||
local p = picker.new({}, {
|
||||
attach_mappings = function()
|
||||
return 1
|
||||
end,
|
||||
})
|
||||
eq(1, p.attach_mappings())
|
||||
end)
|
||||
|
||||
it('should override an attach mappings passed in by opts', function()
|
||||
it("should override an attach mappings passed in by opts", function()
|
||||
local called_order = {}
|
||||
local p = picker.new({
|
||||
attach_mappings = function()
|
||||
table.insert(called_order, 'opts')
|
||||
table.insert(called_order, "opts")
|
||||
end,
|
||||
}, {
|
||||
attach_mappings = function()
|
||||
table.insert(called_order, 'default')
|
||||
end
|
||||
table.insert(called_order, "default")
|
||||
end,
|
||||
})
|
||||
|
||||
p.attach_mappings()
|
||||
|
||||
eq({'default', 'opts'}, called_order)
|
||||
eq({ "default", "opts" }, called_order)
|
||||
end)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('Sorters', function()
|
||||
describe('generic_fuzzy_sorter', function()
|
||||
it('sort matches well', function()
|
||||
local sorter = require('telescope.sorters').get_generic_fuzzy_sorter()
|
||||
describe("Sorters", function()
|
||||
describe("generic_fuzzy_sorter", function()
|
||||
it("sort matches well", function()
|
||||
local sorter = require("telescope.sorters").get_generic_fuzzy_sorter()
|
||||
|
||||
local exact_match = sorter:score('hello', {ordinal = 'hello'})
|
||||
local no_match = sorter:score('abcdef', {ordinal = 'ghijkl'})
|
||||
local ok_match = sorter:score('abcdef', {ordinal = 'ab'})
|
||||
local exact_match = sorter:score("hello", { ordinal = "hello" })
|
||||
local no_match = sorter:score("abcdef", { ordinal = "ghijkl" })
|
||||
local ok_match = sorter:score("abcdef", { ordinal = "ab" })
|
||||
|
||||
assert(exact_match < no_match, "exact match better than no match")
|
||||
assert(exact_match < ok_match, "exact match better than ok match")
|
||||
assert(ok_match < no_match, "ok match better than no match")
|
||||
end)
|
||||
|
||||
it('sorts multiple finds better', function()
|
||||
local sorter = require('telescope.sorters').get_generic_fuzzy_sorter()
|
||||
it("sorts multiple finds better", function()
|
||||
local sorter = require("telescope.sorters").get_generic_fuzzy_sorter()
|
||||
|
||||
local multi_match = sorter:score('generics', 'exercises/generics/generics2.rs')
|
||||
local one_match = sorter:score('abcdef', 'exercises/generics/README.md')
|
||||
local multi_match = sorter:score("generics", "exercises/generics/generics2.rs")
|
||||
local one_match = sorter:score("abcdef", "exercises/generics/README.md")
|
||||
|
||||
-- assert(multi_match < one_match)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('fuzzy_file', function()
|
||||
it('sort matches well', function()
|
||||
local sorter = require('telescope.sorters').get_fuzzy_file()
|
||||
describe("fuzzy_file", function()
|
||||
it("sort matches well", function()
|
||||
local sorter = require("telescope.sorters").get_fuzzy_file()
|
||||
|
||||
local exact_match = sorter:score('abcdef', {ordinal = 'abcdef'})
|
||||
local no_match = sorter:score('abcdef', {ordinal = 'ghijkl'})
|
||||
local ok_match = sorter:score('abcdef', {ordinal = 'ab'})
|
||||
local exact_match = sorter:score("abcdef", { ordinal = "abcdef" })
|
||||
local no_match = sorter:score("abcdef", { ordinal = "ghijkl" })
|
||||
local ok_match = sorter:score("abcdef", { ordinal = "ab" })
|
||||
|
||||
assert(
|
||||
exact_match < no_match,
|
||||
string.format("Exact match better than no match: %s %s", exact_match, no_match)
|
||||
)
|
||||
assert(
|
||||
exact_match < ok_match,
|
||||
string.format("Exact match better than OK match: %s %s", exact_match, ok_match)
|
||||
)
|
||||
assert(exact_match < no_match, string.format("Exact match better than no match: %s %s", exact_match, no_match))
|
||||
assert(exact_match < ok_match, string.format("Exact match better than OK match: %s %s", exact_match, ok_match))
|
||||
assert(ok_match < no_match, "OK match better than no match")
|
||||
end)
|
||||
|
||||
it('sorts matches after last os sep better', function()
|
||||
local sorter = require('telescope.sorters').get_fuzzy_file()
|
||||
it("sorts matches after last os sep better", function()
|
||||
local sorter = require("telescope.sorters").get_fuzzy_file()
|
||||
|
||||
local better_match = sorter:score('aaa', {ordinal = 'bbb/aaa'})
|
||||
local worse_match = sorter:score('aaa', {ordinal = 'aaa/bbb'})
|
||||
local better_match = sorter:score("aaa", { ordinal = "bbb/aaa" })
|
||||
local worse_match = sorter:score("aaa", { ordinal = "aaa/bbb" })
|
||||
|
||||
assert(better_match < worse_match, "Final match should be stronger")
|
||||
end)
|
||||
|
||||
pending('sorts multiple finds better', function()
|
||||
local sorter = require('telescope.sorters').get_fuzzy_file()
|
||||
pending("sorts multiple finds better", function()
|
||||
local sorter = require("telescope.sorters").get_fuzzy_file()
|
||||
|
||||
local multi_match = sorter:score('generics', {ordinal = 'exercises/generics/generics2.rs'})
|
||||
local one_match = sorter:score('abcdef', {ordinal = 'exercises/generics/README.md'})
|
||||
local multi_match = sorter:score("generics", { ordinal = "exercises/generics/generics2.rs" })
|
||||
local one_match = sorter:score("abcdef", { ordinal = "exercises/generics/README.md" })
|
||||
|
||||
assert(multi_match < one_match)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('fzy', function()
|
||||
local sorter = require'telescope.sorters'.get_fzy_sorter()
|
||||
describe("fzy", function()
|
||||
local sorter = require("telescope.sorters").get_fzy_sorter()
|
||||
local function score(prompt, line)
|
||||
return sorter:score(
|
||||
prompt,
|
||||
{ordinal = line},
|
||||
function(val) return val end,
|
||||
function() return -1 end
|
||||
)
|
||||
return sorter:score(prompt, { ordinal = line }, function(val)
|
||||
return val
|
||||
end, function()
|
||||
return -1
|
||||
end)
|
||||
end
|
||||
|
||||
describe("matches", function()
|
||||
@@ -150,9 +147,9 @@ describe('telescope', function()
|
||||
assert.True(score("gemfil", "Gemfile") < score("gemfil", "Gemfile.lock"))
|
||||
end)
|
||||
it("prefers shorter matches", function()
|
||||
assert.True(score("abce", "abcdef") < score("abce", "abc de"));
|
||||
assert.True(score("abc", " a b c ") < score("abc", " a b c "));
|
||||
assert.True(score("abc", " a b c ") < score("abc", " a b c "));
|
||||
assert.True(score("abce", "abcdef") < score("abce", "abc de"))
|
||||
assert.True(score("abc", " a b c ") < score("abc", " a b c "))
|
||||
assert.True(score("abc", " a b c ") < score("abc", " a b c "))
|
||||
end)
|
||||
it("prefers shorter candidates", function()
|
||||
assert.True(score("test", "tests") < score("test", "testing"))
|
||||
@@ -174,21 +171,21 @@ describe('telescope', function()
|
||||
|
||||
describe("positioning", function()
|
||||
it("favors consecutive positions", function()
|
||||
assert.same({1, 5, 6}, positions("amo", "app/models/foo"))
|
||||
assert.same({ 1, 5, 6 }, positions("amo", "app/models/foo"))
|
||||
end)
|
||||
it("favors word beginnings", function()
|
||||
assert.same({1, 5, 12, 13}, positions("amor", "app/models/order"))
|
||||
assert.same({ 1, 5, 12, 13 }, positions("amor", "app/models/order"))
|
||||
end)
|
||||
it("works when there are no bonuses", function()
|
||||
assert.same({2, 4}, positions("as", "tags"))
|
||||
assert.same({3, 8}, positions("as", "examples.txt"))
|
||||
assert.same({ 2, 4 }, positions("as", "tags"))
|
||||
assert.same({ 3, 8 }, positions("as", "examples.txt"))
|
||||
end)
|
||||
it("favors smaller groupings of positions", function()
|
||||
assert.same({3, 5, 7}, positions("abc", "a/a/b/c/c"))
|
||||
assert.same({3, 5}, positions("ab", "caacbbc"))
|
||||
assert.same({ 3, 5, 7 }, positions("abc", "a/a/b/c/c"))
|
||||
assert.same({ 3, 5 }, positions("ab", "caacbbc"))
|
||||
end)
|
||||
it("handles exact matches", function()
|
||||
assert.same({1, 2, 3}, positions("foo", "foo"))
|
||||
assert.same({ 1, 2, 3 }, positions("foo", "foo"))
|
||||
end)
|
||||
it("ignores empty requests", function()
|
||||
assert.same({}, positions("", ""))
|
||||
@@ -198,9 +195,9 @@ describe('telescope', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('layout_strategies', function()
|
||||
describe('center', function()
|
||||
it('should handle large terminals', function()
|
||||
describe("layout_strategies", function()
|
||||
describe("center", function()
|
||||
it("should handle large terminals", function()
|
||||
-- TODO: This could call layout_strategies.center w/ some weird edge case.
|
||||
-- and then assert stuff about the dimensions.
|
||||
end)
|
||||
|
||||
@@ -1,25 +1,25 @@
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local previewers = require('telescope.previewers')
|
||||
local pickers = require('telescope.pickers')
|
||||
local sorters = require('telescope.sorters')
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local previewers = require "telescope.previewers"
|
||||
local pickers = require "telescope.pickers"
|
||||
local sorters = require "telescope.sorters"
|
||||
|
||||
local helpers = {}
|
||||
|
||||
-- TODO: We should do something with builtins to get those easily.
|
||||
helpers.auto_find_files = function(opts)
|
||||
opts = opts or {}
|
||||
opts.prompt_prefix = ''
|
||||
opts.prompt_prefix = ""
|
||||
|
||||
local find_command = opts.find_command
|
||||
|
||||
if not find_command then
|
||||
if 1 == vim.fn.executable("fd") then
|
||||
find_command = { 'fd', '--type', 'f' }
|
||||
elseif 1 == vim.fn.executable("fdfind") then
|
||||
find_command = { 'fdfind', '--type', 'f' }
|
||||
elseif 1 == vim.fn.executable("rg") then
|
||||
find_command = { 'rg', '--files' }
|
||||
if 1 == vim.fn.executable "fd" then
|
||||
find_command = { "fd", "--type", "f" }
|
||||
elseif 1 == vim.fn.executable "fdfind" then
|
||||
find_command = { "fdfind", "--type", "f" }
|
||||
elseif 1 == vim.fn.executable "rg" then
|
||||
find_command = { "rg", "--files" }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,11 +30,8 @@ helpers.auto_find_files = function(opts)
|
||||
opts.entry_maker = opts.entry_maker or make_entry.gen_from_file(opts)
|
||||
|
||||
local p = pickers.new(opts, {
|
||||
prompt = 'Find Files',
|
||||
finder = finders.new_oneshot_job(
|
||||
find_command,
|
||||
opts
|
||||
),
|
||||
prompt = "Find Files",
|
||||
finder = finders.new_oneshot_job(find_command, opts),
|
||||
previewer = previewers.cat.new(opts),
|
||||
sorter = sorters.get_fuzzy_file(),
|
||||
|
||||
@@ -43,21 +40,24 @@ helpers.auto_find_files = function(opts)
|
||||
|
||||
local count = 0
|
||||
p:register_completion_callback(function(s)
|
||||
print(count, vim.inspect(s.stats, {
|
||||
process = function(item)
|
||||
if type(item) == 'string' and item:sub(1, 1) == '_' then
|
||||
return nil
|
||||
end
|
||||
print(
|
||||
count,
|
||||
vim.inspect(s.stats, {
|
||||
process = function(item)
|
||||
if type(item) == "string" and item:sub(1, 1) == "_" then
|
||||
return nil
|
||||
end
|
||||
|
||||
return item
|
||||
end,
|
||||
}))
|
||||
return item
|
||||
end,
|
||||
})
|
||||
)
|
||||
|
||||
count = count + 1
|
||||
end)
|
||||
|
||||
local feed = function(text, feed_opts)
|
||||
feed_opts = feed_opts or 'n'
|
||||
feed_opts = feed_opts or "n"
|
||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(text, true, false, true), feed_opts, true)
|
||||
end
|
||||
|
||||
@@ -70,7 +70,7 @@ helpers.auto_find_files = function(opts)
|
||||
end
|
||||
|
||||
vim.wait(300, function() end)
|
||||
feed("<CR>", '')
|
||||
feed("<CR>", "")
|
||||
|
||||
vim.defer_fn(function()
|
||||
PASSED = opts.condition()
|
||||
|
||||
@@ -2,19 +2,21 @@
|
||||
vim.api.nvim_buf_set_lines(0, 4, -1, false, vim.tbl_keys(require('telescope.builtin')))
|
||||
--]]
|
||||
|
||||
require('telescope.builtin').git_files()
|
||||
RELOAD('telescope'); require('telescope.builtin').oldfiles()
|
||||
require('telescope.builtin').grep_string()
|
||||
require('telescope.builtin').lsp_document_symbols()
|
||||
RELOAD('telescope'); require('telescope.builtin').lsp_workspace_symbols()
|
||||
require('telescope.builtin').lsp_references()
|
||||
require('telescope.builtin').builtin()
|
||||
require('telescope.builtin').fd()
|
||||
require('telescope.builtin').command_history()
|
||||
require('telescope.builtin').search_history()
|
||||
require('telescope.builtin').live_grep()
|
||||
require('telescope.builtin').loclist()
|
||||
require("telescope.builtin").git_files()
|
||||
RELOAD "telescope"
|
||||
require("telescope.builtin").oldfiles()
|
||||
require("telescope.builtin").grep_string()
|
||||
require("telescope.builtin").lsp_document_symbols()
|
||||
RELOAD "telescope"
|
||||
require("telescope.builtin").lsp_workspace_symbols()
|
||||
require("telescope.builtin").lsp_references()
|
||||
require("telescope.builtin").builtin()
|
||||
require("telescope.builtin").fd()
|
||||
require("telescope.builtin").command_history()
|
||||
require("telescope.builtin").search_history()
|
||||
require("telescope.builtin").live_grep()
|
||||
require("telescope.builtin").loclist()
|
||||
|
||||
-- TODO: make a function that puts stuff into quickfix.
|
||||
-- that way we can test this better.
|
||||
require('telescope.builtin').quickfix()
|
||||
require("telescope.builtin").quickfix()
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
RELOAD('telescope')
|
||||
RELOAD "telescope"
|
||||
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local previewers = require('telescope.previewers')
|
||||
local pickers = require('telescope.pickers')
|
||||
local sorters = require('telescope.sorters')
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local previewers = require "telescope.previewers"
|
||||
local pickers = require "telescope.pickers"
|
||||
local sorters = require "telescope.sorters"
|
||||
|
||||
local find_files = function(opts)
|
||||
opts = opts or {}
|
||||
opts.prompt_prefix = ''
|
||||
opts.prompt_prefix = ""
|
||||
|
||||
local find_command = opts.find_command
|
||||
|
||||
if not find_command then
|
||||
if 1 == vim.fn.executable("fd") then
|
||||
find_command = { 'fd', '--type', 'f' }
|
||||
elseif 1 == vim.fn.executable("fdfind") then
|
||||
find_command = { 'fdfind', '--type', 'f' }
|
||||
elseif 1 == vim.fn.executable("rg") then
|
||||
find_command = { 'rg', '--files' }
|
||||
if 1 == vim.fn.executable "fd" then
|
||||
find_command = { "fd", "--type", "f" }
|
||||
elseif 1 == vim.fn.executable "fdfind" then
|
||||
find_command = { "fdfind", "--type", "f" }
|
||||
elseif 1 == vim.fn.executable "rg" then
|
||||
find_command = { "rg", "--files" }
|
||||
end
|
||||
end
|
||||
|
||||
@@ -29,11 +29,8 @@ local find_files = function(opts)
|
||||
opts.entry_maker = opts.entry_maker or make_entry.gen_from_file(opts)
|
||||
|
||||
local p = pickers.new(opts, {
|
||||
prompt = 'Find Files',
|
||||
finder = finders.new_oneshot_job(
|
||||
find_command,
|
||||
opts
|
||||
),
|
||||
prompt = "Find Files",
|
||||
finder = finders.new_oneshot_job(find_command, opts),
|
||||
previewer = previewers.cat.new(opts),
|
||||
sorter = sorters.get_fuzzy_file(),
|
||||
|
||||
@@ -42,21 +39,24 @@ local find_files = function(opts)
|
||||
|
||||
local count = 0
|
||||
p:register_completion_callback(function(s)
|
||||
print(count, vim.inspect(s.stats, {
|
||||
process = function(item)
|
||||
if type(item) == 'string' and item:sub(1, 1) == '_' then
|
||||
return nil
|
||||
end
|
||||
print(
|
||||
count,
|
||||
vim.inspect(s.stats, {
|
||||
process = function(item)
|
||||
if type(item) == "string" and item:sub(1, 1) == "_" then
|
||||
return nil
|
||||
end
|
||||
|
||||
return item
|
||||
end,
|
||||
}))
|
||||
return item
|
||||
end,
|
||||
})
|
||||
)
|
||||
|
||||
count = count + 1
|
||||
end)
|
||||
|
||||
local feed = function(text, feed_opts)
|
||||
feed_opts = feed_opts or 'n'
|
||||
feed_opts = feed_opts or "n"
|
||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(text, true, false, true), feed_opts, true)
|
||||
end
|
||||
|
||||
@@ -68,10 +68,10 @@ local find_files = function(opts)
|
||||
end
|
||||
|
||||
vim.wait(300, function() end)
|
||||
feed("<CR>", '')
|
||||
feed("<CR>", "")
|
||||
|
||||
coroutine.yield()
|
||||
print("STILL CALLED?")
|
||||
print "STILL CALLED?"
|
||||
end))
|
||||
|
||||
p:find()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
require('plenary.reload').reload_module('plenary')
|
||||
require('plenary.reload').reload_module('telescope')
|
||||
require("plenary.reload").reload_module "plenary"
|
||||
require("plenary.reload").reload_module "telescope"
|
||||
|
||||
--[[
|
||||
|
||||
@@ -8,11 +8,11 @@ Goals:
|
||||
|
||||
--]]
|
||||
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local pickers = require('telescope.pickers')
|
||||
local sorters = require('telescope.sorters')
|
||||
local EntryManager = require('telescope.entry_manager')
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local pickers = require "telescope.pickers"
|
||||
local sorters = require "telescope.sorters"
|
||||
local EntryManager = require "telescope.entry_manager"
|
||||
|
||||
local find_and_sort_test = function(prompt, f, s)
|
||||
local info = {}
|
||||
@@ -42,10 +42,7 @@ local find_and_sort_test = function(prompt, f, s)
|
||||
end
|
||||
|
||||
info.added = info.added + 1
|
||||
entry_manager:add_entry(
|
||||
s:score(prompt, entry),
|
||||
entry
|
||||
)
|
||||
entry_manager:add_entry(s:score(prompt, entry), entry)
|
||||
end
|
||||
|
||||
local process_complete = function()
|
||||
@@ -58,7 +55,9 @@ local find_and_sort_test = function(prompt, f, s)
|
||||
f(prompt, process_result, process_complete)
|
||||
|
||||
-- Wait until we're done to return
|
||||
vim.wait(5000, function() return completed end, 10)
|
||||
vim.wait(5000, function()
|
||||
return completed
|
||||
end, 10)
|
||||
|
||||
return entry_manager, info
|
||||
end
|
||||
@@ -74,42 +73,33 @@ local info_to_csv = function(info, filename)
|
||||
writer:write(info.inserted .. "\t")
|
||||
writer:write(info.total .. "\t")
|
||||
writer:write(info.set_entry .. "\t")
|
||||
writer:write(string.format("%.0f", collectgarbage("count")) .. "\t")
|
||||
writer:write("\n")
|
||||
writer:write(string.format("%.0f", collectgarbage "count") .. "\t")
|
||||
writer:write "\n"
|
||||
|
||||
writer:close()
|
||||
end
|
||||
|
||||
local cwd = vim.fn.expand "~/build/neovim"
|
||||
|
||||
local cwd = vim.fn.expand("~/build/neovim")
|
||||
|
||||
collectgarbage("collect")
|
||||
collectgarbage "collect"
|
||||
for _ = 1, 1 do
|
||||
|
||||
-- local s = sorters.get_fuzzy_file()
|
||||
local s = sorters.get_generic_fuzzy_sorter()
|
||||
local finder = finders.new_oneshot_job(
|
||||
{"fdfind"},
|
||||
{
|
||||
cwd = cwd,
|
||||
entry_maker = make_entry.gen_from_file {cwd = cwd},
|
||||
-- disable_devicons = true,
|
||||
-- maximum_results = 1000,
|
||||
}
|
||||
)
|
||||
local finder = finders.new_oneshot_job({ "fdfind" }, {
|
||||
cwd = cwd,
|
||||
entry_maker = make_entry.gen_from_file { cwd = cwd },
|
||||
-- disable_devicons = true,
|
||||
-- maximum_results = 1000,
|
||||
})
|
||||
|
||||
local res, info = find_and_sort_test(
|
||||
"pickers.lua",
|
||||
finder,
|
||||
s
|
||||
)
|
||||
local res, info = find_and_sort_test("pickers.lua", finder, s)
|
||||
|
||||
-- print(vim.inspect(res:get_entry(1)))
|
||||
-- print(vim.inspect(info))
|
||||
|
||||
info_to_csv(info, "/home/tj/tmp/profile.csv")
|
||||
|
||||
collectgarbage("collect")
|
||||
collectgarbage "collect"
|
||||
end
|
||||
-- No skip: 2,206,186
|
||||
-- Ya skip: 2,133
|
||||
|
||||
@@ -1,29 +1,25 @@
|
||||
RELOAD('plenary')
|
||||
RELOAD('telescope')
|
||||
RELOAD "plenary"
|
||||
RELOAD "telescope"
|
||||
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local previewers = require('telescope.previewers')
|
||||
local pickers = require('telescope.pickers')
|
||||
local sorters = require('telescope.sorters')
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local previewers = require "telescope.previewers"
|
||||
local pickers = require "telescope.pickers"
|
||||
local sorters = require "telescope.sorters"
|
||||
|
||||
local cwd = vim.fn.expand("~/build/neovim")
|
||||
local cwd = vim.fn.expand "~/build/neovim"
|
||||
|
||||
pickers.new {
|
||||
prompt = 'Large search',
|
||||
finder = finders.new_oneshot_job(
|
||||
{"fdfind"},
|
||||
{
|
||||
cwd = cwd,
|
||||
entry_maker = make_entry.gen_from_file {cwd = cwd},
|
||||
-- disable_devicons = true,
|
||||
-- maximum_results = 1000,
|
||||
}
|
||||
),
|
||||
pickers.new({
|
||||
prompt = "Large search",
|
||||
finder = finders.new_oneshot_job({ "fdfind" }, {
|
||||
cwd = cwd,
|
||||
entry_maker = make_entry.gen_from_file { cwd = cwd },
|
||||
-- disable_devicons = true,
|
||||
-- maximum_results = 1000,
|
||||
}),
|
||||
sorter = sorters.get_fuzzy_file(),
|
||||
previewer = previewers.cat.new{cwd = cwd},
|
||||
}:find()
|
||||
|
||||
previewer = previewers.cat.new { cwd = cwd },
|
||||
}):find()
|
||||
|
||||
-- vim.wait(3000, function()
|
||||
-- vim.cmd [[redraw!]]
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
require('plenary.reload').reload_module('telescope')
|
||||
require("plenary.reload").reload_module "telescope"
|
||||
|
||||
local finders = require('telescope.finders')
|
||||
local pickers = require('telescope.pickers')
|
||||
local sorters = require('telescope.sorters')
|
||||
local previewers = require('telescope.previewers')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local finders = require "telescope.finders"
|
||||
local pickers = require "telescope.pickers"
|
||||
local sorters = require "telescope.sorters"
|
||||
local previewers = require "telescope.previewers"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
|
||||
local my_list = {
|
||||
'lua/telescope/WIP.lua',
|
||||
'lua/telescope/actions.lua',
|
||||
'lua/telescope/builtin.lua',
|
||||
"lua/telescope/WIP.lua",
|
||||
"lua/telescope/actions.lua",
|
||||
"lua/telescope/builtin.lua",
|
||||
}
|
||||
|
||||
local opts = {}
|
||||
|
||||
pickers.new(opts, {
|
||||
prompt = 'Telescope Builtin',
|
||||
finder = finders.new_table {
|
||||
prompt = "Telescope Builtin",
|
||||
finder = finders.new_table {
|
||||
results = my_list,
|
||||
},
|
||||
sorter = sorters.get_generic_fuzzy_sorter(),
|
||||
sorter = sorters.get_generic_fuzzy_sorter(),
|
||||
previewer = previewers.cat.new(opts),
|
||||
}):find()
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
-- TODO: Add a ladder test.
|
||||
-- 1, 2, 4, 8, 16, 32 attempts
|
||||
|
||||
RELOAD('plenary')
|
||||
RELOAD "plenary"
|
||||
-- RELOAD('telescope')
|
||||
|
||||
local profiler = require('plenary.profile.lua_profiler')
|
||||
local Job = require('plenary.job')
|
||||
local profiler = require "plenary.profile.lua_profiler"
|
||||
local Job = require "plenary.job"
|
||||
|
||||
BIG_LIST = nil
|
||||
BIG_LIST = BIG_LIST or Job:new { command = 'fdfind', cwd = '~/build/' }:sync()
|
||||
BIG_LIST = BIG_LIST or Job:new({ command = "fdfind", cwd = "~/build/" }):sync()
|
||||
print(#BIG_LIST)
|
||||
|
||||
local do_profile = true
|
||||
local sorter_to_test = require('telescope.sorters').get_fuzzy_file()
|
||||
local sorter_to_test = require("telescope.sorters").get_fuzzy_file()
|
||||
|
||||
local strings_to_test = { "", "ev", "eval.c", "neovim/eval.c" }
|
||||
|
||||
@@ -25,7 +25,7 @@ local first_results = setmetatable({}, {
|
||||
local obj = {}
|
||||
rawset(t, k, obj)
|
||||
return obj
|
||||
end
|
||||
end,
|
||||
})
|
||||
|
||||
local second_results = {}
|
||||
@@ -66,6 +66,5 @@ print(vim.inspect(first_results))
|
||||
|
||||
if do_profile then
|
||||
profiler.stop()
|
||||
profiler.report('/home/tj/tmp/profiler_score.txt')
|
||||
profiler.report "/home/tj/tmp/profiler_score.txt"
|
||||
end
|
||||
|
||||
|
||||
@@ -1,19 +1,24 @@
|
||||
|
||||
-- local actions = require('telescope.actions')
|
||||
-- local utils = require('telescope.utils')
|
||||
require('telescope')
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local previewers = require('telescope.previewers')
|
||||
local pickers = require('telescope.pickers')
|
||||
local sorters = require('telescope.sorters')
|
||||
require "telescope"
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local previewers = require "telescope.previewers"
|
||||
local pickers = require "telescope.pickers"
|
||||
local sorters = require "telescope.sorters"
|
||||
|
||||
local log = require('telescope.log')
|
||||
local log = require "telescope.log"
|
||||
|
||||
local real_opts = setmetatable({}, { __mode = 'v' })
|
||||
local real_opts = setmetatable({}, { __mode = "v" })
|
||||
local opts = setmetatable({}, {
|
||||
__index = function(t, k) log.debug("accessing:", k); return real_opts[k] end,
|
||||
__newindex = function(t, k, v) log.debug("setting:", k, v); real_opts[k] = v end
|
||||
__index = function(t, k)
|
||||
log.debug("accessing:", k)
|
||||
return real_opts[k]
|
||||
end,
|
||||
__newindex = function(t, k, v)
|
||||
log.debug("setting:", k, v)
|
||||
real_opts[k] = v
|
||||
end,
|
||||
})
|
||||
|
||||
opts.entry_maker = opts.entry_maker or make_entry.gen_from_file()
|
||||
@@ -31,17 +36,14 @@ end
|
||||
-- assert(not opts.entry_maker)
|
||||
|
||||
local picker_config = {
|
||||
prompt = 'Git File',
|
||||
finder = finders.new_oneshot_job(
|
||||
{ "git", "ls-files", "-o", "--exclude-standard", "-c" }
|
||||
, opts
|
||||
),
|
||||
prompt = "Git File",
|
||||
finder = finders.new_oneshot_job({ "git", "ls-files", "-o", "--exclude-standard", "-c" }, opts),
|
||||
-- previewer = previewers.cat.new(opts),
|
||||
-- sorter = sorters.get_fuzzy_file(opts),
|
||||
-- sorter = sorters.get_fuzzy_file(),
|
||||
}
|
||||
|
||||
log.debug("Done with config")
|
||||
log.debug "Done with config"
|
||||
|
||||
local x = pickers.new(picker_config)
|
||||
x:find()
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
RELOAD('telescope')
|
||||
RELOAD "telescope"
|
||||
|
||||
local resolve = require('telescope.config.resolve')
|
||||
local resolve = require "telescope.config.resolve"
|
||||
|
||||
local eq = function(a, b)
|
||||
if a ~= b then
|
||||
error(string.format(
|
||||
"Expected a == b, got: %s and %s", vim.inspect(a), vim.inspect(b)
|
||||
))
|
||||
error(string.format("Expected a == b, got: %s and %s", vim.inspect(a), vim.inspect(b)))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -25,30 +23,29 @@ eq(height_config, opt.preview)
|
||||
eq(height_config, opt.prompt)
|
||||
eq(height_config, opt.results)
|
||||
|
||||
local table_val = {'a'}
|
||||
local table_val = { "a" }
|
||||
opt = resolve.win_option(nil, table_val)
|
||||
eq(table_val, opt.preview)
|
||||
eq(table_val, opt.prompt)
|
||||
eq(table_val, opt.results)
|
||||
|
||||
local prompt_override = {'a', prompt = 'b'}
|
||||
local prompt_override = { "a", prompt = "b" }
|
||||
opt = resolve.win_option(prompt_override)
|
||||
eq('a', opt.preview)
|
||||
eq('a', opt.results)
|
||||
eq('b', opt.prompt)
|
||||
eq("a", opt.preview)
|
||||
eq("a", opt.results)
|
||||
eq("b", opt.prompt)
|
||||
|
||||
local all_specified = {preview = 'a', prompt = 'b', results = 'c'}
|
||||
local all_specified = { preview = "a", prompt = "b", results = "c" }
|
||||
opt = resolve.win_option(all_specified)
|
||||
eq('a', opt.preview)
|
||||
eq('b', opt.prompt)
|
||||
eq('c', opt.results)
|
||||
|
||||
local some_specified = {prompt = 'b', results = 'c'}
|
||||
opt = resolve.win_option(some_specified, 'a')
|
||||
eq('a', opt.preview)
|
||||
eq('b', opt.prompt)
|
||||
eq('c', opt.results)
|
||||
eq("a", opt.preview)
|
||||
eq("b", opt.prompt)
|
||||
eq("c", opt.results)
|
||||
|
||||
local some_specified = { prompt = "b", results = "c" }
|
||||
opt = resolve.win_option(some_specified, "a")
|
||||
eq("a", opt.preview)
|
||||
eq("b", opt.prompt)
|
||||
eq("c", opt.results)
|
||||
|
||||
eq(10, resolve.resolve_height(0.1)(nil, 24, 100))
|
||||
eq(2, resolve.resolve_width(0.1)(nil, 24, 100))
|
||||
@@ -62,4 +59,4 @@ eq(24, resolve.resolve_width(50)(nil, 24, 100))
|
||||
-- eq('b', opt.prompt)
|
||||
-- eq('c', opt.results)
|
||||
|
||||
print("DONE!")
|
||||
print "DONE!"
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
RELOAD('telescope')
|
||||
RELOAD "telescope"
|
||||
|
||||
local actions = require('telescope.actions')
|
||||
local finders = require('telescope.finders')
|
||||
local make_entry = require('telescope.make_entry')
|
||||
local previewers = require('telescope.previewers')
|
||||
local pickers = require('telescope.pickers')
|
||||
local sorters = require('telescope.sorters')
|
||||
local utils = require('telescope.utils')
|
||||
local actions = require "telescope.actions"
|
||||
local finders = require "telescope.finders"
|
||||
local make_entry = require "telescope.make_entry"
|
||||
local previewers = require "telescope.previewers"
|
||||
local pickers = require "telescope.pickers"
|
||||
local sorters = require "telescope.sorters"
|
||||
local utils = require "telescope.utils"
|
||||
|
||||
local slow_proc = function(opts)
|
||||
opts = opts or {}
|
||||
@@ -18,11 +18,8 @@ local slow_proc = function(opts)
|
||||
opts.entry_maker = opts.entry_maker or make_entry.gen_from_file(opts)
|
||||
|
||||
local p = pickers.new(opts, {
|
||||
prompt = 'Slow Proc',
|
||||
finder = finders.new_oneshot_job(
|
||||
{"./scratch/slow_proc.sh"},
|
||||
opts
|
||||
),
|
||||
prompt = "Slow Proc",
|
||||
finder = finders.new_oneshot_job({ "./scratch/slow_proc.sh" }, opts),
|
||||
previewer = previewers.cat.new(opts),
|
||||
sorter = sorters.get_fuzzy_file(),
|
||||
|
||||
@@ -31,21 +28,24 @@ local slow_proc = function(opts)
|
||||
|
||||
local count = 0
|
||||
p:register_completion_callback(function(s)
|
||||
print(count, vim.inspect(s.stats, {
|
||||
process = function(item)
|
||||
if type(item) == 'string' and item:sub(1, 1) == '_' then
|
||||
return nil
|
||||
end
|
||||
print(
|
||||
count,
|
||||
vim.inspect(s.stats, {
|
||||
process = function(item)
|
||||
if type(item) == "string" and item:sub(1, 1) == "_" then
|
||||
return nil
|
||||
end
|
||||
|
||||
return item
|
||||
end,
|
||||
}))
|
||||
return item
|
||||
end,
|
||||
})
|
||||
)
|
||||
|
||||
count = count + 1
|
||||
end)
|
||||
|
||||
local feed = function(text)
|
||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(text, true, false, true), 'n', true)
|
||||
vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes(text, true, false, true), "n", true)
|
||||
end
|
||||
|
||||
if false then
|
||||
@@ -64,7 +64,6 @@ local slow_proc = function(opts)
|
||||
end))
|
||||
end
|
||||
|
||||
|
||||
p:find()
|
||||
end
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
local tester = require('telescope.pickers._test')
|
||||
local helper = require('telescope.pickers._test_helpers')
|
||||
local tester = require "telescope.pickers._test"
|
||||
local helper = require "telescope.pickers._test_helpers"
|
||||
|
||||
tester.builtin_picker('find_files', 'README.md', {
|
||||
tester.builtin_picker("find_files", "README.md", {
|
||||
post_close = {
|
||||
{'README.md', helper.get_file },
|
||||
}
|
||||
{ "README.md", helper.get_file },
|
||||
},
|
||||
})
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
require('plenary.reload').reload_module('plenary')
|
||||
require('plenary.reload').reload_module('telescope')
|
||||
require("plenary.reload").reload_module "plenary"
|
||||
require("plenary.reload").reload_module "telescope"
|
||||
|
||||
local tester = require('telescope.pickers._test')
|
||||
local helper = require('telescope.pickers._test_helpers')
|
||||
local tester = require "telescope.pickers._test"
|
||||
local helper = require "telescope.pickers._test_helpers"
|
||||
|
||||
tester.builtin_picker('find_files', 'telescope<c-n>', {
|
||||
tester.builtin_picker("find_files", "telescope<c-n>", {
|
||||
post_close = {
|
||||
tester.not_ { 'plugin/telescope.vim', helper.get_file },
|
||||
tester.not_ { "plugin/telescope.vim", helper.get_file },
|
||||
},
|
||||
}, {
|
||||
sorting_strategy = "descending",
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
local tester = require('telescope.pickers._test')
|
||||
local helper = require('telescope.pickers._test_helpers')
|
||||
local tester = require "telescope.pickers._test"
|
||||
local helper = require "telescope.pickers._test_helpers"
|
||||
|
||||
tester.builtin_picker('find_files', 'fixtures/file<c-p>', {
|
||||
tester.builtin_picker("find_files", "fixtures/file<c-p>", {
|
||||
post_close = {
|
||||
{ 'lua/tests/fixtures/file_abc.txt', helper.get_selection_value },
|
||||
{ "lua/tests/fixtures/file_abc.txt", helper.get_selection_value },
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user