akinsho / akinsho/toggleterm.nvim

[BUG] Calling toggle in quick succession does not respect persist_mode/start_in_insert

Đang mở
#522 2 bình luận 1 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Lua
Star
5.6k
Fork
206
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

### Is there an existing issue for this?

- [X] I have searched the existing issues

### Current Behavior

Calling `toggle` twice in quick succession will not respect `persist_mode`/`start_in_insert`

### Expected Behavior

No amount of `toggle` calling changes the behavior.

### Steps To Reproduce

1. Open neovim with the following minimal config using `nvim -u repro.lua somerandomfile`:
```lua
-- DO NOT change the paths and don't remove the colorscheme
local root = vim.fn.fnamemodify("./.repro", ":p")

-- set stdpaths to use .repro
for _, name in ipairs({ "config", "data", "state", "cache" }) do
vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end

-- bootstrap lazy
local lazypath = root .. "/plugins/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath })
end
vim.opt.runtimepath:prepend(lazypath)
vim.g.mapleader = " "

-- install plugins
local plugins = {
"folke/tokyonight.nvim",
-- add any other plugins here
}

local toggleterm_config = {
"akinsho/toggleterm.nvim",
config = function()
require("toggleterm").setup({
shading_factor = "0",
hide_numbers = false,
persist_mode = true,
start_in_insert = true,
direction = "float",
size = function(term)
if term.direction == "horizontal" then
return vim.o.lines * 0.5
elseif term.direction == "vertical" then
return vim.o.columns * 0.5
end
end,
})

local term = require("toggleterm.terminal").Terminal
vim.keymap.set("n", "tc", function()
local t = term:new({
dir = "%:p:h",
display_name = vim.fn.expand("%:p:h"),
})
t:toggle()
end, { desc = "Term current dir" })
vim.keymap.set("n", "t;", function()
local t = term:new({
display_name = "default",
})
t:toggle()
end, { desc = "Create term" })
vim.keymap.set({ "n", "t" }, "", "ToggleTerm", { desc = "Toggle term" })
vim.keymap.set({ "n", "t" }, "", function()
require("toggleterm").toggle(2)
require("toggleterm").toggle(1)
end, { desc = "Toggle term" })
end,
}

table.insert(plugins, toggleterm_config)
require("lazy").setup(plugins, {
root = root .. "/plugins",
})

vim.cmd.colorscheme("tokyonight")
-- add anything else here
```
2. Create 2 terminals using the provided keybinds (in my case, `tc` followed by `t;`
3. Once the 2nd terminal is opened, press ``
4. Notice that while switching back to the first terminal, this terminal will now be in `normal` mode

### Environment

```Markdown
- OS: arch Linux 6.6.3-arch1-1
- neovim version: v0.10.0-dev-38e9875
- Shell: zsh
```

### Anything else?

Here is a video of the `Steps to Reproduce` section:
https://github.com/akinsho/toggleterm.nvim/assets/7985687/a7c5e75d-609a-4c3b-a2ea-f490add9039c
Note that this behavior will happen also when calling toggle on the same terminal twice in succession as well, e.g.:
```lua
require("toggleterm").toggle(2)
require("toggleterm").toggle(2)
```
It also happens if we call the `:{count}ToggleTerm` twice in quick succession as well.

#### Why does that matter?

I think being able to call it in quick succession can be useful for some key bindings. For example. I was trying to setup the following keybinds to cycle through my current floating terminals:
```lua
local function get_term_index(current_id, terms)
local idx
for i, v in ipairs(terms) do
if v.id == current_id then
idx = i
end
end
return idx
end

local function go_prev_term()
local current_id = vim.b.toggle_number
if current_id == nil then
return
end

local terms = require("toggleterm.terminal").get_all(true)
local prev_index

local index = get_term_index(current_id, terms)
if index > 1 then
prev_index = index - 1
else
prev_index = #terms
end
require("toggleterm").toggle(index)
require("toggleterm").toggle(prev_index)
end

local function go_next_term()
local current_id = vim.b.toggle_number
if current_id == nil then
return
end

local terms = require("toggleterm.terminal").get_all(true)
local next_index

local index = get_term_index(current_id, terms)
if index == #terms then
next_index = 1
else
next_index = index + 1
end
require("toggleterm").toggle(index)
require("toggleterm").toggle(next_index)
end

vim.keymap.set({ "n", "t" }, "", function()
go_next_term()
end, { desc = "Toggle term" })

vim.keymap.set({ "n", "t" }, "", function()
go_prev_term()
end, { desc = "Toggle term" })
```

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.