diff --git a/init.lua b/init.lua index 8090243d..e73829dd 100644 --- a/init.lua +++ b/init.lua @@ -102,7 +102,7 @@ vim.g.have_nerd_font = true vim.o.number = true -- You can also add relative line numbers, to help with jumping. -- 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! vim.o.mouse = 'a' @@ -298,7 +298,7 @@ require('lazy').setup({ -- Then, because we use the `opts` key (recommended), the configuration runs -- after the plugin has been loaded as `require(MODULE).setup(opts)`. - { -- Useful plugin to show you pending keybinds. + { -- Useful plugin to show you pending keybinds. 'folke/which-key.nvim', event = 'VimEnter', -- Sets the loading event to 'VimEnter' opts = { @@ -379,7 +379,7 @@ require('lazy').setup({ { 'nvim-telescope/telescope-ui-select.nvim' }, -- Useful for getting pretty icons, but requires a Nerd Font. - { 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font }, + { 'nvim-tree/nvim-web-devicons', enabled = vim.g.have_nerd_font }, }, config = function() -- Telescope is a fuzzy finder that comes with a lot of different things that @@ -487,7 +487,7 @@ require('lazy').setup({ 'WhoIsSethDaniel/mason-tool-installer.nvim', -- Useful status updates for LSP. - { 'j-hui/fidget.nvim', opts = {} }, + { 'j-hui/fidget.nvim', opts = {} }, -- Allows extra capabilities provided by blink.cmp 'saghen/blink.cmp', @@ -931,7 +931,7 @@ require('lazy').setup({ -- cursor location to LINE:COLUMN ---@diagnostic disable-next-line: duplicate-set-field statusline.section_location = function() - return '%2l:%-2v' + return '%2l:%-2v %P' end -- ... and there is more! @@ -984,7 +984,7 @@ require('lazy').setup({ -- 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. - -- { import = 'custom.plugins' }, + { import = 'custom.plugins' }, -- -- For additional information with loading, sourcing and examples see `:help lazy.nvim-🔌-plugin-spec` -- Or use telescope! diff --git a/lazy-lock.json b/lazy-lock.json index 420677f1..0133912a 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -1,24 +1,25 @@ { "LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" }, - "blink.cmp": { "branch": "main", "commit": "bae4bae0eedd1fa55f34b685862e94a222d5c6f8" }, - "conform.nvim": { "branch": "master", "commit": "973f3cb73887d510321653044791d7937c7ec0fa" }, - "fidget.nvim": { "branch": "main", "commit": "4ec7bed6c86b671ddde03ca1b227343cfa3e65fa" }, - "gitsigns.nvim": { "branch": "main", "commit": "736f51d2bb684c06f39a2032f064d7244f549981" }, + "blink.cmp": { "branch": "main", "commit": "327fff91fe6af358e990be7be1ec8b78037d2138" }, + "conform.nvim": { "branch": "master", "commit": "235dd79731c1dc51ec04abb4045cbc54727a172a" }, + "fidget.nvim": { "branch": "main", "commit": "3f5475949679953af6d78654db29b944fa826e6a" }, + "gitsigns.nvim": { "branch": "main", "commit": "20ad4419564d6e22b189f6738116b38871082332" }, "guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" }, - "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, - "lazydev.nvim": { "branch": "main", "commit": "2367a6c0a01eb9edb0464731cc0fb61ed9ab9d2c" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "844d247d998c2f9a6a3baad8bb9748edc55ce69f" }, + "lazy.nvim": { "branch": "main", "commit": "1ea3c4085785f460fb0e46d2fe1ee895f5f9e7c1" }, + "lazydev.nvim": { "branch": "main", "commit": "e28ce52fc7ff79fcb76f0e79ee6fb6182fca90b9" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "2304ff65ecc8cb2afc2484de3e2ed9a407edf0b9" }, "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, - "mason.nvim": { "branch": "main", "commit": "9e25c98d4826998460926f8c5c2284848d80ae89" }, - "mini.nvim": { "branch": "main", "commit": "03387f53f1cb8c6a8ba0798041c6aa3525ed11ba" }, - "nvim-lspconfig": { "branch": "master", "commit": "63a38440989c58e1f100373ab603fd24665bdc9a" }, + "mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" }, + "mini.nvim": { "branch": "main", "commit": "14145d3769eacdb48aa1cfd21f1e244896a85f68" }, + "nvim-lspconfig": { "branch": "master", "commit": "e5c61b02f33b5c6538be25b2696b33b4cc91e667" }, "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" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "1f08ed60cafc8f6168b72b80be2b2ea149813e55" }, "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, "telescope.nvim": { "branch": "master", "commit": "b4da76be54691e854d3e0e02c36b0245f945c2c7" }, - "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" }, - "tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" }, - "which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" } + "todo-comments.nvim": { "branch": "main", "commit": "19d461ddd543e938eb22505fb03fa878800270b6" }, + "toggleterm.nvim": { "branch": "main", "commit": "50ea089fc548917cc3cc16b46a8211833b9e3c7c" }, + "tokyonight.nvim": { "branch": "main", "commit": "e63c42a42b11cd6225f009dd949b9ee0fccc15ef" }, + "which-key.nvim": { "branch": "main", "commit": "b4177e3eaf15fe5eb8357ebac2286d488be1ed00" } } diff --git a/lua/custom/plugins/README.md b/lua/custom/plugins/README.md new file mode 100644 index 00000000..51887fd3 --- /dev/null +++ b/lua/custom/plugins/README.md @@ -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 (`` or `tf`). +- Dedicated splits: `th` (horizontal) and `tv` (vertical). +- Terminal picker `tt`, plus a pre-configured floating `lazygit` on `tg`. +- Send code to the primary terminal with `ts` (line or visual selection). +- Terminal windows inherit familiar navigation (``, `jk`, ``) 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. diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua index be0eb9d8..4874b87c 100644 --- a/lua/custom/plugins/init.lua +++ b/lua/custom/plugins/init.lua @@ -2,4 +2,8 @@ -- I promise not to create any merge conflicts in this directory :) -- -- See the kickstart.nvim README for more information -return {} +local plugins = {} + +vim.list_extend(plugins, require('custom.plugins.toggleterm')) + +return plugins diff --git a/lua/custom/plugins/toggleterm.lua b/lua/custom/plugins/toggleterm.lua new file mode 100644 index 00000000..044d8c4c --- /dev/null +++ b/lua/custom/plugins/toggleterm.lua @@ -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 = { [[]] }, + 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 tg', vim.log.levels.WARN) + end + + local map = vim.keymap.set + + map({ 'n', 'i', 't' }, '', toggle_float, { desc = 'Toggle floating terminal' }) + map('n', 'tf', toggle_float, { desc = '[T]erminal float' }) + map('n', 'th', toggle_horizontal, { desc = '[T]erminal horizontal' }) + map('n', 'tv', toggle_vertical, { desc = '[T]erminal vertical' }) + map('n', 'tt', 'TermSelect', { desc = '[T]erminal picker' }) + map('n', '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', 'ts', function() + vim.cmd.ToggleTermSendCurrentLine(TERM_FLOAT) + end, { desc = '[T]erminal [s]end line' }) + + map('v', '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', '', [[]], term_opts) + vim.keymap.set('t', 'jk', [[]], term_opts) + vim.keymap.set('t', '', [[wincmd h]], term_opts) + vim.keymap.set('t', '', [[wincmd j]], term_opts) + vim.keymap.set('t', '', [[wincmd k]], term_opts) + vim.keymap.set('t', '', [[wincmd l]], term_opts) + end, + }) + end, + }, +}