summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authorkylo252 <59826753+kylo252@users.noreply.github.com>2022-04-22 16:13:32 +0200
committerGitHub <noreply@github.com>2022-04-22 16:13:32 +0200
commitcc1a3440f9ba6f28a8ca0bfff867f60c2d80c353 (patch)
tree965bd4cb118219c3f45dfdd7442379938f849938 /lua
parent5a58b1f53577a8e124d703b5f8f3a29d07416753 (diff)
fix: fix keep insert when going from telescope window to telescope window (#1600)
Also fixes `initial_mode` Co-authored-by: Simon Hauser <Simon-Hauser@outlook.de>
Diffstat (limited to 'lua')
-rw-r--r--lua/telescope/actions/init.lua20
-rw-r--r--lua/telescope/builtin/internal.lua3
-rw-r--r--lua/telescope/pickers.lua38
3 files changed, 27 insertions, 34 deletions
diff --git a/lua/telescope/actions/init.lua b/lua/telescope/actions/init.lua
index 4c3b42a..95f2ce4 100644
--- a/lua/telescope/actions/init.lua
+++ b/lua/telescope/actions/init.lua
@@ -343,28 +343,26 @@ end
--- Close the Telescope window, usually used within an action
---@param prompt_bufnr number: The prompt bufnr
actions.close = function(prompt_bufnr)
- actions._close(prompt_bufnr, false)
-end
-
---- Close the Telescope window and specify if you want to keep insert mode or not
----@param prompt_bufnr number: The prompt bufnr
----@param keepinsert boolean: Remain in INSERT mode if true
-actions._close = function(prompt_bufnr, keepinsert)
action_state.get_current_history():reset()
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
actions.close_pum(prompt_bufnr)
- if not keepinsert then
- vim.cmd [[stopinsert]]
- end
vim.api.nvim_win_close(prompt_win, true)
pcall(vim.cmd, string.format([[silent bdelete! %s]], prompt_bufnr))
pcall(a.nvim_set_current_win, original_win_id)
end
+--- Close the Telescope window, usually used within an action<br>
+--- Deprecated and no longer needed, does the same as |telescope.actions.close|. Might be removed in the future
+---@deprecated
+---@param prompt_bufnr number: The prompt bufnr
+actions._close = function(prompt_bufnr)
+ actions.close(prompt_bufnr)
+end
+
local set_edit_line = function(prompt_bufnr, fname, prefix, postfix)
postfix = vim.F.if_nil(postfix, "")
local selection = action_state.get_selected_entry()
@@ -460,7 +458,7 @@ end
---@param prompt_bufnr number: The prompt bufnr
actions.insert_symbol_i = function(prompt_bufnr)
local symbol = action_state.get_selected_entry().value[1]
- actions._close(prompt_bufnr, true)
+ actions.close(prompt_bufnr)
vim.schedule(function()
vim.cmd [[startinsert]]
vim.api.nvim_put({ symbol }, "", true, true)
diff --git a/lua/telescope/builtin/internal.lua b/lua/telescope/builtin/internal.lua
index 1421775..e3bcdce 100644
--- a/lua/telescope/builtin/internal.lua
+++ b/lua/telescope/builtin/internal.lua
@@ -178,9 +178,10 @@ internal.pickers = function(opts)
actions.select_default:replace(function(prompt_bufnr)
local current_picker = action_state.get_current_picker(prompt_bufnr)
local selection_index = current_picker:get_index(current_picker:get_selection_row())
- actions._close(prompt_bufnr, cached_pickers[selection_index].initial_mode == "insert")
+ actions.close(prompt_bufnr)
opts.cache_picker = opts._cache_picker
opts["cache_index"] = selection_index
+ opts["initial_mode"] = cached_pickers[selection_index].initial_mode
internal.resume(opts)
end)
map("i", "<C-x>", actions.remove_selected_picker)
diff --git a/lua/telescope/pickers.lua b/lua/telescope/pickers.lua
index 4555ffb..97e5ec6 100644
--- a/lua/telescope/pickers.lua
+++ b/lua/telescope/pickers.lua
@@ -432,21 +432,19 @@ function Picker:find()
pcall(a.nvim_buf_set_option, prompt_bufnr, "filetype", "TelescopePrompt")
pcall(a.nvim_buf_set_option, results_bufnr, "filetype", "TelescopeResults")
- -- TODO(async): I wonder if this should actually happen _before_ we nvim_buf_attach.
- -- This way the buffer would always start with what we think it should when we start the loop.
- if self.initial_mode == "insert" or self.initial_mode == "normal" then
- -- required for set_prompt to work adequately
- vim.cmd [[startinsert!]]
- if self.default_text then
- self:set_prompt(self.default_text)
- end
- if self.initial_mode == "normal" then
- -- otherwise (i) insert mode exitted faster than `picker:set_prompt`; (ii) cursor on wrong pos
- await_schedule(function()
- vim.cmd [[stopinsert]]
- end)
- end
- else
+ if self.default_text then
+ self:set_prompt(self.default_text)
+ end
+
+ if self.initial_mode == "insert" then
+ vim.schedule(function()
+ -- startinsert! did not reliable do `A` no idea why, i even looked at the source code
+ -- Example: live_grep -> type something -> quit -> Telescope pickers -> resume -> cursor of by one
+ if vim.fn.mode() ~= "i" then
+ vim.api.nvim_feedkeys(vim.api.nvim_replace_termcodes("<ESC>A", true, false, true), "n", true)
+ end
+ end)
+ elseif self.initial_mode ~= "normal" then
error("Invalid setting for initial_mode: " .. self.initial_mode)
end
@@ -722,10 +720,8 @@ function Picker:delete_selection(delete_cb)
end, 50)
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)
+function Picker:set_prompt(text)
+ self:reset_prompt(text)
end
--- Closes the windows for the prompt, results and preview
@@ -890,7 +886,6 @@ end
function Picker:reset_prompt(text)
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
@@ -1223,7 +1218,7 @@ end
--- Close all open Telescope pickers
function Picker:close_existing_pickers()
for _, prompt_bufnr in ipairs(state.get_existing_prompts()) do
- pcall(actions._close, prompt_bufnr, true)
+ pcall(actions.close, prompt_bufnr)
end
end
@@ -1529,7 +1524,6 @@ function Picker:_resume_picker()
self.cache_picker.is_cached = false
-- if text changed, required to set anew to restart finder; otherwise hl and selection
if self.cache_picker.cached_prompt ~= self.default_text then
- self:reset_prompt()
self:set_prompt(self.default_text)
else
-- scheduling required to apply highlighting and selection appropriately