From 966d12ac730c83da90d60ab24eae539b2ea69441 Mon Sep 17 00:00:00 2001 From: srdusr Date: Wed, 24 Sep 2025 00:14:04 +0200 Subject: Update/Overhaul --- lua/plugins/toggleterm.lua | 217 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 166 insertions(+), 51 deletions(-) mode change 100644 => 100755 lua/plugins/toggleterm.lua (limited to 'lua/plugins/toggleterm.lua') diff --git a/lua/plugins/toggleterm.lua b/lua/plugins/toggleterm.lua old mode 100644 new mode 100755 index e67bdec..6b7aad5 --- a/lua/plugins/toggleterm.lua +++ b/lua/plugins/toggleterm.lua @@ -1,8 +1,15 @@ -local status_ok, toggleterm = pcall(require, 'toggleterm') -if not status_ok then - return -end -toggleterm.setup({ +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, @@ -47,9 +54,67 @@ toggleterm.setup({ --background = 'Normal', }, --winblend = 0, - }, -}) -local mods = require('user.mods') + }, + }) + + -- 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 }) @@ -72,54 +137,77 @@ 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 = require('toggleterm.terminal').Terminal +local Terminal +local horizontal_term, vertical_term -local horizontal_term = Terminal:new({ hidden = true, direction = 'horizontal' }) -local vertical_term = Terminal:new({ hidden = true, direction = 'vertical' }) +-- 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() - horizontal_term:toggle(8, 'horizontal') + if horizontal_term then + pcall(horizontal_term.toggle, horizontal_term, 8, 'horizontal') + end end function Vertical_term_toggle() - horizontal_term:toggle(math.floor(vim.o.columns * 0.5), 'vertical') + if vertical_term then + pcall(vertical_term.toggle, vertical_term, math.floor(vim.o.columns * 0.5), 'vertical') + end end -local lazygit = 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, - }, +-- Initialize lazygit terminal instance +local lazygit = nil +local Cur_cwd = vim.fn.getcwd() - ---- Function to run on opening the terminal - --on_open = function(term) - -- vim.api.nvim_buf_set_keymap(term.bufnr, 'n', 'q', 'close', - -- {noremap = true, silent = true}) - -- vim.api.nvim_buf_set_keymap(term.bufnr, 'n', '', 'close', - -- {noremap = true, silent = true}) - -- vim.api.nvim_buf_set_keymap(term.bufnr, 'n', '', 'close', - -- {noremap = true, silent = true}) - --end, - ---- Function to run on closing the terminal - --on_close = function(term) - -- vim.cmd("startinsert!") - --end -}) +-- 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 - lazygit:close() + if lazygit then + lazygit:close() + end lazygit = Terminal:new({ cmd = "zsh --login -c 'lazygit'", dir = 'git_dir', @@ -133,31 +221,58 @@ function Lazygit_toggle() }, }) end - lazygit:toggle() + if lazygit then + lazygit:toggle() + else + vim.notify("Failed to initialize lazygit terminal", vim.log.levels.ERROR) + end end -local node = Terminal:new({ cmd = 'node', hidden = true }) +local node = nil +local ncdu = nil -function _NODE_TOGGLE() - node:toggle() +-- 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 -local ncdu = Terminal:new({ cmd = 'ncdu', hidden = true }) +function _NODE_TOGGLE() + if not node then return end + pcall(node.toggle, node) +end function _NCDU_TOGGLE() - ncdu:toggle() + if not ncdu then return end + pcall(ncdu.toggle, ncdu) end -local htop = Terminal:new({ cmd = 'htop', hidden = true }) +local htop = nil function _HTOP_TOGGLE() - 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 = Terminal:new({ cmd = 'python', hidden = true }) +local python = nil function _PYTHON_TOGGLE() - 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() -- cgit v1.2.3