fix: termopen previewer (#1901)
- buffer leaking - still insert mode on confirm
This commit is contained in:
@@ -335,13 +335,13 @@ Built-in functions. Ready to be bound to any key you like.
|
|||||||
## Previewers
|
## Previewers
|
||||||
|
|
||||||
| Previewers | Description |
|
| Previewers | Description |
|
||||||
|------------------------------------|-----------------------------------------------------------------|
|
|------------------------------------|-----------------------------------------------------------|
|
||||||
| `previewers.vim_buffer_cat.new` | Default previewer for files. Uses vim buffers |
|
| `previewers.vim_buffer_cat.new` | Default previewer for files. Uses vim buffers |
|
||||||
| `previewers.vim_buffer_vimgrep.new`| Default previewer for grep and similar. Uses vim buffers |
|
| `previewers.vim_buffer_vimgrep.new`| Default previewer for grep and similar. Uses vim buffers |
|
||||||
| `previewers.vim_buffer_qflist.new` | Default previewer for qflist. Uses vim buffers |
|
| `previewers.vim_buffer_qflist.new` | Default previewer for qflist. Uses vim buffers |
|
||||||
| `previewers.cat.new` | Deprecated previewer for files. Uses `cat`/`bat` |
|
| `previewers.cat.new` | Terminal previewer for files. Uses `cat`/`bat` |
|
||||||
| `previewers.vimgrep.new` | Deprecated previewer for grep and similar. Uses `cat`/`bat` |
|
| `previewers.vimgrep.new` | Terminal previewer for grep and similar. Uses `cat`/`bat` |
|
||||||
| `previewers.qflist.new` | Deprecated previewer for qflist. Uses `cat`/`bat` |
|
| `previewers.qflist.new` | Terminal previewer for qflist. Uses `cat`/`bat` |
|
||||||
|
|
||||||
The default previewers are from now on `vim_buffer_` previewers. They use vim
|
The default previewers are from now on `vim_buffer_` previewers. They use vim
|
||||||
buffers for displaying files and use tree-sitter or regex for file highlighting.
|
buffers for displaying files and use tree-sitter or regex for file highlighting.
|
||||||
|
|||||||
@@ -2932,9 +2932,6 @@ previewers.new_termopen_previewer() *telescope.previewers.new_termopen_previewer
|
|||||||
Furthermore, it will forward all `config.set_env` environment variables to
|
Furthermore, it will forward all `config.set_env` environment variables to
|
||||||
that terminal process.
|
that terminal process.
|
||||||
|
|
||||||
While this interface is a good start, it was replaced with the way more
|
|
||||||
flexible `buffer_previewer` and is now deprecated.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
previewers.cat() *telescope.previewers.cat()*
|
previewers.cat() *telescope.previewers.cat()*
|
||||||
|
|||||||
@@ -345,13 +345,11 @@ end
|
|||||||
actions.close = function(prompt_bufnr)
|
actions.close = function(prompt_bufnr)
|
||||||
action_state.get_current_history():reset()
|
action_state.get_current_history():reset()
|
||||||
local picker = action_state.get_current_picker(prompt_bufnr)
|
local picker = action_state.get_current_picker(prompt_bufnr)
|
||||||
local prompt_win = state.get_status(prompt_bufnr).prompt_win
|
|
||||||
local original_win_id = picker.original_win_id
|
local original_win_id = picker.original_win_id
|
||||||
|
|
||||||
actions.close_pum(prompt_bufnr)
|
actions.close_pum(prompt_bufnr)
|
||||||
|
|
||||||
vim.api.nvim_win_close(prompt_win, true)
|
require("telescope.pickers").on_close_prompt(prompt_bufnr)
|
||||||
pcall(vim.cmd, string.format([[silent bdelete! %s]], prompt_bufnr))
|
|
||||||
pcall(a.nvim_set_current_win, original_win_id)
|
pcall(a.nvim_set_current_win, original_win_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -731,23 +731,15 @@ end
|
|||||||
---@param status table: table containing information on the picker
|
---@param status table: table containing information on the picker
|
||||||
--- and associated windows. Generally obtained from `state.get_status`
|
--- and associated windows. Generally obtained from `state.get_status`
|
||||||
function Picker.close_windows(status)
|
function Picker.close_windows(status)
|
||||||
local prompt_win = status.prompt_win
|
utils.win_delete("results_win", status.results_win, true, true)
|
||||||
local results_win = status.results_win
|
utils.win_delete("preview_win", status.preview_win, true, true)
|
||||||
local preview_win = status.preview_win
|
|
||||||
|
|
||||||
local prompt_border_win = status.prompt_border_win
|
utils.win_delete("prompt_border_win", status.prompt_border_win, true, true)
|
||||||
local results_border_win = status.results_border_win
|
utils.win_delete("results_border_win", status.results_border_win, true, true)
|
||||||
local preview_border_win = status.preview_border_win
|
utils.win_delete("preview_border_win", status.preview_border_win, true, true)
|
||||||
|
|
||||||
utils.win_delete("results_win", results_win, true, true)
|
|
||||||
utils.win_delete("preview_win", preview_win, true, true)
|
|
||||||
|
|
||||||
utils.win_delete("prompt_border_win", prompt_border_win, true, true)
|
|
||||||
utils.win_delete("results_border_win", results_border_win, true, true)
|
|
||||||
utils.win_delete("preview_border_win", preview_border_win, true, true)
|
|
||||||
|
|
||||||
vim.defer_fn(function()
|
vim.defer_fn(function()
|
||||||
utils.win_delete("prompt_win", prompt_win, true)
|
utils.win_delete("prompt_win", status.prompt_win, true)
|
||||||
end, 10)
|
end, 10)
|
||||||
|
|
||||||
state.clear_status(status.prompt_bufnr)
|
state.clear_status(status.prompt_bufnr)
|
||||||
@@ -1468,6 +1460,11 @@ function pickers.on_close_prompt(prompt_bufnr)
|
|||||||
|
|
||||||
picker.close_windows(status)
|
picker.close_windows(status)
|
||||||
mappings.clear(prompt_bufnr)
|
mappings.clear(prompt_bufnr)
|
||||||
|
vim.api.nvim_clear_autocmds {
|
||||||
|
group = "PickerInsert",
|
||||||
|
event = "BufLeave",
|
||||||
|
buffer = prompt_bufnr,
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
function pickers.on_resize_window(prompt_bufnr)
|
function pickers.on_resize_window(prompt_bufnr)
|
||||||
|
|||||||
@@ -95,9 +95,6 @@ end
|
|||||||
---
|
---
|
||||||
--- Furthermore, it will forward all `config.set_env` environment variables to
|
--- Furthermore, it will forward all `config.set_env` environment variables to
|
||||||
--- that terminal process.
|
--- that terminal process.
|
||||||
---
|
|
||||||
--- While this interface is a good start, it was replaced with the way more
|
|
||||||
--- flexible `buffer_previewer` and is now deprecated.
|
|
||||||
previewers.new_termopen_previewer = term_previewer.new_termopen_previewer
|
previewers.new_termopen_previewer = term_previewer.new_termopen_previewer
|
||||||
|
|
||||||
--- Provides a `termopen_previewer` which has the ability to display files.
|
--- Provides a `termopen_previewer` which has the ability to display files.
|
||||||
|
|||||||
@@ -1,14 +1,9 @@
|
|||||||
local conf = require("telescope.config").values
|
local conf = require("telescope.config").values
|
||||||
local utils = require "telescope.utils"
|
local utils = require "telescope.utils"
|
||||||
local Path = require "plenary.path"
|
local Path = require "plenary.path"
|
||||||
local putils = require "telescope.previewers.utils"
|
|
||||||
local from_entry = require "telescope.from_entry"
|
local from_entry = require "telescope.from_entry"
|
||||||
local Previewer = require "telescope.previewers.previewer"
|
local Previewer = require "telescope.previewers.previewer"
|
||||||
|
|
||||||
local flatten = vim.tbl_flatten
|
|
||||||
local buf_delete = utils.buf_delete
|
|
||||||
local job_is_running = utils.job_is_running
|
|
||||||
|
|
||||||
local defaulter = utils.make_default_callable
|
local defaulter = utils.make_default_callable
|
||||||
|
|
||||||
local previewers = {}
|
local previewers = {}
|
||||||
@@ -56,7 +51,7 @@ local bat_maker = function(filename, lnum, start, finish)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return flatten {
|
return vim.tbl_flatten {
|
||||||
command,
|
command,
|
||||||
bat_options,
|
bat_options,
|
||||||
"--",
|
"--",
|
||||||
@@ -120,27 +115,24 @@ previewers.new_termopen_previewer = function(opts)
|
|||||||
local opt_teardown = opts.teardown
|
local opt_teardown = opts.teardown
|
||||||
|
|
||||||
local old_bufs = {}
|
local old_bufs = {}
|
||||||
|
local bufentry_table = {}
|
||||||
|
local term_ids = {}
|
||||||
|
|
||||||
local function get_term_id(self)
|
local function get_term_id(self)
|
||||||
if not self.state then
|
if self.state then
|
||||||
return nil
|
|
||||||
end
|
|
||||||
return self.state.termopen_id
|
return self.state.termopen_id
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function get_bufnr(self)
|
local function get_bufnr(self)
|
||||||
if not self.state then
|
if self.state then
|
||||||
return nil
|
|
||||||
end
|
|
||||||
return self.state.termopen_bufnr
|
return self.state.termopen_bufnr
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
local function set_term_id(self, value)
|
local function set_term_id(self, value)
|
||||||
if job_is_running(get_term_id(self)) then
|
if self.state and term_ids[self.state.termopen_bufnr] == nil then
|
||||||
vim.fn.jobstop(get_term_id(self))
|
term_ids[self.state.termopen_bufnr] = value
|
||||||
end
|
|
||||||
if self.state then
|
|
||||||
self.state.termopen_id = value
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -153,6 +145,18 @@ previewers.new_termopen_previewer = function(opts)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_bufnr_by_bufentry(self, value)
|
||||||
|
if self.state then
|
||||||
|
return bufentry_table[value]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function set_bufentry(self, value)
|
||||||
|
if self.state and value then
|
||||||
|
bufentry_table[value] = get_bufnr(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
function opts.setup(self)
|
function opts.setup(self)
|
||||||
local state = {}
|
local state = {}
|
||||||
if opt_setup then
|
if opt_setup then
|
||||||
@@ -166,17 +170,17 @@ previewers.new_termopen_previewer = function(opts)
|
|||||||
opt_teardown(self)
|
opt_teardown(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
local term_id = get_term_id(self)
|
|
||||||
if term_id and utils.job_is_running(term_id) then
|
|
||||||
vim.fn.jobclose(term_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
set_term_id(self, nil)
|
|
||||||
set_bufnr(self, nil)
|
set_bufnr(self, nil)
|
||||||
|
set_bufentry(self, nil)
|
||||||
|
|
||||||
for _, bufnr in ipairs(old_bufs) do
|
for _, bufnr in ipairs(old_bufs) do
|
||||||
buf_delete(bufnr)
|
local term_id = term_ids[bufnr]
|
||||||
|
if term_id and utils.job_is_running(term_id) then
|
||||||
|
vim.fn.jobstop(term_id)
|
||||||
end
|
end
|
||||||
|
utils.buf_delete(bufnr)
|
||||||
|
end
|
||||||
|
bufentry_table = {}
|
||||||
end
|
end
|
||||||
|
|
||||||
function opts.preview_fn(self, entry, status)
|
function opts.preview_fn(self, entry, status)
|
||||||
@@ -184,24 +188,28 @@ previewers.new_termopen_previewer = function(opts)
|
|||||||
set_bufnr(self, vim.api.nvim_win_get_buf(status.preview_win))
|
set_bufnr(self, vim.api.nvim_win_get_buf(status.preview_win))
|
||||||
end
|
end
|
||||||
|
|
||||||
set_bufnr(self, vim.api.nvim_create_buf(false, true))
|
local prev_bufnr = get_bufnr_by_bufentry(self, entry)
|
||||||
|
if prev_bufnr then
|
||||||
local bufnr = get_bufnr(self)
|
self.state.bufnr = prev_bufnr
|
||||||
|
vim.api.nvim_win_set_buf(status.preview_win, self.state.bufnr)
|
||||||
|
else
|
||||||
|
local bufnr = vim.api.nvim_create_buf(false, true)
|
||||||
|
set_bufnr(self, bufnr)
|
||||||
vim.api.nvim_win_set_buf(status.preview_win, bufnr)
|
vim.api.nvim_win_set_buf(status.preview_win, bufnr)
|
||||||
|
|
||||||
local term_opts = {
|
local term_opts = {
|
||||||
cwd = opts.cwd or vim.fn.getcwd(),
|
cwd = opts.cwd or vim.loop.cwd(),
|
||||||
env = conf.set_env,
|
env = conf.set_env,
|
||||||
}
|
}
|
||||||
|
|
||||||
putils.with_preview_window(status, bufnr, function()
|
|
||||||
local cmd = opts.get_command(entry, status)
|
local cmd = opts.get_command(entry, status)
|
||||||
if cmd then
|
if cmd then
|
||||||
|
vim.api.nvim_buf_call(bufnr, function()
|
||||||
set_term_id(self, vim.fn.termopen(cmd, term_opts))
|
set_term_id(self, vim.fn.termopen(cmd, term_opts))
|
||||||
end
|
|
||||||
end)
|
end)
|
||||||
|
end
|
||||||
vim.api.nvim_buf_set_name(bufnr, tostring(bufnr))
|
set_bufentry(self, entry)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if not opts.send_input then
|
if not opts.send_input then
|
||||||
|
|||||||
Reference in New Issue
Block a user