Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: no longer leaking one buffer previewer in some occasions #664

Merged
merged 9 commits into from
Mar 30, 2021
32 changes: 17 additions & 15 deletions doc/telescope.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,44 +23,44 @@ telescope.setup({opts}) *telescope.setup()*
entry_prefix: ~
Prefix in front of each result entry. Current selection not included.

Default: ' '
Default: ' '

*telescope.defaults.prompt_prefix*
prompt_prefix: ~
Will be shown in front of the prompt.

Default: '> '
Default: '> '

*telescope.defaults.scroll_strategy*
scroll_strategy: ~
Determines what happens you try to scroll past view of the picker.

Available options are:
- "cycle" (default)
- "limit"
Available options are:
- "cycle" (default)
- "limit"

*telescope.defaults.selection_caret*
selection_caret: ~
Will be shown in front of the selection.

Default: '> '
Default: '> '

*telescope.defaults.selection_strategy*
selection_strategy: ~
Determines how the cursor acts after each sort iteration.

Available options are:
- "reset" (default)
- "follow"
- "row"
Available options are:
- "reset" (default)
- "follow"
- "row"

*telescope.defaults.sorting_strategy*
sorting_strategy: ~
Determines the direction "better" results are sorted towards.

Available options are:
- "descending" (default)
- "ascending"
Available options are:
- "descending" (default)
- "ascending"

Parameters: ~
{opts} (table) Configuration opts. Keys: defaults, extensions
Expand Down Expand Up @@ -269,8 +269,10 @@ previewers.new_termopen_previewer() *previewers.new_termopen_previewer()*

It requires you to specify one table entry `get_command(entry, status)`.
This `get_command` function has to return the terminal command that will be
executed for each entry. Example: get_command = function(entry, status)
return { 'bat', entry.path } end
executed for each entry. Example:
get_command = function(entry, status)
return { 'bat', entry.path }
end

It's an easy way to get your first previewer going and it integrates well
with `bat` and `less`. Providing out of the box scrolling if the command
Expand Down
2 changes: 1 addition & 1 deletion lua/telescope/builtin/internal.lua
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,7 @@ internal.keymaps = function(opts)
return {
valid = line ~= "",
value = line,
ordinal = line.lhs .. line.rhs,
ordinal = utils.display_termcodes(line.lhs) .. line.rhs,
display = line.mode .. ' ' .. utils.display_termcodes(line.lhs) .. ' ' .. line.rhs
}
end
Expand Down
21 changes: 7 additions & 14 deletions lua/telescope/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,7 @@ function config.set_defaults(defaults)

config.values[name] = get(name, default_val)
if description then
-- TODO(conni2461): trim is wrong. We need to do dedent here
config.descriptions[name] = dedent(vim.trim(description))
config.descriptions[name] = dedent(description)
end
end

Expand All @@ -69,25 +68,22 @@ function config.set_defaults(defaults)

Available options are:
- "descending" (default)
- "ascending"
]])
- "ascending"]])

set("selection_strategy", "reset", [[
Determines how the cursor acts after each sort iteration.

Available options are:
- "reset" (default)
- "follow"
- "row"
]])
- "row"]])

set("scroll_strategy", "cycle", [[
Determines what happens you try to scroll past view of the picker.

Available options are:
- "cycle" (default)
- "limit"
]])
- "limit"]])

set("layout_strategy", "horizontal")
set("layout_defaults", {})
Expand All @@ -103,18 +99,15 @@ function config.set_defaults(defaults)
set("prompt_prefix", "> ", [[
Will be shown in front of the prompt.

Default: '> '
]])
Default: '> ']])
set("selection_caret", "> ", [[
Will be shown in front of the selection.

Default: '> '
]])
Default: '> ']])
set("entry_prefix", " ", [[
Prefix in front of each result entry. Current selection not included.

Default: ' '
]])
Default: ' ']])
set("initial_mode", "insert")

set("border", {})
Expand Down
14 changes: 9 additions & 5 deletions lua/telescope/pickers.lua
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ function Picker:find()
-- Register attach
vim.api.nvim_buf_attach(prompt_bufnr, false, {
on_lines = on_lines,
on_detach = vim.schedule_wrap(function()
on_detach = function()
on_lines = nil

-- TODO: Can we add a "cleanup" / "teardown" function that completely removes these.
Expand All @@ -459,9 +459,11 @@ function Picker:find()
self.sorter = nil
self.manager = nil

self.closed = true

-- TODO: Should we actually do this?
collectgarbage(); collectgarbage()
end),
end,
})

-- TODO: Use WinLeave as well?
Expand Down Expand Up @@ -902,6 +904,7 @@ 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
local current_prompt = vim.api.nvim_buf_get_lines(prompt_bufnr, 0, 1, false)[1]
if not current_prompt then
return
Expand Down Expand Up @@ -931,7 +934,7 @@ end

function Picker:get_result_processor(prompt, status_updater)
return function(entry)
if self:is_done() then return end
if self.closed or self:is_done() then return end

self:_increment("processed")

Expand All @@ -951,7 +954,8 @@ function Picker:get_result_processor(prompt, status_updater)
local file = type(entry.value) == 'string' and entry.value or entry.filename
if file then
if string.find(file, v) then
log.debug("SKPIPING", entry.value, "because", v)
log.debug("SKIPPING", entry.value, "because", v)
self:_decrement("processed")
return
end
end
Expand Down Expand Up @@ -986,7 +990,7 @@ end

function Picker:get_result_completor(results_bufnr, prompt, status_updater)
return function()
if self:is_done() then return end
if self.closed == true or self:is_done() then return end
Conni2461 marked this conversation as resolved.
Show resolved Hide resolved

local selection_strategy = self.selection_strategy or 'reset'

Expand Down
62 changes: 38 additions & 24 deletions lua/telescope/previewers/buffer_previewer.lua
Original file line number Diff line number Diff line change
Expand Up @@ -66,28 +66,36 @@ previewers.file_maker = function(filepath, bufnr, opts)

if opts.bufname ~= filepath then
if not vim.in_fast_event() then filepath = vim.fn.expand(filepath) end
local stat = vim.loop.fs_stat(filepath) or {}
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)
vim.loop.fs_stat(filepath, function(_, stat)
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)})
else
path.read_file_async(filepath, 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 opts.callback then opts.callback(bufnr) end
end)})
else
path.read_file_async(filepath, 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 opts.callback then opts.callback(bufnr) end
putils.highlighter(bufnr, ft)
end))
end
putils.highlighter(bufnr, ft)
end))
end
end)
else
if opts.callback then opts.callback(bufnr) end
if opts.callback then
if vim.in_fast_event() then
vim.schedule(function() opts.callback(bufnr) end)
else
opts.callback(bufnr)
end
end
end
end

Expand All @@ -112,8 +120,10 @@ previewers.new_buffer_previewer = function(opts)
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.bufnr = value end
if self.state then
self.state.bufnr = value
table.insert(old_bufs, value)
end
end

local function get_bufnr_by_bufname(self, value)
Expand All @@ -122,8 +132,12 @@ previewers.new_buffer_previewer = function(opts)
end

local function set_bufname(self, value)
if get_bufnr(self) then bufname_table[value] = get_bufnr(self) end
if self.state then self.state.bufname = value end
if self.state then
self.state.bufname = value
if value then
bufname_table[value] = get_bufnr(self)
end
end
end

function opts.setup(self)
Expand Down
2 changes: 2 additions & 0 deletions lua/telescope/previewers/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,11 @@ end
--- It requires you to specify one table entry `get_command(entry, status)`.
--- This `get_command` function has to return the terminal command that will be
--- executed for each entry. Example:
--- <pre>
--- get_command = function(entry, status)
--- return { 'bat', entry.path }
--- end
--- </pre>
---
--- It's an easy way to get your first previewer going and it integrates well
--- with `bat` and `less`. Providing out of the box scrolling if the command
Expand Down
3 changes: 1 addition & 2 deletions lua/telescope/previewers/utils.lua
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ utils.job_maker = function(cmd, bufnr, opts)
on_exit = vim.schedule_wrap(function(j)
if not vim.api.nvim_buf_is_valid(bufnr) then return end
if opts.mode == "append" then
local count = vim.api.nvim_buf_line_count(bufnr)
vim.api.nvim_buf_set_lines(bufnr, count, -1, false, j:result())
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
Expand Down