aboutsummaryrefslogtreecommitdiff
path: root/lua/plugins/toggleterm.lua
diff options
context:
space:
mode:
authorsrdusr <trevorgray@srdusr.com>2025-09-24 04:19:28 +0200
committersrdusr <trevorgray@srdusr.com>2025-09-24 04:19:28 +0200
commit7ed2303648bf83bb081d9bd863660ebf2344ce47 (patch)
tree702f5f832796b572d0faee31c0eb15507e91f49a /lua/plugins/toggleterm.lua
parent2a8020a2e9b7ef2ee77ddee14892127a4eb95187 (diff)
downloaddotfiles-7ed2303648bf83bb081d9bd863660ebf2344ce47.tar.gz
dotfiles-7ed2303648bf83bb081d9bd863660ebf2344ce47.zip
Squashed 'common/config/nvim/' changes from 2a8020a..966d12a
966d12a Update/Overhaul git-subtree-dir: common/config/nvim git-subtree-split: 966d12ac730c83da90d60ab24eae539b2ea69441
Diffstat (limited to 'lua/plugins/toggleterm.lua')
-rwxr-xr-x[-rw-r--r--]lua/plugins/toggleterm.lua217
1 files changed, 166 insertions, 51 deletions
diff --git a/lua/plugins/toggleterm.lua b/lua/plugins/toggleterm.lua
index e67bdec..6b7aad5 100644..100755
--- 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 = [[<leader>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', '<cmd>close<CR>', {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', '<leader>tt', '<cmd>ToggleTerm<CR>', {noremap = true, silent = true, desc = 'Toggle Terminal'})
+ vim.keymap.set('n', '<leader>tf', '<cmd>ToggleTerm direction=float<CR>', {noremap = true, silent = true, desc = 'Toggle Float Terminal'})
+ vim.keymap.set('n', '<leader>th', '<cmd>ToggleTerm size=10 direction=horizontal<CR>', {noremap = true, silent = true, desc = 'Toggle Horizontal Terminal'})
+ vim.keymap.set('n', '<leader>tv', '<cmd>ToggleTerm size=80 direction=vertical<CR>', {noremap = true, silent = true, desc = 'Toggle Vertical Terminal'})
+ vim.keymap.set('n', '<leader>tl', _lazygit_toggle, {noremap = true, silent = true, desc = 'Toggle Lazygit'})
+
+ -- Terminal mode mappings
+ vim.keymap.set('t', '<esc>', [[<C-\><C-n>]], {noremap = true, silent = true})
+ vim.keymap.set('t', 'jk', [[<C-\><C-n>]], {noremap = true, silent = true})
+ vim.keymap.set('t', '<C-h>', [[<Cmd>wincmd h<CR>]], {noremap = true, silent = true})
+ vim.keymap.set('t', '<C-j>', [[<Cmd>wincmd j<CR>]], {noremap = true, silent = true})
+ vim.keymap.set('t', '<C-k>', [[<Cmd>wincmd k<CR>]], {noremap = true, silent = true})
+ vim.keymap.set('t', '<C-l>', [[<Cmd>wincmd l<CR>]], {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', '<cmd>close<CR>',
- -- {noremap = true, silent = true})
- -- vim.api.nvim_buf_set_keymap(term.bufnr, 'n', '<esc>', '<cmd>close<CR>',
- -- {noremap = true, silent = true})
- -- vim.api.nvim_buf_set_keymap(term.bufnr, 'n', '<C-\\>', '<cmd>close<CR>',
- -- {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()