From 9a03d0184446f4f3307a15e80260ca0646fe4272 Mon Sep 17 00:00:00 2001 From: ray Date: Sun, 7 Dec 2025 21:18:09 +0000 Subject: [PATCH] ux and editing plugins configured --- MIGRATION_PLAN.md | 24 +++++++------- README.md | 5 +++ lazy-lock.json | 8 ++++- lua/plugins/autopairs.lua | 33 +++++++++++++++++++ lua/plugins/indent-blankline.lua | 37 +++++++++++++++++++++ lua/plugins/surround.lua | 28 ++++++++++++++++ lua/plugins/ufo.lua | 56 ++++++++++++++++++++++++++++++++ lua/plugins/undotree.lua | 15 +++++++++ 8 files changed, 193 insertions(+), 13 deletions(-) create mode 100644 lua/plugins/autopairs.lua create mode 100644 lua/plugins/indent-blankline.lua create mode 100644 lua/plugins/surround.lua create mode 100644 lua/plugins/ufo.lua create mode 100644 lua/plugins/undotree.lua diff --git a/MIGRATION_PLAN.md b/MIGRATION_PLAN.md index bdfc3ee..2f0137a 100644 --- a/MIGRATION_PLAN.md +++ b/MIGRATION_PLAN.md @@ -204,26 +204,26 @@ Source of truth for the step-by-step rebuild. Keep this concise and up to date. - [x] Add keymaps if needed ## Phase 6.4 — Surround -- [ ] Add `kylechui/nvim-surround` -- [ ] Minimal config with default keymaps (ys, ds, cs) +- [x] Add `kylechui/nvim-surround` +- [x] Minimal config with default keymaps (ys, ds, cs) ## Phase 6.5 — Autopairs -- [ ] Add `windwp/nvim-autopairs` -- [ ] Integrate with nvim-cmp +- [x] Add `windwp/nvim-autopairs` +- [x] Integrate with nvim-cmp ## Phase 6.6 — Indent guides -- [ ] Add `lukas-reineke/indent-blankline.nvim` -- [ ] Configure scope highlighting +- [x] Add `lukas-reineke/indent-blankline.nvim` +- [x] Configure scope highlighting ## Phase 6.7 — Folding (UFO) -- [ ] Add `kevinhwang91/nvim-ufo` for folding -- [ ] Configure with Treesitter and LSP providers -- [ ] Add fold keymaps (za, zR, zM, etc.) +- [x] Add `kevinhwang91/nvim-ufo` for folding +- [x] Configure with Treesitter and LSP providers +- [x] Add fold keymaps (za, zR, zM, etc.) ## Phase 6.8 — Undotree -- [ ] Add `mbbill/undotree` -- [ ] Add keymap to toggle undotree -- [ ] Configure minimal settings +- [x] Add `mbbill/undotree` +- [x] Add keymap to toggle undotree +- [x] Configure minimal settings ## Phase 7 — Git, Markdown, Copilot, Formatting diff --git a/README.md b/README.md index 70e1cf0..46c4066 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,11 @@ Record every decision here with a short rationale. Append new entries; do not re - NO motion plugin (skip leap/flash for simplicity) - Undotree moved to separate phase (6.8) - Comment.nvim for commenting (gcc/gc/gbc/gb keymaps) + - nvim-surround for text objects (ys/ds/cs operators) + - nvim-autopairs for auto-closing brackets/quotes with Treesitter and cmp integration + - indent-blankline for visual indent guides with scope highlighting + - nvim-ufo for enhanced folding with Treesitter/LSP providers (zR/zM/K for peek) + - undotree for visual undo history (u to toggle) ## Project-Local Configuration (design) diff --git a/lazy-lock.json b/lazy-lock.json index 28a14b2..6cfa4ad 100644 --- a/lazy-lock.json +++ b/lazy-lock.json @@ -4,16 +4,22 @@ "cmp-buffer": { "branch": "main", "commit": "b74fab3656eea9de20a9b8116afa3cfc4ec09657" }, "cmp-nvim-lsp": { "branch": "main", "commit": "cbc7b02bb99fae35cb42f514762b89b5126651ef" }, "cmp-path": { "branch": "main", "commit": "c642487086dbd9a93160e1679a1327be111cbc25" }, + "indent-blankline.nvim": { "branch": "master", "commit": "005b56001b2cb30bfa61b7986bc50657816ba4ba" }, "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, "mason-lspconfig.nvim": { "branch": "main", "commit": "0b9bb925c000ae649ff7e7149c8cd00031f4b539" }, "mason.nvim": { "branch": "main", "commit": "57e5a8addb8c71fb063ee4acda466c7cf6ad2800" }, + "nvim-autopairs": { "branch": "master", "commit": "7a2c97cccd60abc559344042fefb1d5a85b3e33b" }, "nvim-cmp": { "branch": "main", "commit": "d97d85e01339f01b842e6ec1502f639b080cb0fc" }, "nvim-lspconfig": { "branch": "master", "commit": "9c923997123ff9071198ea3b594d4c1931fab169" }, + "nvim-surround": { "branch": "main", "commit": "fcfa7e02323d57bfacc3a141f8a74498e1522064" }, "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, "nvim-treesitter-textobjects": { "branch": "master", "commit": "5ca4aaa6efdcc59be46b95a3e876300cfead05ef" }, "nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" }, + "nvim-ufo": { "branch": "main", "commit": "72d54c31079d38d8dfc5456131b1d0fb5c0264b0" }, "oil.nvim": { "branch": "master", "commit": "cbcb3f997f6f261c577b943ec94e4ef55108dd95" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "promise-async": { "branch": "main", "commit": "119e8961014c9bfaf1487bf3c2a393d254f337e2" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" }, - "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" } + "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, + "undotree": { "branch": "master", "commit": "0f1c9816975b5d7f87d5003a19c53c6fd2ff6f7f" } } diff --git a/lua/plugins/autopairs.lua b/lua/plugins/autopairs.lua new file mode 100644 index 0000000..cc104e4 --- /dev/null +++ b/lua/plugins/autopairs.lua @@ -0,0 +1,33 @@ +-- Phase 6.5: nvim-autopairs for auto-closing brackets, quotes, etc. +return { + 'windwp/nvim-autopairs', + event = 'InsertEnter', + config = function() + local autopairs = require('nvim-autopairs') + + autopairs.setup({ + check_ts = true, -- Use treesitter to check for valid pair + ts_config = { + lua = { 'string' }, -- Don't add pairs in lua string treesitter nodes + javascript = { 'template_string' }, -- Don't add pairs in JS template strings + php = { 'string' }, -- Don't add pairs in PHP strings + }, + disable_filetype = { 'TelescopePrompt', 'vim' }, + fast_wrap = { + map = '', -- Alt+e for fast wrap + chars = { '{', '[', '(', '"', "'" }, + pattern = [=[[%'%"%>%]%)%}%,]]=], + end_key = '$', + keys = 'qwertyuiopzxcvbnmasdfghjkl', + check_comma = true, + highlight = 'Search', + highlight_grey = 'Comment', + }, + }) + + -- Integration with nvim-cmp + local cmp_autopairs = require('nvim-autopairs.completion.cmp') + local cmp = require('cmp') + cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done()) + end, +} diff --git a/lua/plugins/indent-blankline.lua b/lua/plugins/indent-blankline.lua new file mode 100644 index 0000000..6bfe898 --- /dev/null +++ b/lua/plugins/indent-blankline.lua @@ -0,0 +1,37 @@ +-- Phase 6.6: indent-blankline for visual indent guides +return { + 'lukas-reineke/indent-blankline.nvim', + main = 'ibl', + event = { 'BufReadPost', 'BufNewFile' }, + opts = { + indent = { + char = '│', -- Use same character as listchars tab + tab_char = '│', + }, + scope = { + enabled = true, -- Highlight current scope + show_start = true, -- Show underline at start of scope + show_end = false, -- Don't show underline at end (can be noisy) + }, + exclude = { + filetypes = { + 'help', + 'alpha', + 'dashboard', + 'neo-tree', + 'Trouble', + 'lazy', + 'mason', + 'notify', + 'toggleterm', + 'lazyterm', + }, + buftypes = { + 'terminal', + 'nofile', + 'quickfix', + 'prompt', + }, + }, + }, +} diff --git a/lua/plugins/surround.lua b/lua/plugins/surround.lua new file mode 100644 index 0000000..4d92e36 --- /dev/null +++ b/lua/plugins/surround.lua @@ -0,0 +1,28 @@ +-- Phase 6.4: nvim-surround for surrounding text with quotes, brackets, tags, etc. +return { + 'kylechui/nvim-surround', + version = '*', -- Use stable releases + event = 'VeryLazy', + opts = { + -- Default keymaps: + -- ys{motion}{char} - Add surround in normal mode (e.g., ysiw" to surround word with quotes) + -- ds{char} - Delete surround (e.g., ds" to delete surrounding quotes) + -- cs{old}{new} - Change surround (e.g., cs"' to change " to ') + -- S{char} - Add surround in visual mode (e.g., select text, S" to wrap in quotes) + + -- Keep default keymaps; minimal config + keymaps = { + insert = 's', + insert_line = 'S', + normal = 'ys', + normal_cur = 'yss', + normal_line = 'yS', + normal_cur_line = 'ySS', + visual = 'S', + visual_line = 'gS', + delete = 'ds', + change = 'cs', + change_line = 'cS', + }, + }, +} diff --git a/lua/plugins/ufo.lua b/lua/plugins/ufo.lua new file mode 100644 index 0000000..476f0cb --- /dev/null +++ b/lua/plugins/ufo.lua @@ -0,0 +1,56 @@ +-- Phase 6.7: nvim-ufo for better folding with Treesitter and LSP support +return { + 'kevinhwang91/nvim-ufo', + dependencies = { + 'kevinhwang91/promise-async', + }, + event = { 'BufReadPost', 'BufNewFile' }, + keys = { + { 'zR', function() require('ufo').openAllFolds() end, desc = 'Open all folds' }, + { 'zM', function() require('ufo').closeAllFolds() end, desc = 'Close all folds' }, + { 'zr', function() require('ufo').openFoldsExceptKinds() end, desc = 'Open folds except kinds' }, + { 'zm', function() require('ufo').closeFoldsWith() end, desc = 'Close folds with' }, + { 'K', function() + local winid = require('ufo').peekFoldedLinesUnderCursor() + if not winid then + -- Fall back to LSP hover if not on a fold + vim.lsp.buf.hover() + end + end, desc = 'Peek fold or LSP hover' }, + }, + opts = { + provider_selector = function(bufnr, filetype, buftype) + -- Use Treesitter for supported languages, LSP for others, indent as fallback + return { 'treesitter', 'indent' } + end, + -- Open folds when searching + open_fold_hl_timeout = 150, + close_fold_kinds_for_ft = { + default = { 'imports', 'comment' }, + }, + preview = { + win_config = { + border = { '', '─', '', '', '', '─', '', '' }, + winhighlight = 'Normal:Folded', + winblend = 0, + }, + mappings = { + scrollU = '', + scrollD = '', + jumpTop = '[', + jumpBot = ']', + }, + }, + }, + config = function(_, opts) + -- Set fold settings for nvim-ufo + vim.o.foldcolumn = '1' -- Show fold column + vim.o.foldlevel = 99 -- Open all folds by default + vim.o.foldlevelstart = 99 -- Open all folds when opening a file + vim.o.foldenable = true -- Enable folding + -- Use simple characters for fold indicators + vim.o.fillchars = [[eob: ,fold: ,foldopen:▼,foldsep: ,foldclose:▶]] + + require('ufo').setup(opts) + end, +} diff --git a/lua/plugins/undotree.lua b/lua/plugins/undotree.lua new file mode 100644 index 0000000..219cb92 --- /dev/null +++ b/lua/plugins/undotree.lua @@ -0,0 +1,15 @@ +-- Phase 6.8: undotree for visual undo history +return { + 'mbbill/undotree', + cmd = 'UndotreeToggle', -- Lazy load on command + keys = { + { 'u', 'UndotreeToggle', desc = 'Toggle Undotree' }, + }, + config = function() + -- Configure undotree + vim.g.undotree_WindowLayout = 2 -- Layout: diff at bottom + vim.g.undotree_ShortIndicators = 1 -- Use short time indicators + vim.g.undotree_SetFocusWhenToggle = 1 -- Focus undotree when toggled + vim.g.undotree_DiffAutoOpen = 1 -- Auto open diff window + end, +}