diff --git a/.gitignore b/.gitignore index 005b535b606..a074298234b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ test.sh nvim spell/ -lazy-lock.json + +.DS_Store diff --git a/init.lua b/init.lua index b98ffc6198a..e73829ddef7 100644 --- a/init.lua +++ b/init.lua @@ -91,7 +91,7 @@ vim.g.mapleader = ' ' vim.g.maplocalleader = ' ' -- Set to true if you have a Nerd Font installed and selected in the terminal -vim.g.have_nerd_font = false +vim.g.have_nerd_font = true -- [[ Setting options ]] -- See `:help vim.o` @@ -102,7 +102,7 @@ vim.g.have_nerd_font = false 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 new file mode 100644 index 00000000000..d708be6ad35 --- /dev/null +++ b/lazy-lock.json @@ -0,0 +1,26 @@ +{ + "LuaSnip": { "branch": "master", "commit": "458560534a73f7f8d7a11a146c801db00b081df0" }, + "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": "1ea3c4085785f460fb0e46d2fe1ee895f5f9e7c1" }, + "lazydev.nvim": { "branch": "main", "commit": "e28ce52fc7ff79fcb76f0e79ee6fb6182fca90b9" }, + "lazygit.nvim": { "branch": "main", "commit": "2305deed25bc61b866d5d39189e9105a45cf1cfb" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "2304ff65ecc8cb2afc2484de3e2ed9a407edf0b9" }, + "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, + "mason.nvim": { "branch": "main", "commit": "ad7146aa61dcaeb54fa900144d768f040090bff0" }, + "mini.nvim": { "branch": "main", "commit": "cf32454e91b3d963a12fef0314811fb035b62d49" }, + "nvim-lspconfig": { "branch": "master", "commit": "e5c61b02f33b5c6538be25b2696b33b4cc91e667" }, + "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, + "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": "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 00000000000..211e4597cb5 --- /dev/null +++ b/lua/custom/plugins/README.md @@ -0,0 +1,35 @@ +# Custom Plugins Setup + +## ToggleTerm + +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` to switch between multiple terminals. +- 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. + +## LazyGit + +Enhanced git interface using `lua/custom/plugins/lazygit.lua`. + +### Highlights +- Fast, native lazygit integration with no keyboard shortcut conflicts +- Opens in a proper floating window (95% of screen size) +- Fully functional with all lazygit features and keybindings +- Use `gg` to open lazygit in current repo +- Use `gf` to open lazygit focused on current file history + +### Why Not ToggleTerm? +LazyGit.nvim is used instead of toggleterm for lazygit because: +- Better performance (uses native terminal, not Neovim's terminal emulator) +- No keyboard shortcut conflicts (q, Esc, etc. work as expected) +- Designed specifically for lazygit integration +- Supports editing commit messages in Neovim diff --git a/lua/custom/plugins/init.lua b/lua/custom/plugins/init.lua index be0eb9d8d7a..e0888915b3b 100644 --- a/lua/custom/plugins/init.lua +++ b/lua/custom/plugins/init.lua @@ -2,4 +2,9 @@ -- 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')) +vim.list_extend(plugins, require('custom.plugins.lazygit')) + +return plugins diff --git a/lua/custom/plugins/lazygit.lua b/lua/custom/plugins/lazygit.lua new file mode 100644 index 00000000000..9ec9d4cb038 --- /dev/null +++ b/lua/custom/plugins/lazygit.lua @@ -0,0 +1,26 @@ +-- LazyGit integration using dedicated plugin for better performance and keybind handling +return { + { + 'kdheepak/lazygit.nvim', + cmd = { + 'LazyGit', + 'LazyGitConfig', + 'LazyGitCurrentFile', + 'LazyGitFilter', + 'LazyGitFilterCurrentFile', + }, + dependencies = { + 'nvim-lua/plenary.nvim', + }, + keys = { + { 'gg', 'LazyGit', desc = 'LazyGit' }, + { 'gf', 'LazyGitCurrentFile', desc = 'LazyGit Current File' }, + }, + config = function() + vim.g.lazygit_floating_window_winblend = 0 -- transparency of floating window + vim.g.lazygit_floating_window_scaling_factor = 0.95 -- scaling factor for floating window + vim.g.lazygit_floating_window_border_chars = { '╭', '─', '╮', '│', '╯', '─', '╰', '│' } -- customize border + vim.g.lazygit_use_neovim_remote = 1 -- Use neovim remote for editing commit messages + end, + }, +} diff --git a/lua/custom/plugins/toggleterm.lua b/lua/custom/plugins/toggleterm.lua new file mode 100644 index 00000000000..223f1c0ffa1 --- /dev/null +++ b/lua/custom/plugins/toggleterm.lua @@ -0,0 +1,104 @@ +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 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 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', '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, + }, +}