From aefc8317354426864a361d7b7d84848145d218c1 Mon Sep 17 00:00:00 2001 From: Simon Hauser Date: Tue, 30 Mar 2021 12:32:18 +0200 Subject: [PATCH] fix: no longer leaking one buffer previewer in some occasions (#664) * fix: stop leaking last preview buffer * fix: formatting for docs * fix: async check if file is dir or not and - fix for in_fast_event when overriding file_maker * fix: filtering for space in keymaps and fzy * fix: show correct result numbers when using file_ignore_patterns * Handle early close. Caused because we actually cleaning up buffers now * cleanup * [docgen] Update doc/telescope.txt --- doc/telescope.txt | 32 +++++----- lua/telescope/builtin/internal.lua | 2 +- lua/telescope/config.lua | 21 +++---- lua/telescope/pickers.lua | 14 +++-- lua/telescope/previewers/buffer_previewer.lua | 62 ++++++++++++------- lua/telescope/previewers/init.lua | 2 + lua/telescope/previewers/utils.lua | 3 +- 7 files changed, 75 insertions(+), 61 deletions(-) diff --git a/doc/telescope.txt b/doc/telescope.txt index cd3374a..02fe61a 100644 --- a/doc/telescope.txt +++ b/doc/telescope.txt @@ -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 @@ -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 diff --git a/lua/telescope/builtin/internal.lua b/lua/telescope/builtin/internal.lua index 18820f8..7d9d750 100644 --- a/lua/telescope/builtin/internal.lua +++ b/lua/telescope/builtin/internal.lua @@ -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 diff --git a/lua/telescope/config.lua b/lua/telescope/config.lua index 17c1e91..c62e21b 100644 --- a/lua/telescope/config.lua +++ b/lua/telescope/config.lua @@ -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 @@ -69,8 +68,7 @@ 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. @@ -78,16 +76,14 @@ function config.set_defaults(defaults) 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", {}) @@ -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", {}) diff --git a/lua/telescope/pickers.lua b/lua/telescope/pickers.lua index 3bb773b..5ba0ca0 100644 --- a/lua/telescope/pickers.lua +++ b/lua/telescope/pickers.lua @@ -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. @@ -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? @@ -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 @@ -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") @@ -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 @@ -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 local selection_strategy = self.selection_strategy or 'reset' diff --git a/lua/telescope/previewers/buffer_previewer.lua b/lua/telescope/previewers/buffer_previewer.lua index 16031f9..d480e0c 100644 --- a/lua/telescope/previewers/buffer_previewer.lua +++ b/lua/telescope/previewers/buffer_previewer.lua @@ -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) - 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 + 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 - putils.highlighter(bufnr, ft) - end)) - end + if opts.callback then opts.callback(bufnr) 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 @@ -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) @@ -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) diff --git a/lua/telescope/previewers/init.lua b/lua/telescope/previewers/init.lua index be99c03..db801ea 100644 --- a/lua/telescope/previewers/init.lua +++ b/lua/telescope/previewers/init.lua @@ -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: +---
 ---   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 diff --git a/lua/telescope/previewers/utils.lua b/lua/telescope/previewers/utils.lua index 35196e6..20762e2 100644 --- a/lua/telescope/previewers/utils.lua +++ b/lua/telescope/previewers/utils.lua @@ -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