toggleterm

This commit is contained in:
Ruslan Matveev 2025-10-20 21:37:09 -04:00
parent 7810e2af8d
commit 27105b9f60
5 changed files with 169 additions and 21 deletions

View File

@ -102,7 +102,7 @@ vim.g.have_nerd_font = true
vim.o.number = true vim.o.number = true
-- You can also add relative line numbers, to help with jumping. -- You can also add relative line numbers, to help with jumping.
-- Experiment for yourself to see if you like it! -- Experiment for yourself to see if you like it!
-- vim.o.relativenumber = true vim.o.relativenumber = true
-- Enable mouse mode, can be useful for resizing splits for example! -- Enable mouse mode, can be useful for resizing splits for example!
vim.o.mouse = 'a' vim.o.mouse = 'a'
@ -931,7 +931,7 @@ require('lazy').setup({
-- cursor location to LINE:COLUMN -- cursor location to LINE:COLUMN
---@diagnostic disable-next-line: duplicate-set-field ---@diagnostic disable-next-line: duplicate-set-field
statusline.section_location = function() statusline.section_location = function()
return '%2l:%-2v' return '%2l:%-2v %P'
end end
-- ... and there is more! -- ... and there is more!
@ -984,7 +984,7 @@ require('lazy').setup({
-- This is the easiest way to modularize your config. -- This is the easiest way to modularize your config.
-- --
-- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going.
-- { import = 'custom.plugins' }, { import = 'custom.plugins' },
-- --
-- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec` -- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec`
-- Or use telescope! -- Or use telescope!

View File

@ -1,24 +1,25 @@
{ {
"LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" }, "LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" },
"blink.cmp": { "branch": "main", "commit": "bae4bae0eedd1fa55f34b685862e94a222d5c6f8" }, "blink.cmp": { "branch": "main", "commit": "327fff91fe6af358e990be7be1ec8b78037d2138" },
"conform.nvim": { "branch": "master", "commit": "973f3cb73887d510321653044791d7937c7ec0fa" }, "conform.nvim": { "branch": "master", "commit": "235dd79731c1dc51ec04abb4045cbc54727a172a" },
"fidget.nvim": { "branch": "main", "commit": "4ec7bed6c86b671ddde03ca1b227343cfa3e65fa" }, "fidget.nvim": { "branch": "main", "commit": "3f5475949679953af6d78654db29b944fa826e6a" },
"gitsigns.nvim": { "branch": "main", "commit": "736f51d2bb684c06f39a2032f064d7244f549981" }, "gitsigns.nvim": { "branch": "main", "commit": "20ad4419564d6e22b189f6738116b38871082332" },
"guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" }, "guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" },
"lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, "lazy.nvim": { "branch": "main", "commit": "1ea3c4085785f460fb0e46d2fe1ee895f5f9e7c1" },
"lazydev.nvim": { "branch": "main", "commit": "2367a6c0a01eb9edb0464731cc0fb61ed9ab9d2c" }, "lazydev.nvim": { "branch": "main", "commit": "e28ce52fc7ff79fcb76f0e79ee6fb6182fca90b9" },
"mason-lspconfig.nvim": { "branch": "main", "commit": "844d247d998c2f9a6a3baad8bb9748edc55ce69f" }, "mason-lspconfig.nvim": { "branch": "main", "commit": "2304ff65ecc8cb2afc2484de3e2ed9a407edf0b9" },
"mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" },
"mason.nvim": { "branch": "main", "commit": "9e25c98d4826998460926f8c5c2284848d80ae89" }, "mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" },
"mini.nvim": { "branch": "main", "commit": "03387f53f1cb8c6a8ba0798041c6aa3525ed11ba" }, "mini.nvim": { "branch": "main", "commit": "14145d3769eacdb48aa1cfd21f1e244896a85f68" },
"nvim-lspconfig": { "branch": "master", "commit": "63a38440989c58e1f100373ab603fd24665bdc9a" }, "nvim-lspconfig": { "branch": "master", "commit": "e5c61b02f33b5c6538be25b2696b33b4cc91e667" },
"nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" },
"nvim-web-devicons": { "branch": "master", "commit": "3362099de3368aa620a8105b19ed04c2053e38c0" }, "nvim-web-devicons": { "branch": "master", "commit": "b8221e42cf7287c4dcde81f232f58d7b947c210d" },
"plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" },
"telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" },
"telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" },
"telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" }, "telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" },
"todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" }, "todo-comments.nvim": { "branch": "main", "commit": "19d461ddd543e938eb22505fb03fa878800270b6" },
"tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" }, "toggleterm.nvim": { "branch": "main", "commit": "50ea089fc548917cc3cc16b46a8211833b9e3c7c" },
"which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" } "tokyonight.nvim": { "branch": "main", "commit": "e63c42a42b11cd6225f009dd949b9ee0fccc15ef" },
"which-key.nvim": { "branch": "main", "commit": "b4177e3eaf15fe5eb8357ebac2286d488be1ed00" }
} }

View File

@ -0,0 +1,15 @@
# Custom ToggleTerm Setup
Quick notes on the terminal experience provided by `lua/custom/plugins/toggleterm.lua`.
## Highlights
- Floating terminals sized responsively to the current UI (`<C-\>` or `<leader>tf`).
- Dedicated splits: `<leader>th` (horizontal) and `<leader>tv` (vertical).
- Terminal picker `<leader>tt`, plus a pre-configured floating `lazygit` on `<leader>tg`.
- Send code to the primary terminal with `<leader>ts` (line or visual selection).
- Terminal windows inherit familiar navigation (`<Esc>`, `jk`, `<C-hjkl>`) automatically.
## Tips
- Use counts (`2ToggleTerm`, `3ToggleTerm`) when you want to retarget a specific layout.
- `TermExec cmd="npm run test"` reuses the floating terminal without stealing focus.
- Update sizing or borders in `float_opts` if your display or font spacing demands it.

View File

@ -2,4 +2,8 @@
-- I promise not to create any merge conflicts in this directory :) -- I promise not to create any merge conflicts in this directory :)
-- --
-- See the kickstart.nvim README for more information -- See the kickstart.nvim README for more information
return {} local plugins = {}
vim.list_extend(plugins, require('custom.plugins.toggleterm'))
return plugins

View File

@ -0,0 +1,128 @@
local function clamp(value, min_value, max_value)
assert(min_value <= max_value, 'min_value must be <= max_value')
return math.max(min_value, math.min(value, max_value))
end
return {
{
'akinsho/toggleterm.nvim',
version = '*',
event = 'VeryLazy',
cmd = {
'ToggleTerm',
'ToggleTermToggleAll',
'TermExec',
'TermSelect',
'ToggleTermSendCurrentLine',
'ToggleTermSendVisualSelection',
},
opts = function()
return {
size = function(term)
if term.direction == 'horizontal' then
return clamp(math.floor(vim.o.lines * 0.28), 10, math.floor(vim.o.lines * 0.45))
elseif term.direction == 'vertical' then
return clamp(math.floor(vim.o.columns * 0.35), 40, math.floor(vim.o.columns * 0.6))
end
return 20
end,
open_mapping = { [[<C-\>]] },
shade_terminals = true,
shading_factor = -12,
start_in_insert = true,
insert_mappings = true,
terminal_mappings = true,
persist_size = true,
persist_mode = true,
direction = 'float',
close_on_exit = true,
auto_scroll = true,
float_opts = {
border = 'curved',
winblend = 0,
width = function()
return clamp(math.floor(vim.o.columns * 0.9), 80, vim.o.columns - 2)
end,
height = function()
return clamp(math.floor(vim.o.lines * 0.85), 20, vim.o.lines - 2)
end,
title_pos = 'center',
},
}
end,
config = function(_, opts)
local toggleterm = require('toggleterm')
toggleterm.setup(opts)
local TERM_FLOAT = 1
local TERM_HORIZONTAL = 2
local TERM_VERTICAL = 3
local TERM_LAZYGIT = 10
local function toggle_float()
toggleterm.toggle(TERM_FLOAT, nil, nil, 'float')
end
local function toggle_horizontal()
toggleterm.toggle(TERM_HORIZONTAL, nil, nil, 'horizontal')
end
local function toggle_vertical()
toggleterm.toggle(TERM_VERTICAL, nil, nil, 'vertical')
end
local lazygit = nil
if vim.fn.executable('lazygit') == 1 then
local Terminal = require('toggleterm.terminal').Terminal
lazygit = Terminal:new {
cmd = 'lazygit',
count = TERM_LAZYGIT,
direction = 'float',
hidden = true,
float_opts = {
border = 'curved',
},
}
else
vim.notify('lazygit not found in PATH. Install it to use <leader>tg', vim.log.levels.WARN)
end
local map = vim.keymap.set
map({ 'n', 'i', 't' }, '<C-`>', toggle_float, { desc = 'Toggle floating terminal' })
map('n', '<leader>tf', toggle_float, { desc = '[T]erminal float' })
map('n', '<leader>th', toggle_horizontal, { desc = '[T]erminal horizontal' })
map('n', '<leader>tv', toggle_vertical, { desc = '[T]erminal vertical' })
map('n', '<leader>tt', '<cmd>TermSelect<CR>', { desc = '[T]erminal picker' })
map('n', '<leader>tg', function()
if lazygit then
lazygit:toggle()
else
vim.notify('lazygit is not available', vim.log.levels.WARN)
end
end, { desc = '[T]erminal lazygit' })
map('n', '<leader>ts', function()
vim.cmd.ToggleTermSendCurrentLine(TERM_FLOAT)
end, { desc = '[T]erminal [s]end line' })
map('v', '<leader>ts', function()
vim.cmd.ToggleTermSendVisualSelection(TERM_FLOAT)
end, { desc = '[T]erminal [s]end selection' })
local term_augroup = vim.api.nvim_create_augroup('custom-toggleterm', { clear = true })
vim.api.nvim_create_autocmd('TermOpen', {
group = term_augroup,
pattern = 'term://*toggleterm#*',
callback = function()
local term_opts = { buffer = 0, silent = true }
vim.keymap.set('t', '<Esc>', [[<C-\><C-n>]], term_opts)
vim.keymap.set('t', 'jk', [[<C-\><C-n>]], term_opts)
vim.keymap.set('t', '<C-h>', [[<Cmd>wincmd h<CR>]], term_opts)
vim.keymap.set('t', '<C-j>', [[<Cmd>wincmd j<CR>]], term_opts)
vim.keymap.set('t', '<C-k>', [[<Cmd>wincmd k<CR>]], term_opts)
vim.keymap.set('t', '<C-l>', [[<Cmd>wincmd l<CR>]], term_opts)
end,
})
end,
},
}