dotfiles/nvim/.config/nvim/lua/modules/terminal.lua
Marty Oehme 4b720464ff
nvim: Add floating terminal toggle mapping
Follows logic of other toggle maps for neovim, i.e. <leader>tt for
buffer-term and <leader>tT for floating term.
2025-12-12 09:50:39 +01:00

85 lines
3 KiB
Lua

return { -- simple programmable terminal toggling for nvim
{
"akinsho/nvim-toggleterm.lua",
init = function(_)
if require("core.util").is_available("which-key") then
require("which-key").add({ "<leader>t", group = "terminal" })
end
end,
config = function()
require("toggleterm").setup({
open_mapping = [[<leader>tt]],
insert_mappings = false, -- don't map the key in insert mode
terminal_mappings = false,
})
local Terminal = require("toggleterm.terminal").Terminal
local function custom_term_set_toggle_key(term)
vim.keymap.set("t", "<C-\\>", function()
term:toggle()
end, { silent = true, buffer = true, desc = "terminal" })
end
local custom_term_default_style = function(cmd)
return {
cmd = cmd,
hidden = true,
direction = "float",
float_opts = { border = "curved" },
on_open = custom_term_set_toggle_key,
}
end
local terms = {
lazygit = Terminal:new(custom_term_default_style("lazygit")),
python = Terminal:new(custom_term_default_style(function()
for _, exec in pairs({ "py", "ptipython", "ipython", "ptpython", "python" }) do
if vim.fn.executable(exec) > 0 then
return exec
end
end
end)),
euporie = Terminal:new(custom_term_default_style(function()
local kernel = vim.b.sessionfile
if kernel then
return "euporie-console --connection-file '" .. kernel .. "'"
end
return "euporie-console"
end)),
}
-- have user decide between floating or split
local function toggle_split_or_float(term, bang, vertsize)
vertsize = vertsize or vim.o.columns * 0.4
if not bang then
term.direction = "float"
term:toggle()
else
term.direction = "vertical"
term:resize(vertsize)
term:toggle()
end
end
vim.api.nvim_create_user_command("Lazygit", function(opts)
toggle_split_or_float(terms.lazygit, opts.bang, vim.o.columns * 0.6)
end, { desc = "Toggle floating Lazygit terminal", bang = true })
vim.api.nvim_create_user_command("Pythonterm", function(opts)
toggle_split_or_float(terms.python, opts.bang)
end, { desc = "Toggle floating Python terminal", bang = true })
vim.api.nvim_create_user_command("Euporieterm", function(opts)
toggle_split_or_float(terms.euporie, opts.bang)
end, { desc = "Toggle floating Euporie terminal", bang = true })
end,
cmd = { "ToggleTerm", "TermExec", "Lazygit", "Pythonterm", "Euporieterm" },
keys = {
{ "<leader>tt", ":ToggleTerm<cr>", desc = "terminal buffer" },
{ "<leader>tT", ":ToggleTerm direction='float'<cr>", desc = "terminal floating" },
{ "<leader>tg", ":Lazygit<cr>", desc = "git floating" },
{ "<leader>tG", ":Lazygit!<cr>", desc = "git buffer" },
{ "<leader>tp", ":Pythonterm<cr>", desc = "python floating" },
{ "<leader>tP", ":Pythonterm!<cr>", desc = "python buffer" },
{ "<leader>te", ":Euporieterm<cr>", desc = "euporie floating" },
{ "<leader>tE", ":Euporieterm!<cr>", desc = "euporie buffer" },
},
},
}