local M = {} --- Setup and configure toggleterm.nvim -- This function initializes and configures the toggleterm plugin for terminal management -- @return boolean True if setup was successful, false otherwise function M.setup() local ok, toggleterm = pcall(require, 'toggleterm') if not ok or not toggleterm then return false end toggleterm.setup({ --open_mapping = [[tt]], autochdir = true, hide_numbers = true, shade_filetypes = {}, shade_terminals = false, --shading_factor = 1, start_in_insert = true, insert_mappings = true, terminal_mappings = true, persist_size = true, direction = 'float', --direction = "vertical", --direction = "horizontal", close_on_exit = true, shell = vim.o.shell, highlights = { -- highlights which map to a highlight group name and a table of it's values -- NOTE: this is only a subset of values, any group placed here will be set for the terminal window split --Normal = { -- background = "#000000", --}, --Normal = { guibg = 'Black', guifg = 'White' }, --FloatBorder = { guibg = 'Black', guifg = 'DarkGray' }, --NormalFloat = { guibg = 'Black' }, float_opts = { --winblend = 3, }, }, size = function(term) if term.direction == 'horizontal' then return 7 elseif term.direction == 'vertical' then return math.floor(vim.o.columns * 0.4) end end, float_opts = { width = 70, height = 15, border = 'curved', highlights = { border = 'Normal', --background = 'Normal', }, --winblend = 0, }, }) -- Set up keymaps for toggleterm local Terminal = require('toggleterm.terminal').Terminal -- Custom terminal commands local lazygit if not Terminal then return end local term = Terminal:new({ cmd = 'lazygit', dir = 'git_dir', direction = 'float', float_opts = { border = 'curved', }, on_open = function(term) vim.cmd('startinsert!') vim.api.nvim_buf_set_keymap(term.bufnr, 'n', 'q', 'close', {noremap = true, silent = true}) end, }) if term then lazygit = term end -- Toggle functions local function _lazygit_toggle() if not Terminal then return end if not lazygit then init_lazygit() end if lazygit then pcall(lazygit.toggle, lazygit) end end -- Set up keymaps vim.keymap.set('n', 'tt', 'ToggleTerm', {noremap = true, silent = true, desc = 'Toggle Terminal'}) vim.keymap.set('n', 'tf', 'ToggleTerm direction=float', {noremap = true, silent = true, desc = 'Toggle Float Terminal'}) vim.keymap.set('n', 'th', 'ToggleTerm size=10 direction=horizontal', {noremap = true, silent = true, desc = 'Toggle Horizontal Terminal'}) vim.keymap.set('n', 'tv', 'ToggleTerm size=80 direction=vertical', {noremap = true, silent = true, desc = 'Toggle Vertical Terminal'}) vim.keymap.set('n', 'tl', _lazygit_toggle, {noremap = true, silent = true, desc = 'Toggle Lazygit'}) -- Terminal mode mappings vim.keymap.set('t', '', [[]], {noremap = true, silent = true}) vim.keymap.set('t', 'jk', [[]], {noremap = true, silent = true}) vim.keymap.set('t', '', [[wincmd h]], {noremap = true, silent = true}) vim.keymap.set('t', '', [[wincmd j]], {noremap = true, silent = true}) vim.keymap.set('t', '', [[wincmd k]], {noremap = true, silent = true}) vim.keymap.set('t', '', [[wincmd l]], {noremap = true, silent = true}) return true end -- Terminal utility functions local mods = {} -- Simple empty check function if mods.empty is not available function mods.empty(v) return v == nil or v == '' end local float_handler = function(term) if not mods.empty(vim.fn.mapcheck('jk', 't')) then vim.keymap.del('t', 'jk', { buffer = term.bufnr }) vim.keymap.del('t', '', { buffer = term.bufnr }) end end function _G.set_terminal_keymaps() local opts = { noremap = true } --local opts = {buffer = 0} --vim.api.nvim_buf_set_keymap(0, "i", ";to", "[[]]Toggleterm", opts) vim.api.nvim_buf_set_keymap(0, 't', '', [[]], opts) vim.api.nvim_buf_set_keymap(0, 't', '', [[]], opts) vim.api.nvim_buf_set_keymap(0, 't', 'jk', [[]], opts) vim.api.nvim_buf_set_keymap(0, 't', '', [[h]], opts) vim.api.nvim_buf_set_keymap(0, 't', '', [[j]], opts) vim.api.nvim_buf_set_keymap(0, 't', '', [[k]], opts) vim.api.nvim_buf_set_keymap(0, 't', '', [[l]], opts) end -- if you only want these mappings for toggle term use term://*toggleterm#* instead vim.cmd('autocmd! TermOpen term://* lua set_terminal_keymaps()') local Terminal local horizontal_term, vertical_term -- Safely require toggleterm.terminal local toggleterm_ok, toggleterm = pcall(require, 'toggleterm.terminal') if toggleterm_ok and toggleterm and toggleterm.Terminal then Terminal = toggleterm.Terminal -- Initialize terminals only if Terminal is available if Terminal then local ok1, hterm = pcall(Terminal.new, Terminal, { hidden = true, direction = 'horizontal' }) local ok2, vterm = pcall(Terminal.new, Terminal, { hidden = true, direction = 'vertical' }) if ok1 then horizontal_term = hterm end if ok2 then vertical_term = vterm end end end function Horizontal_term_toggle() if horizontal_term then pcall(horizontal_term.toggle, horizontal_term, 8, 'horizontal') end end function Vertical_term_toggle() if vertical_term then pcall(vertical_term.toggle, vertical_term, math.floor(vim.o.columns * 0.5), 'vertical') end end -- Initialize lazygit terminal instance local lazygit = nil local Cur_cwd = vim.fn.getcwd() -- Function to initialize lazygit terminal local function init_lazygit() if not Terminal then return nil end if not lazygit then local ok, term = pcall(function() return Terminal:new({ cmd = 'lazygit', count = 5, id = 1000, dir = 'git_dir', direction = 'float', on_open = float_handler, hidden = true, float_opts = { border = { '╒', '═', '╕', '│', '╛', '═', '╘', '│' }, width = 150, height = 40, }, }) end) if ok and term then lazygit = term end end return lazygit end -- Initialize lazygit on first use function Lazygit_toggle() -- Initialize lazygit if not already done if not init_lazygit() then return end -- cwd is the root of project. if cwd is changed, change the git. local cwd = vim.fn.getcwd() if cwd ~= Cur_cwd then Cur_cwd = cwd if lazygit then lazygit:close() end lazygit = Terminal:new({ cmd = "zsh --login -c 'lazygit'", dir = 'git_dir', direction = 'float', hidden = true, on_open = float_handler, float_opts = { border = { '╒', '═', '╕', '│', '╛', '═', '╘', '│' }, width = 150, height = 40, }, }) end if lazygit then lazygit:toggle() else vim.notify("Failed to initialize lazygit terminal", vim.log.levels.ERROR) end end local node = nil local ncdu = nil -- Initialize node terminal if Terminal is available if Terminal then local ok1, nterm = pcall(function() return Terminal:new({ cmd = 'node', hidden = true }) end) local ok2, ncduterm = pcall(function() return Terminal:new({ cmd = 'ncdu', hidden = true }) end) if ok1 then node = nterm end if ok2 then ncdu = ncduterm end end function _NODE_TOGGLE() if not node then return end pcall(node.toggle, node) end function _NCDU_TOGGLE() if not ncdu then return end pcall(ncdu.toggle, ncdu) end local htop = nil function _HTOP_TOGGLE() if not Terminal then return end if not htop then local ok, term = pcall(function() return Terminal:new({ cmd = 'htop', hidden = true }) end) if ok then htop = term end end if htop then pcall(htop.toggle, htop) end end local python = nil function _PYTHON_TOGGLE() if not Terminal then return end if not python then local ok, term = pcall(function() return Terminal:new({ cmd = 'python', hidden = true }) end) if ok then python = term end end if python then pcall(python.toggle, python) end end function Gh_dash() Terminal:new({ cmd = 'gh dash', hidden = true, direction = 'float', on_open = float_handler, float_opts = { height = function() return math.floor(vim.o.lines * 0.8) end, width = function() return math.floor(vim.o.columns * 0.95) end, }, }) Gh_dash:toggle() end