From 18bd0cb00b766148c4601f36bdd141089dcdfa6b Mon Sep 17 00:00:00 2001 From: S4NKALP Date: Mon, 19 Aug 2024 03:32:26 +0545 Subject: [PATCH] huge updates --- assets/screenshot.png | Bin 156753 -> 0 bytes dotfyle.json | 1973 ++++++++++++++++- init.lua | 9 +- lua/config/keymaps.lua | 110 - lua/{plugins => configs}/alpha.lua | 59 +- lua/configs/cmp.lua | 90 + lua/configs/lsp.lua | 172 ++ lua/configs/lualine.lua | 198 ++ lua/configs/mason.lua | 47 + lua/configs/none-ls.lua | 61 + lua/configs/telescope.lua | 68 + lua/configs/toggleterm.lua | 23 + lua/{config => core}/autocmd.lua | 66 + lua/core/functions.lua | 39 + lua/core/keymaps.lua | 75 + lua/{config => core}/lazy.lua | 2 +- lua/{config => core}/options.lua | 0 lua/core/util.lua | 66 + lua/list.lua | 587 ----- lazy-lock.json => lua/lock.json | 37 +- lua/plugins/auto-pairs.lua | 72 - lua/plugins/barbecue.lua | 40 - lua/plugins/codeium.lua | 49 - lua/plugins/coding.lua | 211 ++ lua/plugins/cokeline.lua | 78 - lua/plugins/colorscheme.lua | 14 + lua/plugins/completions.lua | 89 - lua/plugins/dap.lua | 132 ++ lua/plugins/editor.lua | 281 +++ lua/plugins/linter_formatter.lua | 24 + lua/plugins/lsp.lua | 13 + lua/plugins/lspconfig.lua | 169 -- lua/plugins/lspsaga.lua | 41 - lua/plugins/lualine.lua | 210 -- lua/plugins/mason.lua | 57 - lua/plugins/mini.lua | 11 +- lua/plugins/neo-tree.lua | 35 - lua/plugins/neotest.lua | 73 - lua/plugins/noice.lua | 101 - lua/plugins/none-ls.lua | 70 - lua/plugins/nvim-dap.lua | 32 - lua/plugins/other.lua | 170 ++ lua/plugins/telescope.lua | 145 -- lua/plugins/terminal.lua | 51 - lua/plugins/test.lua | 40 + .../{nvim-treesitter.lua => treesitter.lua} | 24 +- lua/plugins/trouble.lua | 48 - lua/plugins/ui.lua | 222 ++ lua/plugins/whichkey.lua | 166 ++ 49 files changed, 4210 insertions(+), 2140 deletions(-) delete mode 100644 assets/screenshot.png delete mode 100644 lua/config/keymaps.lua rename lua/{plugins => configs}/alpha.lua (64%) create mode 100644 lua/configs/cmp.lua create mode 100644 lua/configs/lsp.lua create mode 100644 lua/configs/lualine.lua create mode 100644 lua/configs/mason.lua create mode 100644 lua/configs/none-ls.lua create mode 100644 lua/configs/telescope.lua create mode 100644 lua/configs/toggleterm.lua rename lua/{config => core}/autocmd.lua (59%) create mode 100644 lua/core/functions.lua create mode 100644 lua/core/keymaps.lua rename lua/{config => core}/lazy.lua (97%) rename lua/{config => core}/options.lua (100%) create mode 100644 lua/core/util.lua delete mode 100644 lua/list.lua rename lazy-lock.json => lua/lock.json (77%) delete mode 100644 lua/plugins/auto-pairs.lua delete mode 100644 lua/plugins/barbecue.lua delete mode 100644 lua/plugins/codeium.lua create mode 100644 lua/plugins/coding.lua delete mode 100644 lua/plugins/cokeline.lua create mode 100644 lua/plugins/colorscheme.lua delete mode 100644 lua/plugins/completions.lua create mode 100644 lua/plugins/dap.lua create mode 100644 lua/plugins/editor.lua create mode 100644 lua/plugins/linter_formatter.lua create mode 100644 lua/plugins/lsp.lua delete mode 100644 lua/plugins/lspconfig.lua delete mode 100644 lua/plugins/lspsaga.lua delete mode 100644 lua/plugins/lualine.lua delete mode 100644 lua/plugins/mason.lua delete mode 100644 lua/plugins/neo-tree.lua delete mode 100644 lua/plugins/neotest.lua delete mode 100644 lua/plugins/noice.lua delete mode 100644 lua/plugins/none-ls.lua delete mode 100644 lua/plugins/nvim-dap.lua create mode 100644 lua/plugins/other.lua delete mode 100644 lua/plugins/telescope.lua delete mode 100644 lua/plugins/terminal.lua create mode 100644 lua/plugins/test.lua rename lua/plugins/{nvim-treesitter.lua => treesitter.lua} (77%) delete mode 100644 lua/plugins/trouble.lua create mode 100644 lua/plugins/ui.lua create mode 100644 lua/plugins/whichkey.lua diff --git a/assets/screenshot.png b/assets/screenshot.png deleted file mode 100644 index aeffa9514edc878ce63c45422f7f444502bb4a86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 156753 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 RhEs%(vVuDJt-Oiv{{RiWv$FsI diff --git a/dotfyle.json b/dotfyle.json index 8277ccc..95cf53f 100644 --- a/dotfyle.json +++ b/dotfyle.json @@ -1 +1,1972 @@ -{"distribution": "custom", "masonTools": ["actionlint", "bash-language-server", "biome", "black", "clang-format", "clangd", "emmet-ls", "eslint_d", "goimports-reviser", "golangci-lint", "graphql-lsp", "hadolint", "isort", "jdtls", "lua-language-server", "prettier", "prisma-language-server", "proselint", "pylint", "pylsp", "pyright", "pyright-langserver", "rubocop", "ruff-lsp", "rust-analyzer", "shellcheck", "shfmt", "solargraph", "stylua", "svelteserver", "tailwindcss-language-server", "typescript-language-server", "typos-lsp", "vim-language-server", "vint", "vscode-css-language-server", "vscode-eslint-language-server", "vscode-html-language-server", "vscode-json-language-server", "write-good"], "keymaps": [{"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ":bnext"}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": "nohlsearch"}, {"desc": "Dismiss All Notifications", "noremap": true, "lhs": "un", "mode": "n", "rhs": ""}, {"desc": "Buffer Local Keymaps (which-key)", "noremap": true, "lhs": "?", "mode": "n", "rhs": ""}, {"desc": "Left File Explorer", "noremap": true, "lhs": "", "mode": "n", "rhs": ":Neotree toggle left"}, {"desc": "Float File Explorer", "noremap": true, "lhs": "ee", "mode": "n", "rhs": ":Neotree toggle float"}, {"desc": "Quit Buffer", "noremap": true, "lhs": "q", "mode": "n", "rhs": ""}, {"desc": "Toggle TS Context", "noremap": true, "lhs": "tc", "mode": "n", "rhs": ""}, {"desc": "Live Grep", "noremap": true, "lhs": "sg", "mode": "n", "rhs": ""}, {"desc": "Open Recent File", "noremap": true, "lhs": "so", "mode": "n", "rhs": ""}, {"desc": "Map Pages", "noremap": true, "lhs": "sM", "mode": "n", "rhs": ""}, {"desc": "Find highlight groups", "noremap": true, "lhs": "sH", "mode": "n", "rhs": ""}, {"desc": "Find Help", "noremap": true, "lhs": "sh", "mode": "n", "rhs": ""}, {"desc": "Find File (CWD)", "noremap": true, "lhs": "sf", "mode": "n", "rhs": ""}, {"desc": "Buffers", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "File Browser", "noremap": true, "lhs": "sF", "mode": "n", "rhs": ""}, {"desc": "Commands", "noremap": true, "lhs": "sC", "mode": "n", "rhs": ""}, {"desc": "Keymaps", "noremap": true, "lhs": "sk", "mode": "n", "rhs": ""}, {"desc": "Grep String", "noremap": true, "lhs": "sw", "mode": "n", "rhs": ""}, {"desc": "LSP references/definitions/... (Trouble)", "noremap": true, "lhs": "cS", "mode": "n", "rhs": ""}, {"desc": "Symbols (Trouble)", "noremap": true, "lhs": "cs", "mode": "n", "rhs": ""}, {"desc": "Buffer Diagnostics (Trouble)", "noremap": true, "lhs": "xX", "mode": "n", "rhs": ""}, {"desc": "Diagnostics (Trouble)", "noremap": true, "lhs": "xx", "mode": "n", "rhs": ""}, {"desc": "Quickfix List (Trouble)", "noremap": true, "lhs": "xQ", "mode": "n", "rhs": ""}, {"desc": "Location List (Trouble)", "noremap": true, "lhs": "xL", "mode": "n", "rhs": ""}, {"desc": "Maximize/minimize a split", "noremap": true, "lhs": "sm", "mode": "n", "rhs": ""}, {"desc": "Replace in Files (Spectre)", "noremap": true, "lhs": "sr", "mode": "n", "rhs": ""}, {"desc": "Toggle Undotree", "noremap": true, "lhs": "uu", "mode": "n", "rhs": ""}, {"desc": "Toggle zen mode", "noremap": true, "lhs": "zz", "mode": "n", "rhs": ""}, {"desc": "Don't Save Current Session", "noremap": true, "lhs": "sd", "mode": "n", "rhs": ""}, {"desc": "Restore Last Session", "noremap": true, "lhs": "sl", "mode": "n", "rhs": ""}, {"desc": "Restore Session", "noremap": true, "lhs": "ss", "mode": "n", "rhs": ""}, {"desc": "Stop", "noremap": true, "lhs": "tS", "mode": "n", "rhs": ""}, {"desc": "Toggle Output Panel", "noremap": true, "lhs": "tO", "mode": "n", "rhs": ""}, {"desc": "Show Output", "noremap": true, "lhs": "to", "mode": "n", "rhs": ""}, {"desc": "Toggle Summary", "noremap": true, "lhs": "ts", "mode": "n", "rhs": ""}, {"desc": "Run Nearest", "noremap": true, "lhs": "tr", "mode": "n", "rhs": ""}, {"desc": "Run All Test Files", "noremap": true, "lhs": "tT", "mode": "n", "rhs": ""}, {"desc": "Run File", "noremap": true, "lhs": "tw", "mode": "n", "rhs": ""}, {"desc": "toggle markdown preview", "noremap": true, "lhs": "mp", "mode": "n", "rhs": ""}, {"desc": "Horizontal Terminal", "noremap": true, "lhs": "th", "mode": "n", "rhs": ""}, {"desc": "Vertical Terminal", "noremap": true, "lhs": "tv", "mode": "n", "rhs": ""}, {"desc": "Toggle DB UI", "noremap": true, "lhs": "du", "mode": "n", "rhs": ""}, {"desc": "DB Last query", "noremap": true, "lhs": "dl", "mode": "n", "rhs": ""}, {"desc": "DB Rename buffer", "noremap": true, "lhs": "dr", "mode": "n", "rhs": ""}, {"desc": "DB Find buffer", "noremap": true, "lhs": "db", "mode": "n", "rhs": ""}, {"desc": "toggle barbecue", "noremap": true, "lhs": "bq", "mode": "n", "rhs": ""}, {"desc": "Screenshot (Save)", "noremap": true, "lhs": "cP", "mode": "v", "rhs": ""}, {"desc": "Screenshot (Clipboard)", "noremap": true, "lhs": "cp", "mode": "v", "rhs": ""}, {"desc": "Nav", "noremap": true, "lhs": "nv", "mode": "n", "rhs": ""}, {"desc": "Delete Comment Style", "noremap": true, "lhs": "cd", "mode": "v", "rhs": ""}, {"desc": "Delete Comment Style", "noremap": true, "lhs": "cd", "mode": "n", "rhs": ""}, {"desc": "Catalog", "noremap": true, "lhs": "cc", "mode": "n", "rhs": ""}, {"desc": "Marked", "noremap": true, "lhs": "cm", "mode": "v", "rhs": ""}, {"desc": "Marked", "noremap": true, "lhs": "cm", "mode": "n", "rhs": ""}, {"desc": "Line", "noremap": true, "lhs": "cl", "mode": "n", "rhs": ""}, {"desc": "Tiled line", "noremap": true, "lhs": "ct", "mode": "v", "rhs": ""}, {"desc": "Tiled line", "noremap": true, "lhs": "ct", "mode": "n", "rhs": ""}, {"desc": "Comment Box", "noremap": true, "lhs": "cb", "mode": "v", "rhs": ""}, {"desc": "Comment Box", "noremap": true, "lhs": "cb", "mode": "n", "rhs": ""}, {"desc": "Toggle keys", "noremap": true, "lhs": "kt", "mode": "n", "rhs": "Screenkey"}, {"desc": "", "noremap": true, "lhs": "se", "mode": "n", "rhs": "IconPickerInsert emoji"}, {"desc": " Insert Macro Breakpoint.", "noremap": true, "lhs": "##", "mode": "n", "rhs": ""}, {"desc": "Search Selected Text (Backwards)", "noremap": true, "lhs": "#", "mode": "x", "rhs": "y?\\V=escape(@\", '?\\')"}, {"desc": ":help &-default", "noremap": true, "lhs": "&", "mode": "n", "rhs": ":&&"}, {"desc": "Search Selected Text", "noremap": true, "lhs": "*", "mode": "x", "rhs": "y/\\V=escape(@\", '/\\')"}, {"desc": "", "noremap": true, "lhs": "+", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "-", "mode": "n", "rhs": ""}, {"desc": "(V) Indent to left", "noremap": true, "lhs": "<", "mode": "v", "rhs": "gv"}, {"desc": "(V) Indent to right", "noremap": true, "lhs": ">", "mode": "v", "rhs": ">gv"}, {"desc": ":help v_@-default", "noremap": true, "lhs": "@", "mode": "x", "rhs": "mode() ==# 'V' ? ':normal! @'.getcharstr().'' : '@'"}, {"desc": "Change without yanking", "noremap": true, "lhs": "C", "mode": "x", "rhs": "\"_C"}, {"desc": "Change without yanking", "noremap": true, "lhs": "C", "mode": "n", "rhs": "\"_C"}, {"desc": "Join line without moving the cursor", "noremap": true, "lhs": "J", "mode": "n", "rhs": "mzJ`z"}, {"desc": "", "noremap": true, "lhs": "J", "mode": "v", "rhs": ":m '>+1gv=gv"}, {"desc": "", "noremap": true, "lhs": "K", "mode": "v", "rhs": ":m '>-2gv=gv"}, {"desc": "", "noremap": true, "lhs": "N", "mode": "n", "rhs": "Nzzzv"}, {"desc": " Play Macro", "noremap": true, "lhs": "Q", "mode": "n", "rhs": ""}, {"desc": ":help v_Q-default", "noremap": true, "lhs": "Q", "mode": "x", "rhs": "mode() ==# 'V' ? ':normal! @=reg_recorded()' : 'Q'"}, {"desc": "Treesitter Search", "noremap": true, "lhs": "R", "mode": "x", "rhs": ""}, {"desc": "Flash Treesitter", "noremap": true, "lhs": "S", "mode": "x", "rhs": ""}, {"desc": "Flash Treesitter", "noremap": true, "lhs": "S", "mode": "n", "rhs": ""}, {"desc": ":help Y-default", "noremap": true, "lhs": "Y", "mode": "n", "rhs": "y$"}, {"desc": "Go to TS context", "noremap": true, "lhs": "[c", "mode": "n", "rhs": ""}, {"desc": "Previous Trouble/Quickfix Item", "noremap": true, "lhs": "[q", "mode": "n", "rhs": ""}, {"desc": "Jump to the previous diagnostic", "noremap": true, "lhs": "[d", "mode": "n", "rhs": ""}, {"desc": "Previous location list item", "noremap": true, "lhs": "\\lp", "mode": "n", "rhs": "lprev"}, {"desc": "Next location list item", "noremap": true, "lhs": "\\ln", "mode": "n", "rhs": "lnext"}, {"desc": "Close location list", "noremap": true, "lhs": "\\lc", "mode": "n", "rhs": "lclose"}, {"desc": "Open location list", "noremap": true, "lhs": "\\lo", "mode": "n", "rhs": "lopen"}, {"desc": "Paste from system clipboard", "noremap": true, "lhs": "\\p", "mode": "n", "rhs": "\"+p"}, {"desc": "Copy to system clipboard", "noremap": true, "lhs": "\\y", "mode": "v", "rhs": "\"+y"}, {"desc": "Copy to system clipboard", "noremap": true, "lhs": "\\y", "mode": "n", "rhs": "\"+y"}, {"desc": "Select pasted text", "noremap": true, "lhs": "\\vp", "mode": "n", "rhs": "`[v`]"}, {"desc": "", "noremap": true, "lhs": "\\r", "mode": "v", "rhs": "\"hy:%s/h//g"}, {"desc": "Force save and quit", "noremap": true, "lhs": "\\Q", "mode": "n", "rhs": "wq!"}, {"desc": "Save file", "noremap": true, "lhs": "\\w", "mode": "n", "rhs": ":w"}, {"desc": "Paste from system clipboard", "noremap": true, "lhs": "\\p", "mode": "v", "rhs": "\"+p"}, {"desc": "Next Trouble/Quickfix Item", "noremap": true, "lhs": "]q", "mode": "n", "rhs": ""}, {"desc": "Jump to the next diagnostic", "noremap": true, "lhs": "]d", "mode": "n", "rhs": ""}, {"desc": " Edit Macro", "noremap": true, "lhs": "cq", "mode": "n", "rhs": ""}, {"desc": "Change without yanking", "noremap": true, "lhs": "cc", "mode": "x", "rhs": "\"_cc"}, {"desc": "Change without yanking", "noremap": true, "lhs": "cc", "mode": "n", "rhs": "\"_cc"}, {"desc": "Change without yanking", "noremap": true, "lhs": "c", "mode": "x", "rhs": "\"_c"}, {"desc": "Change without yanking", "noremap": true, "lhs": "c", "mode": "n", "rhs": "\"_c"}, {"desc": "Change previous match by pressing dot (.)", "noremap": true, "lhs": "cN", "mode": "n", "rhs": "*``cgN"}, {"desc": "Change next match by pressing dot (.)", "noremap": true, "lhs": "cn", "mode": "n", "rhs": "*``cgn"}, {"desc": " Delete All Macros", "noremap": true, "lhs": "dq", "mode": "n", "rhs": ""}, {"desc": "Don't Yank Empty Line to Clipboard", "noremap": true, "lhs": "dd", "mode": "n", "rhs": ""}, {"desc": "Search Inside Visual Selection", "noremap": true, "lhs": "g/", "mode": "x", "rhs": "/\\%V"}, {"desc": "Toggle comment line", "noremap": true, "lhs": "gcc", "mode": "n", "rhs": ""}, {"desc": "Toggle comment", "noremap": true, "lhs": "gc", "mode": "x", "rhs": ""}, {"desc": "Toggle comment", "noremap": true, "lhs": "gc", "mode": "n", "rhs": ""}, {"desc": "Opens filepath or URI under cursor with the system handler (file explorer, web browser, …)", "noremap": true, "lhs": "gx", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "gx", "mode": "n", "rhs": ":URLOpenUnderCursor"}, {"desc": "", "noremap": true, "lhs": "hs", "mode": "n", "rhs": ":sp"}, {"desc": "", "noremap": true, "lhs": "j", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "k", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "n", "mode": "n", "rhs": "nzzzv"}, {"desc": " Start/Stop Recording", "noremap": true, "lhs": "q", "mode": "n", "rhs": ""}, {"desc": "Flash", "noremap": true, "lhs": "s", "mode": "x", "rhs": ""}, {"desc": "Flash", "noremap": true, "lhs": "s", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "vs", "mode": "n", "rhs": ":vsp"}, {"desc": "delete without yanking", "noremap": true, "lhs": "x", "mode": "x", "rhs": "\"_x"}, {"desc": "delete without yanking", "noremap": true, "lhs": "x", "mode": "n", "rhs": "\"_x"}, {"desc": " Yank Macro", "noremap": true, "lhs": "yq", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "zb", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "zb", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "zz", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "zz", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "zt", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "zt", "mode": "n", "rhs": ""}, {"desc": " Switch Macro Slot", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "x", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "Resize split right", "noremap": true, "lhs": "", "mode": "n", "rhs": "vertical resize +2"}, {"desc": "Resize split left", "noremap": true, "lhs": "", "mode": "n", "rhs": "vertical resize -2"}, {"desc": "Resize split down", "noremap": true, "lhs": "", "mode": "n", "rhs": "resize +2"}, {"desc": "Resize split up", "noremap": true, "lhs": "", "mode": "n", "rhs": "resize -2"}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ":bprev"}, {"desc": "", "noremap": true, "lhs": "", "mode": "v", "rhs": ":sort"}, {"desc": "Change Without Yanking", "noremap": true, "lhs": "", "mode": "x", "rhs": "\"_c"}, {"desc": "Change Without Yanking", "noremap": true, "lhs": "", "mode": "n", "rhs": "\"_c"}, {"desc": "Delete Without Yanking", "noremap": true, "lhs": "", "mode": "x", "rhs": "\"_d"}, {"desc": "Delete Without Yanking", "noremap": true, "lhs": "", "mode": "n", "rhs": "\"_d"}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": "ggVG"}, {"desc": "Show diagnostics under the cursor", "noremap": false, "lhs": "", "mode": "n", "rhs": "d"}, {"desc": "Show diagnostics under the cursor", "noremap": true, "lhs": "d", "mode": "n", "rhs": ""}, {"desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": ""}], "plugins": ["2kabhishek/termim.nvim", "Exafunction/codeium.vim", "HiPhish/rainbow-delimiters.nvim", "L3MON4D3/LuaSnip", "LudoPinelli/comment-box.nvim", "LunarVim/bigfile.nvim", "MunifTanjim/nui.nvim", "NStefan002/screenkey.nvim", "SmiteshP/nvim-navbuddy", "SmiteshP/nvim-navic", "WhoIsSethDaniel/mason-tool-installer.nvim", "akinsho/toggleterm.nvim", "altermo/ultimate-autopair.nvim", "antosha417/nvim-lsp-file-operations", "bluz71/vim-moonfly-colors", "chrisgrieser/nvim-recorder", "creativenull/dotfyle-metadata.nvim", "echasnovski/mini.nvim", "famiu/bufdelete.nvim", "folke/flash.nvim", "folke/lazy.nvim", "folke/lazydev.nvim", "folke/noice.nvim", "folke/persistence.nvim", "folke/trouble.nvim", "folke/which-key.nvim", "folke/zen-mode.nvim", "goolord/alpha-nvim", "haydenmeade/neotest-jest", "hrsh7th/cmp-buffer", "hrsh7th/cmp-cmdline", "hrsh7th/cmp-nvim-lsp", "hrsh7th/cmp-nvim-lua", "hrsh7th/cmp-path", "hrsh7th/nvim-cmp", "iamcco/markdown-preview.nvim", "jay-babu/mason-null-ls.nvim", "karb94/neoscroll.nvim", "kristijanhusak/vim-dadbod-completion", "kristijanhusak/vim-dadbod-ui", "leoluz/nvim-dap-go", "luukvbaal/statuscol.nvim", "m-demare/hlargs.nvim", "marilari88/neotest-vitest", "max397574/better-escape.nvim", "mbbill/undotree", "mfussenegger/nvim-dap", "mistricky/codesnap.nvim", "mstuttgart/odoo-snippets", "mvllow/modes.nvim", "nacro90/numb.nvim", "neovim/nvim-lspconfig", "nmac427/guess-indent.nvim", "numToStr/Navigator.nvim", "nvim-lua/plenary.nvim", "nvim-lualine/lualine.nvim", "nvim-neo-tree/neo-tree.nvim", "nvim-neotest/neotest", "nvim-neotest/nvim-nio", "nvim-pack/nvim-spectre", "nvim-telescope/telescope-file-browser.nvim", "nvim-telescope/telescope-fzf-native.nvim", "nvim-telescope/telescope-ui-select.nvim", "nvim-telescope/telescope.nvim", "nvim-tree/nvim-web-devicons", "nvim-treesitter/nvim-treesitter", "nvim-treesitter/nvim-treesitter-context", "nvim-treesitter/nvim-treesitter-textobjects", "nvimdev/lspsaga.nvim", "nvimtools/none-ls.nvim", "onsails/lspkind.nvim", "rafamadriz/friendly-snippets", "rcarriga/nvim-dap-ui", "rcarriga/nvim-notify", "saadparwaiz1/cmp_luasnip", "smjonas/inc-rename.nvim", "sontungexpt/url-open", "soulis-1256/eagle.nvim", "stevearc/dressing.nvim", "szw/vim-maximizer", "tpope/vim-dadbod", "utilyre/barbecue.nvim", "wakatime/vim-wakatime", "williamboman/mason-lspconfig.nvim", "williamboman/mason.nvim", "willothy/flatten.nvim", "willothy/nvim-cokeline", "windwp/nvim-autopairs", "windwp/nvim-ts-autotag", "zapling/mason-lock.nvim", "ziontee113/icon-picker.nvim"], "pluginManager": "lazy.nvim", "treesitterParsers": ["bash", "c", "cpp", "css", "html", "java", "javascript", "json", "lua", "markdown", "markdown_inline", "python", "scss", "toml", "tsx", "typescript", "vim", "vimdoc"], "lspServers": ["bashls", "clangd", "cssls", "html", "lua_ls", "pyright", "svelte", "tailwindcss", "tsserver"], "leaderKey": ""} \ No newline at end of file +{ + "distribution": "custom", + "masonTools": [ + "biome", + "black", + "clang-format", + "clangd", + "eslint_d", + "isort", + "jdtls", + "lua-language-server", + "prettier", + "pylint", + "pyright", + "pyright-langserver", + "stylua", + "vscode-html-language-server" + ], + "plugins": [ + "2kabhishek/tdo.nvim", + "2kabhishek/termim.nvim", + "Exafunction/codeium.vim", + "HiPhish/rainbow-delimiters.nvim", + "L3MON4D3/LuaSnip", + "LudoPinelli/comment-box.nvim", + "LunarVim/bigfile.nvim", + "MunifTanjim/nui.nvim", + "NStefan002/screenkey.nvim", + "SmiteshP/nvim-navic", + "WhoIsSethDaniel/mason-tool-installer.nvim", + "akinsho/bufferline.nvim", + "akinsho/toggleterm.nvim", + "altermo/ultimate-autopair.nvim", + "antosha417/nvim-lsp-file-operations", + "bluz71/vim-moonfly-colors", + "chrisgrieser/nvim-recorder", + "creativenull/dotfyle-metadata.nvim", + "debugloop/telescope-undo.nvim", + "echasnovski/mini.files", + "echasnovski/mini.nvim", + "folke/flash.nvim", + "folke/lazy.nvim", + "folke/noice.nvim", + "folke/persistence.nvim", + "folke/trouble.nvim", + "folke/which-key.nvim", + "folke/zen-mode.nvim", + "gbprod/yanky.nvim", + "goolord/alpha-nvim", + "hrsh7th/cmp-buffer", + "hrsh7th/cmp-cmdline", + "hrsh7th/cmp-nvim-lsp", + "hrsh7th/cmp-nvim-lua", + "hrsh7th/cmp-path", + "hrsh7th/nvim-cmp", + "iamcco/markdown-preview.nvim", + "jay-babu/mason-null-ls.nvim", + "kristijanhusak/vim-dadbod-completion", + "kristijanhusak/vim-dadbod-ui", + "lukas-reineke/indent-blankline.nvim", + "m-demare/hlargs.nvim", + "m4xshen/hardtime.nvim", + "max397574/better-escape.nvim", + "mfussenegger/nvim-dap", + "mstuttgart/odoo-snippets", + "mvllow/modes.nvim", + "nacro90/numb.nvim", + "neovim/nvim-lspconfig", + "numToStr/Navigator.nvim", + "nvim-lua/plenary.nvim", + "nvim-lualine/lualine.nvim", + "nvim-neo-tree/neo-tree.nvim", + "nvim-neotest/neotest", + "nvim-neotest/neotest-jest", + "nvim-neotest/neotest-python", + "nvim-neotest/nvim-nio", + "nvim-pack/nvim-spectre", + "nvim-telescope/telescope-file-browser.nvim", + "nvim-telescope/telescope-fzf-native.nvim", + "nvim-telescope/telescope-symbols.nvim", + "nvim-telescope/telescope-ui-select.nvim", + "nvim-telescope/telescope.nvim", + "nvim-tree/nvim-web-devicons", + "nvim-treesitter/nvim-treesitter", + "nvim-treesitter/nvim-treesitter-context", + "nvim-treesitter/nvim-treesitter-textobjects", + "nvimdev/lspsaga.nvim", + "nvimtools/none-ls.nvim", + "olimorris/neotest-rspec", + "onsails/lspkind.nvim", + "rafamadriz/friendly-snippets", + "rcarriga/nvim-dap-ui", + "rcarriga/nvim-notify", + "saadparwaiz1/cmp_luasnip", + "smjonas/inc-rename.nvim", + "stevearc/dressing.nvim", + "szw/vim-maximizer", + "tpope/vim-dadbod", + "utilyre/barbecue.nvim", + "wakatime/vim-wakatime", + "williamboman/mason-lspconfig.nvim", + "williamboman/mason.nvim", + "willothy/flatten.nvim", + "windwp/nvim-ts-autotag", + "zapling/mason-lock.nvim" + ], + "pluginManager": "lazy.nvim", + "keymaps": [ + { + "desc": "Next Buffer", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "bnext" + }, + { + "desc": "Escape and clear hlsearch", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "noh" + }, + { + "desc": " Left File Explorer", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": ":Neotree toggle left" + }, + { + "desc": "Float File Explorer", + "noremap": true, + "lhs": "ee", + "mode": "n", + "rhs": ":Neotree toggle float" + }, + { + "desc": "Current Word", + "noremap": true, + "lhs": "jw", + "mode": "v", + "rhs": "lua require(\"flash\").jump({ pattern = vim.fn.expand(\"cword>\")})" + }, + { + "desc": "Current Word", + "noremap": true, + "lhs": "jw", + "mode": "n", + "rhs": "lua require(\"flash\").jump({ pattern = vim.fn.expand(\"cword>\")})" + }, + { + "desc": "Remote Treesitter", + "noremap": true, + "lhs": "jt", + "mode": "v", + "rhs": "lua require('flash').treesitter_search()" + }, + { + "desc": "Remote Treesitter", + "noremap": true, + "lhs": "jt", + "mode": "n", + "rhs": "lua require('flash').treesitter_search()" + }, + { + "desc": "Search", + "noremap": true, + "lhs": "js", + "mode": "v", + "rhs": "lua require('flash').jump()" + }, + { + "desc": "Search", + "noremap": true, + "lhs": "js", + "mode": "n", + "rhs": "lua require('flash').jump()" + }, + { + "desc": "Previous Jump", + "noremap": true, + "lhs": "jp", + "mode": "v", + "rhs": "lua require('flash').jump({continue = true})" + }, + { + "desc": "Previous Jump", + "noremap": true, + "lhs": "jp", + "mode": "n", + "rhs": "lua require('flash').jump({continue = true})" + }, + { + "desc": "Search Forward", + "noremap": true, + "lhs": "jn", + "mode": "v", + "rhs": "lua require('flash').jump({search = { forward = true, wrap = false, multi_window = false },})" + }, + { + "desc": "Search Forward", + "noremap": true, + "lhs": "jn", + "mode": "n", + "rhs": "lua require('flash').jump({search = { forward = true, wrap = false, multi_window = false },})" + }, + { + "desc": "Forward", + "noremap": true, + "lhs": "jl", + "mode": "n", + "rhs": "" + }, + { + "desc": "Treesitter", + "noremap": true, + "lhs": "jk", + "mode": "v", + "rhs": "lua require('flash').treesitter()" + }, + { + "desc": "Treesitter", + "noremap": true, + "lhs": "jk", + "mode": "n", + "rhs": "lua require('flash').treesitter()" + }, + { + "desc": "Remote", + "noremap": true, + "lhs": "jj", + "mode": "v", + "rhs": "lua require('flash').remote()" + }, + { + "desc": "Remote", + "noremap": true, + "lhs": "jj", + "mode": "n", + "rhs": "lua require('flash').remote()" + }, + { + "desc": "Backward", + "noremap": true, + "lhs": "jh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Jumplist", + "noremap": true, + "lhs": "jf", + "mode": "n", + "rhs": "Telescope jumplist" + }, + { + "desc": "Diagnostics", + "noremap": true, + "lhs": "jd", + "mode": "v", + "rhs": "FlashDiagnostics" + }, + { + "desc": "Diagnostics", + "noremap": true, + "lhs": "jd", + "mode": "n", + "rhs": "FlashDiagnostics" + }, + { + "desc": "Word", + "noremap": true, + "lhs": "jc", + "mode": "n", + "rhs": "*" + }, + { + "desc": "Search Backward", + "noremap": true, + "lhs": "jN", + "mode": "v", + "rhs": "lua require('flash').jump({search = { forward = false, wrap = false, multi_window = false },})" + }, + { + "desc": "Search Backward", + "noremap": true, + "lhs": "jN", + "mode": "n", + "rhs": "lua require('flash').jump({search = { forward = false, wrap = false, multi_window = false },})" + }, + { + "desc": "Sort Desc", + "noremap": true, + "lhs": "cS", + "mode": "v", + "rhs": ":sort!" + }, + { + "desc": "Time", + "noremap": true, + "lhs": "it", + "mode": "n", + "rhs": "put =strftime('## %r')" + }, + { + "desc": "Registers", + "noremap": true, + "lhs": "ir", + "mode": "n", + "rhs": "Telescope registers" + }, + { + "desc": "Relative Path", + "noremap": true, + "lhs": "ip", + "mode": "n", + "rhs": "put %" + }, + { + "desc": "Nerd Glyphs", + "noremap": true, + "lhs": "in", + "mode": "n", + "rhs": "Nerdy" + }, + { + "desc": "File Name", + "noremap": true, + "lhs": "if", + "mode": "n", + "rhs": "put =expand('%:t')" + }, + { + "desc": "Emojis", + "noremap": true, + "lhs": "ie", + "mode": "n", + "rhs": "Telescope symbols" + }, + { + "desc": "Date", + "noremap": true, + "lhs": "id", + "mode": "n", + "rhs": "put =strftime('## %a, %d %b, %Y, %r')" + }, + { + "desc": "Absolute Path", + "noremap": true, + "lhs": "iP", + "mode": "n", + "rhs": "put %:p" + }, + { + "desc": "New File", + "noremap": true, + "lhs": "en", + "mode": "n", + "rhs": "enew" + }, + { + "desc": " Buffer Local Keymaps (which-key)", + "noremap": true, + "lhs": "?", + "mode": "n", + "rhs": "" + }, + { + "desc": "Reload Configs", + "noremap": true, + "lhs": "cR", + "mode": "n", + "rhs": "ReloadConfig" + }, + { + "desc": "Root Directory", + "noremap": true, + "lhs": "cd", + "mode": "n", + "rhs": "RootDir" + }, + { + "desc": "Clean Empty Lines", + "noremap": true, + "lhs": "cl", + "mode": "n", + "rhs": ":g/^\\s*$/d" + }, + { + "desc": "Alpha", + "noremap": true, + "lhs": "co", + "mode": "n", + "rhs": "Alpha" + }, + { + "desc": "Sort Case Insensitive", + "noremap": true, + "lhs": "ci", + "mode": "v", + "rhs": ":sort i" + }, + { + "desc": "Sort Asc", + "noremap": true, + "lhs": "cs", + "mode": "v", + "rhs": ":sort" + }, + { + "desc": "Unique", + "noremap": true, + "lhs": "cu", + "mode": "v", + "rhs": ":!uniq" + }, + { + "desc": "Close Tab", + "noremap": true, + "lhs": "sc", + "mode": "n", + "rhs": "tabclose" + }, + { + "desc": "Horizontal Split", + "noremap": true, + "lhs": "sa", + "mode": "n", + "rhs": "split" + }, + { + "desc": "Previous Window", + "noremap": true, + "lhs": "s`", + "mode": "n", + "rhs": "p" + }, + { + "desc": "Decrease window height", + "noremap": true, + "lhs": "s_", + "mode": "n", + "rhs": "resize -10" + }, + { + "desc": "Split Right", + "noremap": true, + "lhs": "s\\", + "mode": "n", + "rhs": "v" + }, + { + "desc": "Increase window width", + "noremap": true, + "lhs": "sL", + "mode": "n", + "rhs": "vertical resize +10" + }, + { + "desc": "Increase window height", + "noremap": true, + "lhs": "sK", + "mode": "n", + "rhs": "resize +5" + }, + { + "desc": "Decrease window height", + "noremap": true, + "lhs": "sJ", + "mode": "n", + "rhs": "resize -5" + }, + { + "desc": "Decrease window width", + "noremap": true, + "lhs": "sH", + "mode": "n", + "rhs": "vertical resize -10" + }, + { + "desc": "Increase window width", + "noremap": true, + "lhs": "s=", + "mode": "n", + "rhs": "vertical resize +20" + }, + { + "desc": "Split Below", + "noremap": true, + "lhs": "s/", + "mode": "n", + "rhs": "s" + }, + { + "desc": "Decrease window width", + "noremap": true, + "lhs": "s-", + "mode": "n", + "rhs": "vertical resize -20" + }, + { + "desc": "Increase window height", + "noremap": true, + "lhs": "s+", + "mode": "n", + "rhs": "resize +10" + }, + { + "desc": "Readme", + "noremap": true, + "lhs": "em", + "mode": "n", + "rhs": "e README.md" + }, + { + "desc": "Config Dir", + "noremap": true, + "lhs": "ed", + "mode": "n", + "rhs": "lua require(\"telescope.builtin\").find_files({cwd = vim.fn.stdpath(\"config\")})" + }, + { + "desc": "Config", + "noremap": true, + "lhs": "ec", + "mode": "n", + "rhs": "e $MYVIMRC" + }, + { + "desc": "Alternate File", + "noremap": true, + "lhs": "ea", + "mode": "n", + "rhs": "b#" + }, + { + "desc": "Write and Quit", + "noremap": true, + "lhs": "qw", + "mode": "n", + "rhs": "wq" + }, + { + "desc": "Close Split", + "noremap": true, + "lhs": "qs", + "mode": "n", + "rhs": "c" + }, + { + "desc": "Quit", + "noremap": true, + "lhs": "qq", + "mode": "n", + "rhs": "q" + }, + { + "desc": "Close Others", + "noremap": true, + "lhs": "qo", + "mode": "n", + "rhs": ":%bdelete|b#|bdelete#" + }, + { + "desc": "Force Quit", + "noremap": true, + "lhs": "qf", + "mode": "n", + "rhs": "qall!" + }, + { + "desc": "Delete Buffer", + "noremap": true, + "lhs": "qd", + "mode": "n", + "rhs": "bdelete" + }, + { + "desc": "Close Buffer", + "noremap": true, + "lhs": "qc", + "mode": "n", + "rhs": "bw" + }, + { + "desc": "Quit All", + "noremap": true, + "lhs": "qa", + "mode": "n", + "rhs": "qall" + }, + { + "desc": " Save and Quit", + "noremap": true, + "lhs": "x", + "mode": "n", + "rhs": "x" + }, + { + "desc": "Write and Quit", + "noremap": true, + "lhs": "ww", + "mode": "n", + "rhs": "w" + }, + { + "desc": "Suggestions", + "noremap": true, + "lhs": "ws", + "mode": "n", + "rhs": "Telescope spell_suggest" + }, + { + "desc": "Write and Quit", + "noremap": true, + "lhs": "wq", + "mode": "n", + "rhs": "wq" + }, + { + "desc": "Prev Misspell", + "noremap": true, + "lhs": "wk", + "mode": "n", + "rhs": "[s" + }, + { + "desc": "Next Misspell", + "noremap": true, + "lhs": "wj", + "mode": "n", + "rhs": "]s" + }, + { + "desc": "Force Write", + "noremap": true, + "lhs": "wf", + "mode": "n", + "rhs": "lua require'utils'.sudo_write()" + }, + { + "desc": "Spellcheck", + "noremap": true, + "lhs": "wc", + "mode": "n", + "rhs": "set spell!" + }, + { + "desc": "Quote", + "noremap": true, + "lhs": "vq", + "mode": "n", + "rhs": "viq" + }, + { + "desc": "Paragraph", + "noremap": true, + "lhs": "vp", + "mode": "n", + "rhs": "vip" + }, + { + "desc": "Bracket", + "noremap": true, + "lhs": "vb", + "mode": "n", + "rhs": "vib" + }, + { + "desc": "Around Quote", + "noremap": true, + "lhs": "vQ", + "mode": "n", + "rhs": "vaq" + }, + { + "desc": "Around Para", + "noremap": true, + "lhs": "vP", + "mode": "n", + "rhs": "vap" + }, + { + "desc": "Around Bracket", + "noremap": true, + "lhs": "vB", + "mode": "n", + "rhs": "vab" + }, + { + "desc": "Vertical Split", + "noremap": true, + "lhs": "ss", + "mode": "n", + "rhs": "vsplit" + }, + { + "desc": "Close Split", + "noremap": true, + "lhs": "sq", + "mode": "n", + "rhs": "c" + }, + { + "desc": "Previous Pane", + "noremap": true, + "lhs": "sp", + "mode": "n", + "rhs": "NavigatorPrevious" + }, + { + "desc": "Move Right", + "noremap": true, + "lhs": "sl", + "mode": "n", + "rhs": "l" + }, + { + "desc": "Move Up", + "noremap": true, + "lhs": "sk", + "mode": "n", + "rhs": "k" + }, + { + "desc": "Move Down", + "noremap": true, + "lhs": "sj", + "mode": "n", + "rhs": "j" + }, + { + "desc": "Move Left", + "noremap": true, + "lhs": "sh", + "mode": "n", + "rhs": "h" + }, + { + "desc": "First Tab", + "noremap": true, + "lhs": "sf", + "mode": "n", + "rhs": "tabfirst" + }, + { + "desc": "Dismiss All Notifications", + "noremap": true, + "lhs": "mn", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Hardtime", + "noremap": true, + "lhs": "ch", + "mode": "n", + "rhs": "HardtimeToggle" + }, + { + "desc": "Don't Save Current Session", + "noremap": true, + "lhs": "md", + "mode": "n", + "rhs": "" + }, + { + "desc": "Restore Last Session", + "noremap": true, + "lhs": "ml", + "mode": "n", + "rhs": "" + }, + { + "desc": "Restore Session", + "noremap": true, + "lhs": "ms", + "mode": "n", + "rhs": "" + }, + { + "desc": "Marked", + "noremap": true, + "lhs": "Cm", + "mode": "n", + "rhs": "" + }, + { + "desc": "Line", + "noremap": true, + "lhs": "Cl", + "mode": "n", + "rhs": "" + }, + { + "desc": "Tiled line", + "noremap": true, + "lhs": "Ct", + "mode": "v", + "rhs": "" + }, + { + "desc": "Tiled line", + "noremap": true, + "lhs": "Ct", + "mode": "n", + "rhs": "" + }, + { + "desc": "Comment Box", + "noremap": true, + "lhs": "Cb", + "mode": "v", + "rhs": "" + }, + { + "desc": "Comment Box", + "noremap": true, + "lhs": "Cb", + "mode": "n", + "rhs": "" + }, + { + "desc": "Delete Comment Style", + "noremap": true, + "lhs": "Cd", + "mode": "v", + "rhs": "" + }, + { + "desc": "Delete Comment Style", + "noremap": true, + "lhs": "Cd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Catalog", + "noremap": true, + "lhs": "Cc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Marked", + "noremap": true, + "lhs": "Cm", + "mode": "v", + "rhs": "" + }, + { + "desc": "Diagnostics", + "noremap": true, + "lhs": "fd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Search History", + "noremap": true, + "lhs": "ks", + "mode": "n", + "rhs": "" + }, + { + "desc": "Command History", + "noremap": true, + "lhs": "kh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Commands", + "noremap": true, + "lhs": "kc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Keymaps", + "noremap": true, + "lhs": "kk", + "mode": "n", + "rhs": "" + }, + { + "desc": "Grep String", + "noremap": true, + "lhs": "fG", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Highlight Groups", + "noremap": true, + "lhs": "fH", + "mode": "n", + "rhs": "" + }, + { + "desc": "Marks", + "noremap": true, + "lhs": "fm", + "mode": "n", + "rhs": "" + }, + { + "desc": "Old Recent Files", + "noremap": true, + "lhs": "fo", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Help", + "noremap": true, + "lhs": "fh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Buffers", + "noremap": true, + "lhs": "fb", + "mode": "n", + "rhs": "" + }, + { + "desc": "Live Grep", + "noremap": true, + "lhs": "fg", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Files (CWD)", + "noremap": true, + "lhs": "ff", + "mode": "n", + "rhs": "" + }, + { + "desc": "File Browser", + "noremap": true, + "lhs": "ef", + "mode": "n", + "rhs": "" + }, + { + "desc": "Fuzzy Find in File", + "noremap": true, + "lhs": "fs", + "mode": "n", + "rhs": "" + }, + { + "desc": "Quickfix", + "noremap": true, + "lhs": "fq", + "mode": "n", + "rhs": "" + }, + { + "desc": "Undo History", + "noremap": true, + "lhs": "fu", + "mode": "n", + "rhs": "" + }, + { + "desc": "Notifications", + "noremap": true, + "lhs": "cn", + "mode": "n", + "rhs": "" + }, + { + "desc": "Run Current Test", + "noremap": true, + "lhs": "uc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Output Panel", + "noremap": true, + "lhs": "uO", + "mode": "n", + "rhs": "" + }, + { + "desc": "Stop", + "noremap": true, + "lhs": "us", + "mode": "n", + "rhs": "" + }, + { + "desc": "Run Nearest Test", + "noremap": true, + "lhs": "ur", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Summary", + "noremap": true, + "lhs": "uS", + "mode": "n", + "rhs": "" + }, + { + "desc": "Show Output", + "noremap": true, + "lhs": "uo", + "mode": "n", + "rhs": "" + }, + { + "desc": "Run Test File", + "noremap": true, + "lhs": "uf", + "mode": "n", + "rhs": "" + }, + { + "desc": "toggle markdown preview", + "noremap": true, + "lhs": "cm", + "mode": "n", + "rhs": "" + }, + { + "desc": "DB Last query", + "noremap": true, + "lhs": "dl", + "mode": "n", + "rhs": "" + }, + { + "desc": "DB Rename buffer", + "noremap": true, + "lhs": "dr", + "mode": "n", + "rhs": "" + }, + { + "desc": "DB Find buffer", + "noremap": true, + "lhs": "db", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle DB UI", + "noremap": true, + "lhs": "du", + "mode": "n", + "rhs": "" + }, + { + "desc": "Reload Module", + "noremap": true, + "lhs": "cr", + "mode": "n", + "rhs": "" + }, + { + "desc": "Vertical Terminal", + "noremap": true, + "lhs": "tv", + "mode": "n", + "rhs": "" + }, + { + "desc": "Horizontal Terminal", + "noremap": true, + "lhs": "th", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Terminal", + "noremap": true, + "lhs": "t1", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Terminal", + "noremap": true, + "lhs": "t2", + "mode": "n", + "rhs": "" + }, + { + "desc": "toggle barbecue", + "noremap": true, + "lhs": "bq", + "mode": "n", + "rhs": "" + }, + { + "desc": "Find Notes", + "noremap": true, + "lhs": "ng", + "mode": "n", + "rhs": "" + }, + { + "desc": "All Notes", + "noremap": true, + "lhs": "nf", + "mode": "n", + "rhs": "" + }, + { + "desc": "Today's Entry", + "noremap": true, + "lhs": "ne", + "mode": "n", + "rhs": "" + }, + { + "desc": "Today's Todo", + "noremap": true, + "lhs": "nd", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle Todo", + "noremap": true, + "lhs": "nx", + "mode": "n", + "rhs": "" + }, + { + "desc": "Incomplete Todos", + "noremap": true, + "lhs": "nt", + "mode": "n", + "rhs": "" + }, + { + "desc": "New Note", + "noremap": true, + "lhs": "nn", + "mode": "n", + "rhs": "" + }, + { + "desc": "Tomorrow's Todo", + "noremap": true, + "lhs": "nl", + "mode": "n", + "rhs": "" + }, + { + "desc": "Yesterday's Todo", + "noremap": true, + "lhs": "nh", + "mode": "n", + "rhs": "" + }, + { + "desc": "Location List (Trouble)", + "noremap": true, + "lhs": "xL", + "mode": "n", + "rhs": "" + }, + { + "desc": "LSP references/definitions/... (Trouble)", + "noremap": true, + "lhs": "xS", + "mode": "n", + "rhs": "" + }, + { + "desc": "Symbols (Trouble)", + "noremap": true, + "lhs": "xs", + "mode": "n", + "rhs": "" + }, + { + "desc": "Buffer Diagnostics (Trouble)", + "noremap": true, + "lhs": "xX", + "mode": "n", + "rhs": "" + }, + { + "desc": "Diagnostics (Trouble)", + "noremap": true, + "lhs": "xx", + "mode": "n", + "rhs": "" + }, + { + "desc": "Quickfix List (Trouble)", + "noremap": true, + "lhs": "xQ", + "mode": "n", + "rhs": "" + }, + { + "desc": "Breakpoint", + "noremap": true, + "lhs": "bb", + "mode": "n", + "rhs": "" + }, + { + "desc": "Restart Frame", + "noremap": true, + "lhs": "bR", + "mode": "n", + "rhs": "" + }, + { + "desc": "Out", + "noremap": true, + "lhs": "bO", + "mode": "n", + "rhs": "" + }, + { + "desc": "Exit", + "noremap": true, + "lhs": "bx", + "mode": "n", + "rhs": "" + }, + { + "desc": "Debugger", + "noremap": true, + "lhs": "bt", + "mode": "n", + "rhs": "" + }, + { + "desc": "Repl", + "noremap": true, + "lhs": "br", + "mode": "n", + "rhs": "" + }, + { + "desc": "Over", + "noremap": true, + "lhs": "bo", + "mode": "n", + "rhs": "" + }, + { + "desc": "Last", + "noremap": true, + "lhs": "bl", + "mode": "n", + "rhs": "" + }, + { + "desc": "Into", + "noremap": true, + "lhs": "bi", + "mode": "n", + "rhs": "" + }, + { + "desc": "Continue", + "noremap": true, + "lhs": "bc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Relative Path", + "noremap": true, + "lhs": "yp", + "mode": "n", + "rhs": "" + }, + { + "desc": "Copy Git URL", + "noremap": true, + "lhs": "yg", + "mode": "n", + "rhs": "" + }, + { + "desc": "File Name", + "noremap": true, + "lhs": "yf", + "mode": "n", + "rhs": "" + }, + { + "desc": "Copy Whole File", + "noremap": true, + "lhs": "ya", + "mode": "n", + "rhs": "" + }, + { + "desc": "Absolute Path", + "noremap": true, + "lhs": "yP", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle zen mode", + "noremap": true, + "lhs": "wz", + "mode": "n", + "rhs": "" + }, + { + "desc": "Maximize/minimize a split", + "noremap": true, + "lhs": "mm", + "mode": "n", + "rhs": "" + }, + { + "desc": "Replace in Files (Spectre)", + "noremap": true, + "lhs": "mr", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle keys", + "noremap": true, + "lhs": "kt", + "mode": "n", + "rhs": "Screenkey" + }, + { + "desc": " Insert Macro Breakpoint.", + "noremap": true, + "lhs": "##", + "mode": "n", + "rhs": "" + }, + { + "desc": ":help v_#-default", + "noremap": true, + "lhs": "#", + "mode": "x", + "rhs": "" + }, + { + "desc": ":help &-default", + "noremap": true, + "lhs": "&", + "mode": "n", + "rhs": ":&&" + }, + { + "desc": ":help v_star-default", + "noremap": true, + "lhs": "*", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": ",", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": ",", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "-", "mode": "x", "rhs": "" }, + { + "desc": "", + "noremap": true, + "lhs": "-", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": ";", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": ";", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "<", "mode": "v", "rhs": "gv" }, + { "desc": "", "noremap": true, "lhs": "=", "mode": "x", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": "=", "mode": "n", "rhs": "" }, + { "desc": "", "noremap": true, "lhs": ">", "mode": "v", "rhs": ">gv" }, + { + "desc": ":help v_@-default", + "noremap": true, + "lhs": "@", + "mode": "x", + "rhs": "mode() ==# 'V' ? ':normal! @'.getcharstr().'' : '@'" + }, + { + "desc": "", + "noremap": true, + "lhs": "F", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "F", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "J", + "mode": "x", + "rhs": ":move '>+1gv-gv" + }, + { "desc": "", "noremap": true, "lhs": "J", "mode": "n", "rhs": "mzJ`z" }, + { + "desc": "LSP Hover", + "noremap": true, + "lhs": "K", + "mode": "n", + "rhs": "Lspsaga hover_doc" + }, + { + "desc": "", + "noremap": true, + "lhs": "K", + "mode": "x", + "rhs": ":move '-2gv-gv" + }, + { + "desc": "Prev search result", + "noremap": true, + "lhs": "N", + "mode": "x", + "rhs": "'nN'[v:searchforward]" + }, + { + "desc": "Prev search result", + "noremap": true, + "lhs": "N", + "mode": "n", + "rhs": "'nN'[v:searchforward]" + }, + { + "desc": "Put yanked text before cursor", + "noremap": true, + "lhs": "P", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put yanked text before cursor", + "noremap": true, + "lhs": "P", + "mode": "x", + "rhs": "" + }, + { + "desc": " Play Macro", + "noremap": true, + "lhs": "Q", + "mode": "n", + "rhs": "" + }, + { + "desc": ":help v_Q-default", + "noremap": true, + "lhs": "Q", + "mode": "x", + "rhs": "mode() ==# 'V' ? ':normal! @=reg_recorded()' : 'Q'" + }, + { + "desc": "", + "noremap": true, + "lhs": "T", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "T", + "mode": "n", + "rhs": "" + }, + { + "desc": "Redo", + "noremap": true, + "lhs": "U", + "mode": "n", + "rhs": "redo" + }, + { + "desc": ":help Y-default", + "noremap": true, + "lhs": "Y", + "mode": "n", + "rhs": "y$" + }, + { + "desc": "First Buffer", + "noremap": true, + "lhs": "[B", + "mode": "n", + "rhs": "bfirst" + }, + { + "desc": "Buffer", + "noremap": true, + "lhs": "[b", + "mode": "n", + "rhs": "bprevious" + }, + { + "desc": "Diagnostic", + "noremap": true, + "lhs": "[d", + "mode": "n", + "rhs": "Lspsaga diagnostic_jump_prev" + }, + { "desc": "Edit", "noremap": true, "lhs": "[e", "mode": "n", "rhs": "g;" }, + { + "desc": "Jump", + "noremap": true, + "lhs": "[j", + "mode": "n", + "rhs": "" + }, + { + "desc": "Previous Trouble/Quickfix Item", + "noremap": true, + "lhs": "[q", + "mode": "n", + "rhs": "" + }, + { + "desc": "Buffer", + "noremap": true, + "lhs": "]B", + "mode": "n", + "rhs": "blast" + }, + { + "desc": "Buffer", + "noremap": true, + "lhs": "]b", + "mode": "n", + "rhs": "bnext" + }, + { + "desc": "Diagnostic", + "noremap": true, + "lhs": "]d", + "mode": "n", + "rhs": "Lspsaga diagnostic_jump_next" + }, + { "desc": "Edit", "noremap": true, "lhs": "]e", "mode": "n", "rhs": "g," }, + { + "desc": "Jump", + "noremap": true, + "lhs": "]j", + "mode": "n", + "rhs": "" + }, + { + "desc": "Next Trouble/Quickfix Item", + "noremap": true, + "lhs": "]q", + "mode": "n", + "rhs": "" + }, + { + "desc": " Edit Macro", + "noremap": true, + "lhs": "cq", + "mode": "n", + "rhs": "" + }, + { + "desc": " Delete All Macros", + "noremap": true, + "lhs": "dq", + "mode": "n", + "rhs": "" + }, + { + "desc": "Don't Yank Empty Line to Clipboard", + "noremap": true, + "lhs": "dd", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "f", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "f", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put yanked text after selection", + "noremap": true, + "lhs": "gp", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put yanked text before selection", + "noremap": true, + "lhs": "gP", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put yanked text before selection", + "noremap": true, + "lhs": "gP", + "mode": "x", + "rhs": "" + }, + { + "desc": "Put yanked text after selection", + "noremap": true, + "lhs": "gp", + "mode": "x", + "rhs": "" + }, + { + "desc": "Beginning of line", + "noremap": true, + "lhs": "gh", + "mode": "x", + "rhs": "^" + }, + { + "desc": "Beginning of line", + "noremap": true, + "lhs": "gh", + "mode": "n", + "rhs": "^" + }, + { + "desc": "End of line", + "noremap": true, + "lhs": "gl", + "mode": "x", + "rhs": "$" + }, + { + "desc": "End of line", + "noremap": true, + "lhs": "gl", + "mode": "n", + "rhs": "$" + }, + { + "desc": "Toggle comment line", + "noremap": true, + "lhs": "gcc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Toggle comment", + "noremap": true, + "lhs": "gc", + "mode": "x", + "rhs": "" + }, + { + "desc": "Toggle comment", + "noremap": true, + "lhs": "gc", + "mode": "n", + "rhs": "" + }, + { + "desc": "Opens filepath or URI under cursor with the system handler (file explorer, web browser, …)", + "noremap": true, + "lhs": "gx", + "mode": "x", + "rhs": "" + }, + { + "desc": "Opens filepath or URI under cursor with the system handler (file explorer, web browser, …)", + "noremap": true, + "lhs": "gx", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "j", + "mode": "n", + "rhs": "v:count == 0 ? 'gj' : 'j'" + }, + { + "desc": "", + "noremap": true, + "lhs": "k", + "mode": "n", + "rhs": "v:count == 0 ? 'gk' : 'k'" + }, + { + "desc": "Next search result", + "noremap": true, + "lhs": "n", + "mode": "x", + "rhs": "'Nn'[v:searchforward]" + }, + { + "desc": "Next search result", + "noremap": true, + "lhs": "n", + "mode": "n", + "rhs": "'Nn'[v:searchforward]" + }, + { + "desc": "Put yanked text after cursor", + "noremap": true, + "lhs": "p", + "mode": "n", + "rhs": "" + }, + { + "desc": "Put yanked text after cursor", + "noremap": true, + "lhs": "p", + "mode": "x", + "rhs": "" + }, + { + "desc": " Start/Stop Recording", + "noremap": true, + "lhs": "q", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "t", + "mode": "x", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "t", + "mode": "n", + "rhs": "" + }, + { "desc": "", "noremap": true, "lhs": "x", "mode": "x", "rhs": "\"_x" }, + { + "desc": " Yank Macro", + "noremap": true, + "lhs": "yq", + "mode": "n", + "rhs": "" + }, + { + "desc": "Yank text", + "noremap": true, + "lhs": "y", + "mode": "n", + "rhs": "" + }, + { + "desc": "Yank text", + "noremap": true, + "lhs": "y", + "mode": "x", + "rhs": "" + }, + { + "desc": " Switch Macro Slot", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "Previous Buffer", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "bprevious" + }, + { + "desc": "Find browser", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "Telescope file_browser" + }, + { + "desc": "Find Files", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "Telescope find_files" + }, + { + "desc": "Increase window height", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "resize +10" + }, + { + "desc": "Increase window width", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "vertical resize +10" + }, + { + "desc": "Decrease window width", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "vertical resize -10" + }, + { + "desc": "Decrease window height", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "resize -10" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "zz" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "zz" + }, + { "desc": "", "noremap": true, "lhs": "", "mode": "n", "rhs": "ggVG" }, + { + "desc": "Show diagnostics under the cursor", + "noremap": false, + "lhs": "", + "mode": "n", + "rhs": "d" + }, + { + "desc": "Show diagnostics under the cursor", + "noremap": true, + "lhs": "d", + "mode": "n", + "rhs": "" + }, + { + "desc": "", + "noremap": true, + "lhs": "", + "mode": "n", + "rhs": "" + } + ], + "treesitterParsers": [ + "bash", + "c", + "cpp", + "css", + "html", + "java", + "javascript", + "json", + "lua", + "markdown", + "markdown_inline", + "python", + "scss", + "toml", + "tsx", + "typescript", + "vim", + "vimdoc" + ], + "lspServers": [ + "bashls", + "clangd", + "cssls", + "html", + "lua_ls", + "pyright", + "svelte", + "tailwindcss", + "tsserver" + ], + "leaderKey": "" +} diff --git a/init.lua b/init.lua index 8f59cb0..ee117dc 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,5 @@ -require('config.keymaps') -require('config.options') -require('config.lazy') -require('config.autocmd') +require('core.keymaps') +require('core.options') +require('core.functions') +require('core.lazy') +require('core.autocmd') diff --git a/lua/config/keymaps.lua b/lua/config/keymaps.lua deleted file mode 100644 index 17d4077..0000000 --- a/lua/config/keymaps.lua +++ /dev/null @@ -1,110 +0,0 @@ --- Increment / Decrement -vim.keymap.set('n', '+', '') -vim.keymap.set('n', '-', '') - --- Select all -vim.keymap.set('n', '', 'ggG') - --- Replace currently selected text with default register without yanking it -vim.keymap.set('x', 'p', '"_dP') - --- Delete and change without yanking -vim.keymap.set({ 'n', 'x' }, '', '"_d', { desc = 'Delete Without Yanking' }) -vim.keymap.set({ 'n', 'x' }, '', '"_c', { desc = 'Change Without Yanking' }) - --- Deleting without yanking empty line -vim.keymap.set('n', 'dd', function() - local is_empty_line = vim.api.nvim_get_current_line():match('^%s*$') - if is_empty_line then - return '"_dd' - else - return 'dd' - end -end, { noremap = true, expr = true, desc = "Don't Yank Empty Line to Clipboard" }) - --- Search inside visually highlighted text -vim.keymap.set('x', 'g/', '/\\%V', { silent = false, desc = 'Search Inside Visual Selection' }) - --- Search visually selected text (slightly better than builtins in Neovim>=0.8) -vim.keymap.set('x', '*', [[y/\V=escape(@", '/\')]], { desc = 'Search Selected Text', silent = true }) -vim.keymap.set( - 'x', - '#', - [[y?\V=escape(@", '?\')]], - { desc = 'Search Selected Text (Backwards)', silent = true } -) - --- save file -vim.keymap.set('n', 'w', ':w', { desc = 'Save file' }) - --- save and quit -vim.keymap.set('n', 'Q', 'wq!', { desc = 'Force save and quit' }) - --- Clear highlights on search when pressing in normal mode -vim.keymap.set('n', '', 'nohlsearch') - --- Visual vim.keymap.sets -vim.keymap.set('v', 'r', '"hy:%s/h//g') -- Replace all instances of highlighted words -vim.keymap.set('v', '', ':sort') -- Sort highlighted text in visual mode with Control+S -vim.keymap.set('v', 'K', ":m '>-2gv=gv") -- Move current line up -vim.keymap.set('v', 'J', ":m '>+1gv=gv") -- Move current line down - --- for buffers -vim.api.nvim_set_keymap('n', '', ':bnext', { noremap = true, silent = true }) -vim.api.nvim_set_keymap('n', '', ':bprev', { noremap = true, silent = true }) - ---utility vim.keymap.setpings -vim.keymap.set('n', 'n', 'nzzzv') -- keep the cursor centered when doing 'n' -vim.keymap.set('n', 'N', 'Nzzzv') -- keep the cursor centered when doing 'N' -vim.keymap.set('n', 'J', 'mzJ`z', { desc = 'Join line without moving the cursor' }) -vim.keymap.set('n', 'cn', '*``cgn', { desc = 'Change next match by pressing dot (.)' }) -vim.keymap.set('n', 'cN', '*``cgN', { desc = 'Change previous match by pressing dot (.)' }) -vim.keymap.set('n', 'vp', '`[v`]', { desc = 'Select pasted text' }) -vim.keymap.set('n', '', 'zz', { desc = 'Scroll down' }) -vim.keymap.set('n', '', 'zz', { desc = 'Scroll up' }) - -vim.keymap.set({ 'n', 'v' }, 'y', '"+y', { desc = 'Copy to system clipboard' }) -vim.keymap.set({ 'n', 'v' }, 'p', '"+p', { desc = 'Paste from system clipboard' }) - -vim.keymap.set({ 'i' }, '', '', { desc = 'Move cursor to right' }) -vim.keymap.set({ 'i' }, '', '', { desc = 'Move cursor to right' }) - --- Better window management -vim.keymap.set('n', 'vs', ':vsp', { noremap = true, silent = true }) -vim.keymap.set('n', 'hs', ':sp', { noremap = true, silent = true }) -vim.keymap.set('n', '', 'h', { desc = 'Move to left split' }) -vim.keymap.set('n', '', 'j', { desc = 'Move to below split' }) -vim.keymap.set('n', '', 'k', { desc = 'Move to above split' }) -vim.keymap.set('n', '', 'l', { desc = 'Move to right split' }) -vim.keymap.set('n', '', 'resize -2', { desc = 'Resize split up' }) -vim.keymap.set('n', '', 'resize +2', { desc = 'Resize split down' }) -vim.keymap.set('n', '', 'vertical resize -2', { desc = 'Resize split left' }) -vim.keymap.set('n', '', 'vertical resize +2', { desc = 'Resize split right' }) - --- Stay in indent mode -vim.keymap.set('v', '<', '', '>gv', { desc = '(V) Indent to right' }) - -vim.keymap.set('n', 'lo', 'lopen', { desc = 'Open location list' }) -vim.keymap.set('n', 'lc', 'lclose', { desc = 'Close location list' }) -vim.keymap.set('n', 'ln', 'lnext', { desc = 'Next location list item' }) -vim.keymap.set('n', 'lp', 'lprev', { desc = 'Previous location list item' }) - --- insert semicolon in the end -vim.keymap.set('i', '', 'miA;`ii', { desc = 'insert semicolon in the end' }) - --- Change text without putting it into the vim register, -vim.keymap.set({ 'n', 'x' }, 'c', '"_c', { desc = 'Change without yanking' }) -vim.keymap.set({ 'n', 'x' }, 'C', '"_C', { desc = 'Change without yanking' }) -vim.keymap.set({ 'n', 'x' }, 'cc', '"_cc', { desc = 'Change without yanking' }) -vim.keymap.set({ 'n', 'x' }, 'x', '"_x', { desc = 'delete without yanking' }) - --- Better escape using jk in insert and terminal mode -vim.keymap.set('i', 'jk', '') -vim.keymap.set('i', 'kj', '') -vim.keymap.set('i', 'jj', '') - --- Terminal Mappings -vim.keymap.set('t', 'jk', '') -vim.keymap.set('t', 'kj', '') -vim.keymap.set('t', '', '') diff --git a/lua/plugins/alpha.lua b/lua/configs/alpha.lua similarity index 64% rename from lua/plugins/alpha.lua rename to lua/configs/alpha.lua index af7e71e..8172ed1 100644 --- a/lua/plugins/alpha.lua +++ b/lua/configs/alpha.lua @@ -45,39 +45,32 @@ local function footer() line3, } end +local alpha = require('alpha') +local dashboard = require('alpha.themes.dashboard') -return { - 'goolord/alpha-nvim', - event = 'VimEnter', - dependencies = { 'nvim-tree/nvim-web-devicons' }, - config = function() - local alpha = require('alpha') - local dashboard = require('alpha.themes.dashboard') +dashboard.section.header.val = header() +dashboard.section.footer.val = footer() - dashboard.section.header.val = header() - dashboard.section.footer.val = footer() - - -- Menu - -- TODO: Add projects and Frecency? - dashboard.section.buttons.val = { - dashboard.button('e', ' New file', ':ene startinsert'), - dashboard.button('f', ' Find files', 'Telescope find_files'), - dashboard.button('t', '󰊄 Find text', 'Telescope live_grep'), - dashboard.button('r', '󰔠 Recent files', 'Telescope oldfiles'), - dashboard.button('p', '󱠏 Projects', 'Telescope projects'), - dashboard.button('c', ' Config', 'e $MYVIMRC'), - dashboard.button('l', ' Plugins', 'Lazy'), - dashboard.button('q', ' Quit', 'qa'), - } - - alpha.setup(dashboard.config) - -- Update the footer after all plugins are fully loaded - vim.api.nvim_create_autocmd('User', { - pattern = 'LazyVimStarted', - callback = function() - dashboard.section.footer.val = footer() - pcall(vim.cmd, 'AlphaRedraw') - end, - }) - end, +-- Menu +-- TODO: Add projects and Frecency? +dashboard.section.buttons.val = { + dashboard.button('e', ' New file', ':ene startinsert'), + dashboard.button('f', ' Find files', 'Telescope find_files'), + dashboard.button('t', '󰊄 Find text', 'Telescope live_grep'), + dashboard.button('F', ' File browser', 'Telescope file_browser'), + dashboard.button('r', '󰔠 Recent files', 'Telescope oldfiles'), + dashboard.button('s', ' Open last session', ':lua require("persistence").load({ last = true })'), + dashboard.button('c', ' Config', 'e $MYVIMRC'), + dashboard.button('l', ' Plugins', 'Lazy'), + dashboard.button('q', ' Quit', 'qa'), } + +alpha.setup(dashboard.config) +-- Update the footer after all plugins are fully loaded +vim.api.nvim_create_autocmd('User', { + pattern = 'LazyVimStarted', + callback = function() + dashboard.section.footer.val = footer() + pcall(vim.cmd, 'AlphaRedraw') + end, +}) diff --git a/lua/configs/cmp.lua b/lua/configs/cmp.lua new file mode 100644 index 0000000..5e5ceac --- /dev/null +++ b/lua/configs/cmp.lua @@ -0,0 +1,90 @@ +local cmp = require('cmp') +local luasnip = require('luasnip') +require('luasnip/loaders/from_vscode').lazy_load() + +cmp.setup({ + completion = { + keyword_length = 1, + completeopt = 'menu,menuone', + }, + window = { + completion = cmp.config.window.bordered(), + documentation = cmp.config.window.bordered(), + }, + formatting = { + fields = { 'kind', 'abbr', 'menu' }, + format = function(entry, vim_item) + local kind = require('lspkind').cmp_format({ mode = 'symbol_text', maxwidth = 50 })(entry, vim_item) + local strings = vim.split(kind.kind, '%s', { trimempty = true }) + kind.kind = ' ' .. (strings[1] or '') .. ' ' + kind.menu = ' (' .. (strings[2] or '') .. ')' + + return kind + end, + }, + snippet = { -- configure how nvim-cmp interacts with snippet engine + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + mapping = { + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping(cmp.mapping.scroll_docs(-1), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.scroll_docs(1), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.config.disable, + [''] = cmp.mapping({ + i = cmp.mapping.abort(), + c = cmp.mapping.close(), + }), + [''] = cmp.mapping.confirm({ + behavior = cmp.ConfirmBehavior.Replace, + select = false, + }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expandable() then + luasnip.expand() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, { 'i', 's' }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { 'i', 's' }), + }, + cmp.setup.cmdline(':', { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = 'cmdline' }, + }, + }), + cmp.setup.cmdline('/', { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = 'buffer' }, + }, + }), + -- sources for autocompletion + sources = { + { name = 'nvim_lsp' }, + { name = 'luasnip' }, -- snippets + { name = 'buffer' }, -- text within current buffer + { name = 'path' }, -- file system paths + { name = 'codeium' }, -- AI for autocompletion + -- { name = "nvim_lsp_signature_help" }, + -- { name = "calc" }, --for maths calculations + }, +}) diff --git a/lua/configs/lsp.lua b/lua/configs/lsp.lua new file mode 100644 index 0000000..1feb91b --- /dev/null +++ b/lua/configs/lsp.lua @@ -0,0 +1,172 @@ +local lspconfig = require('lspconfig') +-- import cmp-nvim-lsp plugin +local cmp_nvim_lsp = require('cmp_nvim_lsp') + +local keymap = vim.keymap -- for conciseness + +vim.api.nvim_create_autocmd('LspAttach', { + group = vim.api.nvim_create_augroup('UserLspConfig', {}), + callback = function(ev) + -- Buffer local mappings. + -- See `:help vim.lsp.*` for documentation on any of the below functions + local opts = { buffer = ev.buf, silent = true } + + -- set keybinds + opts.desc = 'Show LSP references' + keymap.set('n', 'lR', 'Telescope lsp_references', opts) -- show definition, references + + opts.desc = 'Go to declaration' + keymap.set('n', 'lD', vim.lsp.buf.declaration, opts) -- go to declaration + + opts.desc = 'Show LSP definitions' + keymap.set('n', 'ld', 'Telescope lsp_definitions', opts) -- show lsp definitions + + opts.desc = 'Show LSP implementations' + keymap.set('n', 'li', 'Telescope lsp_implementations', opts) -- show lsp implementations + + opts.desc = 'Show LSP type definitions' + keymap.set('n', 'lt', 'Telescope lsp_type_definitions', opts) -- show lsp type definitions + + opts.desc = 'See available code actions' + keymap.set({ 'n', 'v' }, 'la', vim.lsp.buf.code_action, opts) -- see available code actions, in visual mode will apply to selection + + opts.desc = 'Smart rename' + keymap.set('n', 'mr', vim.lsp.buf.rename, opts) -- smart rename + + opts.desc = 'Show buffer diagnostics' + keymap.set('n', 'lD', 'Telescope diagnostics bufnr=0', opts) -- show diagnostics for file + + opts.desc = 'Show line diagnostics' + keymap.set('n', 'ld', vim.diagnostic.open_float, opts) -- show diagnostics for line + + opts.desc = 'Show documentation for what is under cursor' + keymap.set('n', 'K', vim.lsp.buf.hover, opts) -- show documentation for what is under cursor + + opts.desc = 'Restart LSP' + keymap.set('n', 'ls', ':LspRestart', opts) -- mapping to restart lsp if necessary + end, +}) + +-- used to enable autocompletion (assign to every lsp server config) +local capabilities = cmp_nvim_lsp.default_capabilities() + +-- configure matlab server +lspconfig['clangd'].setup({ + capabilities = capabilities, + on_attach = on_attach, +}) +-- configure bash server +lspconfig['bashls'].setup({ + capabilities = capabilities, + on_attach = on_attach, +}) +-- configure html server +lspconfig['html'].setup({ + capabilities = capabilities, + on_attach = on_attach, +}) +-- configure typescript server with plugin +lspconfig['tsserver'].setup({ + capabilities = capabilities, + on_attach = on_attach, +}) + +-- configure css server +lspconfig['cssls'].setup({ + capabilities = capabilities, + on_attach = on_attach, +}) + +-- configure tailwindcss server +lspconfig['tailwindcss'].setup({ + capabilities = capabilities, + on_attach = on_attach, +}) + +-- configure svelte server +lspconfig['svelte'].setup({ + capabilities = capabilities, + on_attach = function(client, bufnr) + on_attach(client, bufnr) + + vim.api.nvim_create_autocmd('BufWritePost', { + pattern = { '*.js', '*.ts' }, + callback = function(ctx) + if client.name == 'svelte' then + client.notify('$/onDidChangeTsOrJsFile', { uri = ctx.file }) + end + end, + }) + end, +}) + +-- configure prisma orm server +lspconfig['prismals'].setup({ + capabilities = capabilities, + on_attach = on_attach, +}) + +-- configure emmet language server +lspconfig['emmet_ls'].setup({ + capabilities = capabilities, + on_attach = on_attach, + filetypes = { 'html', 'typescriptreact', 'javascriptreact', 'css', 'sass', 'scss', 'less', 'svelte' }, +}) + +-- configure python server +lspconfig['pyright'].setup({ + capabilities = capabilities, + on_attach = on_attach, +}) + +-- configure lua server (with special settings) +lspconfig['lua_ls'].setup({ + capabilities = capabilities, + on_attach = on_attach, + settings = { -- custom settings for lua + Lua = { + -- make the language server recognize "vim" global + diagnostics = { + globals = { 'vim' }, + }, + workspace = { + -- make language server aware of runtime files + library = { + [vim.fn.expand('$VIMRUNTIME/lua')] = true, + [vim.fn.stdpath('config') .. '/lua'] = true, + }, + }, + }, + }, +}) + +local x = vim.diagnostic.severity +local config = { + -- Enable virtual text + virtual_text = { -- or false for disable + prefix = '', -- ■  󰊠 + suffix = '', + format = function(diagnostic) + local prefix = '󰊠 ' + local suffix = ' ' + -- return full message with custom prefix & suffix + return prefix .. diagnostic.message .. suffix + end, + }, + update_in_insert = true, + signs = { text = { [x.ERROR] = '', [x.WARN] = '', [x.HINT] = '󰌵', [x.INFO] = '' } }, + underline = false, + severity_sort = true, + float = { + focusable = false, + style = 'minimal', + border = 'rounded', + source = 'always', + header = '', + prefix = '', + }, +} + +vim.diagnostic.config(config) +-- add borders to lsp info window +require('lspconfig.ui.windows').default_options.border = 'single' diff --git a/lua/configs/lualine.lua b/lua/configs/lualine.lua new file mode 100644 index 0000000..44e0cba --- /dev/null +++ b/lua/configs/lualine.lua @@ -0,0 +1,198 @@ +local lualine = require('lualine') + +-- Color table for highlights + -- stylua: ignore + local colors = { + bg = 'none', + fg = '#bbc2cf', + yellow = '#ECBE7B', + cyan = '#008080', + darkblue = '#081633', + green = '#98be65', + orange = '#FF8800', + violet = '#a9a1e1', + magenta = '#c678dd', + blue = '#51afef', + red = '#ec5f67', + } + +local conditions = { + buffer_not_empty = function() + return vim.fn.empty(vim.fn.expand('%:t')) ~= 1 + end, + hide_in_width = function() + return vim.fn.winwidth(0) > 80 + end, + check_git_workspace = function() + local filepath = vim.fn.expand('%:p:h') + local gitdir = vim.fn.finddir('.git', filepath .. ';') + return gitdir and #gitdir > 0 and #gitdir < #filepath + end, +} + +-- Config +local config = { + options = { + -- Disable sections and component separators + component_separators = '', + section_separators = '', + disabled_filetypes = { + 'NeoTree', + 'NvimTree', + 'Outline', + 'alpha', + }, + theme = { + -- We are going to use lualine_c an lualine_x as left and + -- right section. Both are highlighted by c theme . So we + -- are just setting default looks o statusline + normal = { c = { fg = colors.fg, bg = colors.bg } }, + inactive = { c = { fg = colors.fg, bg = colors.bg } }, + }, + }, + sections = { + -- these are to remove the defaults + lualine_a = {}, + lualine_b = {}, + lualine_y = {}, + lualine_z = {}, + -- These will be filled later + lualine_c = {}, + lualine_x = {}, + }, + inactive_sections = { + -- these are to remove the defaults + lualine_a = {}, + lualine_b = {}, + lualine_y = {}, + lualine_z = {}, + lualine_c = {}, + lualine_x = {}, + }, +} + +-- Inserts a component in lualine_c at left section +local function ins_left(component) + table.insert(config.sections.lualine_c, component) +end + +-- Inserts a component in lualine_x at right section +local function ins_right(component) + table.insert(config.sections.lualine_x, component) +end + +ins_left({ + function() + return '▊' + end, + color = { fg = colors.blue }, -- Sets highlighting of component + padding = { left = 0, right = 1 }, -- We don't need space before this +}) + +ins_left({ + -- mode component + function() + return '' + end, + color = function() + -- auto change color according to neovims mode + local mode_color = { + n = colors.red, + i = colors.green, + v = colors.blue, + ['␖'] = colors.blue, + V = colors.blue, + c = colors.magenta, + no = colors.red, + s = colors.orange, + S = colors.orange, + ['␓'] = colors.orange, + ic = colors.yellow, + R = colors.violet, + Rv = colors.violet, + cv = colors.red, + ce = colors.red, + r = colors.cyan, + rm = colors.cyan, + ['r?'] = colors.cyan, + ['!'] = colors.red, + t = colors.red, + } + return { fg = mode_color[vim.fn.mode()] } + end, + padding = { right = 1 }, +}) + +ins_left({ + 'filename', + cond = conditions.buffer_not_empty, + color = { fg = colors.magenta, gui = 'bold' }, +}) + +ins_left({ + 'diagnostics', + sources = { 'nvim_diagnostic' }, + symbols = { error = ' ', warn = ' ', info = ' ' }, + diagnostics_color = { + error = { fg = colors.red }, + warn = { fg = colors.yellow }, + info = { fg = colors.cyan }, + }, +}) + +-- Insert mid section. You can make any number of sections in neovim :) +-- for lualine it's any number greater then 2 +ins_left({ + function() + return '%=' + end, +}) + +ins_left({ + -- Lsp server name . + function() + local msg = 'No Active Lsp' + local clients = vim.lsp.get_clients() + if next(clients) == nil then + return msg + end + for _, client in ipairs(clients) do + local filetypes = client.config.filetypes + if filetypes and vim.fn.index(filetypes) ~= -1 then + return client.name + end + end + return msg + end, + icon = ' LSP:', + color = { fg = '#ffffff', gui = 'bold' }, +}) + +ins_right({ + 'diff', + -- Is it me or the symbol for modified us really weird + symbols = { added = ' ', modified = ' ', removed = ' ' }, + diff_color = { + added = { fg = colors.green }, + modified = { fg = colors.orange }, + removed = { fg = colors.red }, + }, + cond = conditions.hide_in_width, +}) + +ins_right({ + 'branch', + icon = '', + color = { fg = colors.violet, gui = 'bold' }, +}) + +ins_right({ + function() + return '▊' + end, + color = { fg = colors.blue }, + padding = { left = 1 }, +}) + +-- Now don't forget to initialize lualine +lualine.setup(config) diff --git a/lua/configs/mason.lua b/lua/configs/mason.lua new file mode 100644 index 0000000..5a2e78a --- /dev/null +++ b/lua/configs/mason.lua @@ -0,0 +1,47 @@ +local mason = require('mason') +local mason_lspconfig = require('mason-lspconfig') +local mason_tool_installer = require('mason-tool-installer') + +-- enable mason and configure icons +mason.setup({ + ui = { + border = 'rounded', + icons = { + package_installed = '✓', + package_pending = '➜', + package_uninstalled = '✗', + }, + }, +}) + +mason_lspconfig.setup({ + -- list of servers for mason to install + ensure_installed = { + 'tsserver', + 'html', + 'cssls', + 'tailwindcss', + 'svelte', + 'lua_ls', + 'pyright', + 'jdtls', + 'bashls', + 'jsonls', + 'clangd', + 'emmet_ls', + 'prismals', + }, +}) + +mason_tool_installer.setup({ + ensure_installed = { + 'prettier', -- prettier formatter + 'biome', -- js formatter + 'stylua', -- lua formatter + 'black', -- python formatter + 'isort', -- python formatter + 'clang-format', -- c/c++ formatter + 'pylint', + 'eslint_d', + }, +}) diff --git a/lua/configs/none-ls.lua b/lua/configs/none-ls.lua new file mode 100644 index 0000000..ffff12a --- /dev/null +++ b/lua/configs/none-ls.lua @@ -0,0 +1,61 @@ +local mason_null_ls = require('mason-null-ls') + +local null_ls = require('null-ls') + +local null_ls_utils = require('null-ls.utils') + +mason_null_ls.setup({ + ensure_installed = { + 'prettier', -- prettier formatter + 'biome', -- js formatter + 'clang-format', -- c/c++ formatter + 'stylua', -- lua formatter + 'black', -- python formatter + 'pylint', -- python linter + -- "eslint_d", -- js linter + }, +}) + +-- for conciseness +local formatting = null_ls.builtins.formatting -- to setup formatters +local diagnostics = null_ls.builtins.diagnostics -- to setup linters + +-- to setup format on save +local augroup = vim.api.nvim_create_augroup('LspFormatting', {}) + +-- configure null_ls +null_ls.setup({ + root_dir = null_ls_utils.root_pattern('.null-ls-root', 'Makefile', '.git', 'package.json'), + sources = { + formatting.prettier, -- js/ts formatter + formatting.stylua, -- lua formatter + formatting.isort, + formatting.black, + formatting.clang_format, + diagnostics.pylint, + -- diagnostics.eslint_d.with({ -- js/ts linter + -- condition = function(utils) + -- return utils.root_has_file({ ".eslintrc.js", ".eslintrc.cjs" }) -- only enable if root has .eslintrc.js or .eslintrc.cjs + -- end, + -- }), + }, + -- configure format on save + on_attach = function(current_client, bufnr) + if current_client.supports_method('textDocument/formatting') then + vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) + vim.api.nvim_create_autocmd('BufWritePre', { + group = augroup, + buffer = bufnr, + callback = function() + vim.lsp.buf.format({ + filter = function(client) + -- only use null-ls for formatting instead of lsp server + return client.name == 'null-ls' + end, + bufnr = bufnr, + }) + end, + }) + end + end, +}) diff --git a/lua/configs/telescope.lua b/lua/configs/telescope.lua new file mode 100644 index 0000000..b794171 --- /dev/null +++ b/lua/configs/telescope.lua @@ -0,0 +1,68 @@ +local telescope = require('telescope') +local fb_actions = require('telescope').extensions.file_browser.actions +telescope.setup({ + file_ignore_patterns = { '%.git/.' }, + defaults = { + preview = { + treesitter = false, + }, + }, + extensions = { + fzf = { + fuzzy = true, -- false will only do exact matching + override_generic_sorter = true, -- override the generic sorter + override_file_sorter = true, -- override the file sorter + case_mode = 'smart_case', -- or "ignore_case" or "respect_case" + }, + + file_browser = { + theme = 'ivy', + hijack_netrw = true, + mapping = { + ['i'] = { + [''] = fb_actions.create, + [''] = fb_actions.rename, + [''] = fb_actions.remove, + [''] = fb_actions.toggle_hidden, + }, + ['n'] = { + [''] = fb_actions.create, + [''] = require('telescope-undo.actions').yank_additions, + [''] = require('telescope-undo.actions').yank_deletions, + [''] = require('telescope-undo.actions').restore, + }, + }, + }, + }, + borderchars = { + prompt = { '─', '│', '─', '│', '╭', '╮', '╯', '╰' }, + results = { ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' }, + }, +}) +telescope.load_extension('ui-select') +telescope.load_extension('file_browser') +-- telescope.load_extension("refactoring") +telescope.load_extension('notify') +telescope.load_extension('undo') diff --git a/lua/configs/toggleterm.lua b/lua/configs/toggleterm.lua new file mode 100644 index 0000000..a59a984 --- /dev/null +++ b/lua/configs/toggleterm.lua @@ -0,0 +1,23 @@ +require('toggleterm').setup({ + size = 10, + open_mapping = [[]], + hide_numbers = true, + shade_filetypes = {}, + shade_terminals = true, + shading_factor = '2', + start_in_insert = true, + insert_mappings = true, + terminal_mappings = true, + persist_size = true, + direction = 'float', -- Use 'float' for floating terminal windows + close_on_exit = true, + shell = vim.o.shell, + float_opts = { + border = 'curved', -- or 'single', 'double', 'shadow', etc. + winblend = 0, -- Set to 0 for full transparency + highlights = { + border = 'Normal', + background = 'Normal', + }, + }, +}) diff --git a/lua/config/autocmd.lua b/lua/core/autocmd.lua similarity index 59% rename from lua/config/autocmd.lua rename to lua/core/autocmd.lua index d968dae..523e42f 100644 --- a/lua/config/autocmd.lua +++ b/lua/core/autocmd.lua @@ -1,3 +1,7 @@ +local function augroup(name) + return vim.api.nvim_create_augroup('nvim2k_' .. name, { clear = true }) +end + -- don't auto comment new line vim.api.nvim_create_autocmd('BufEnter', { command = [[set formatoptions-=cro]] }) @@ -22,6 +26,7 @@ vim.api.nvim_create_autocmd('UILeave', { -- Highlight on yank vim.api.nvim_create_autocmd('TextYankPost', { + group = augroup('highlight_yank'), callback = function() vim.highlight.on_yank() end, @@ -67,6 +72,67 @@ vim.api.nvim_create_autocmd( } ) +-- go to last loc when opening a buffer +vim.api.nvim_create_autocmd('BufReadPost', { + group = augroup('last_loc'), + callback = function() + local mark = vim.api.nvim_buf_get_mark(0, '"') + local lcount = vim.api.nvim_buf_line_count(0) + if mark[1] > 0 and mark[1] <= lcount then + pcall(vim.api.nvim_win_set_cursor, 0, mark) + end + end, +}) + +-- Strip trailing spaces before write +vim.api.nvim_create_autocmd({ 'BufWritePre' }, { + group = augroup('strip_space'), + pattern = { '*' }, + callback = function() + vim.cmd([[ %s/\s\+$//e ]]) + end, +}) + +-- Check if we need to reload the file when it changed +vim.api.nvim_create_autocmd({ 'FocusGained', 'TermClose', 'TermLeave' }, { + group = augroup('checktime'), + command = 'checktime', +}) + +-- resize splits if window got resized +vim.api.nvim_create_autocmd({ 'VimResized' }, { + group = augroup('resize_splits'), + callback = function() + vim.cmd('tabdo wincmd =') + end, +}) + +-- wrap and check for spell in text filetypes +vim.api.nvim_create_autocmd('FileType', { + group = augroup('wrap_spell'), + pattern = { 'gitcommit', 'markdown' }, + callback = function() + vim.opt_local.wrap = true + vim.opt_local.spell = true + end, +}) + +-- Auto create dir when saving a file, in case some intermediate directory does not exist +vim.api.nvim_create_autocmd({ 'BufWritePre' }, { + group = augroup('auto_create_dir'), + callback = function(event) + local file = vim.loop.fs_realpath(event.match) or event.match + vim.fn.mkdir(vim.fn.fnamemodify(file, ':p:h'), 'p') + end, +}) + +-- Set arb filetype +vim.api.nvim_create_autocmd({ 'BufEnter' }, { + group = augroup('set_file_type'), + pattern = { '*.arb' }, + command = require('core.util').get_file_type_cmd('arb'), +}) + -- close some filetypes with vim.api.nvim_create_autocmd('FileType', { group = vim.api.nvim_create_augroup('close_with_q', { clear = true }), diff --git a/lua/core/functions.lua b/lua/core/functions.lua new file mode 100644 index 0000000..e49a9fd --- /dev/null +++ b/lua/core/functions.lua @@ -0,0 +1,39 @@ +-- Reload neovim config +vim.api.nvim_create_user_command('ReloadConfig', function() + for name, _ in pairs(package.loaded) do + if name:match('^plugins') then + package.loaded[name] = nil + end + end + + dofile(vim.env.MYVIMRC) + vim.notify('Nvim configuration reloaded!', vim.log.levels.INFO) +end, {}) + +vim.api.nvim_create_user_command('CopyRelativePath', function() + local path = vim.fn.expand('%') + vim.fn.setreg('+', path) + vim.notify('Copied "' .. path .. '" to the clipboard!') +end, {}) + +vim.api.nvim_create_user_command('CopyAbsolutePath', function() + local path = vim.fn.expand('%:p') + vim.fn.setreg('+', path) + vim.notify('Copied "' .. path .. '" to the clipboard!') +end, {}) + +vim.api.nvim_create_user_command('CopyFileName', function() + local path = vim.fn.expand('%:t') + vim.fn.setreg('+', path) + vim.notify('Copied "' .. path .. '" to the clipboard!') +end, {}) + +-- Switch to git root or file parent dir +vim.api.nvim_create_user_command('RootDir', function() + local root = require('core.util').get_root_dir() + + if root == '' then + return + end + vim.cmd('lcd ' .. root) +end, {}) diff --git a/lua/core/keymaps.lua b/lua/core/keymaps.lua new file mode 100644 index 0000000..0bc455f --- /dev/null +++ b/lua/core/keymaps.lua @@ -0,0 +1,75 @@ +local function map(mode, lhs, rhs, opts) + opts = opts or {} + opts.silent = opts.silent ~= false + vim.keymap.set(mode, lhs, rhs, opts) +end +local opts = { noremap = true, silent = true } + +-- Use jj as escape +map('i', 'jj', '', opts) +map('t', 'JJ', '', opts) + +-- Visual overwrite paste +map({ 'v', 'x' }, 'p', '"_dP', opts) + +-- Do not copy on x +map({ 'v', 'x' }, 'x', '"_x', opts) + +-- Increment/decrement +map({ 'n', 'v', 'x' }, '-', '', opts) +map({ 'n', 'v', 'x' }, '=', '', opts) + +-- Move to line beginning and end +map({ 'n', 'v', 'x' }, 'gl', '$', { desc = 'End of line' }) +map({ 'n', 'v', 'x' }, 'gh', '^', { desc = 'Beginning of line' }) + +-- Select all +map('n', '', 'ggG') + +-- Deleting without yanking empty line +map('n', 'dd', function() + local is_empty_line = vim.api.nvim_get_current_line():match('^%s*$') + if is_empty_line then + return '"_dd' + else + return 'dd' + end +end, { noremap = true, expr = true, desc = "Don't Yank Empty Line to Clipboard" }) + +-- Center Cursors +map('n', 'J', 'mzJ`z', opts) +map('n', '', 'zz', opts) +map('n', '', 'zz', opts) +map('n', 'n', 'nzzzv', opts) +map('n', 'N', 'Nzzzv', opts) + +-- Better up/down +map('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) +map('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) + +-- Move text up and down +map({ 'v', 'x' }, 'J', ":move '>+1gv-gv", opts) +map({ 'v', 'x' }, 'K', ":move '<-2gv-gv", opts) + +-- Clear search, diff update and redraw +map({ 'i', 'n' }, '', 'noh', { desc = 'Escape and clear hlsearch' }) + +-- Consistent n/N search navigation +map('n', 'n', "'Nn'[v:searchforward]", { expr = true, desc = 'Next search result' }) +map('x', 'n', "'Nn'[v:searchforward]", { expr = true, desc = 'Next search result' }) +map('o', 'n', "'Nn'[v:searchforward]", { expr = true, desc = 'Next search result' }) +map('n', 'N', "'nN'[v:searchforward]", { expr = true, desc = 'Prev search result' }) +map('x', 'N', "'nN'[v:searchforward]", { expr = true, desc = 'Prev search result' }) +map('o', 'N', "'nN'[v:searchforward]", { expr = true, desc = 'Prev search result' }) + +-- Better indenting +map('v', '<', '', '>gv') + +-- Add undo breakpoints +map('i', ',', ',u') +map('i', '.', '.u') +map('i', ';', ';u') + +map({ 'i' }, '', '', { desc = 'Move cursor to right' }) +map({ 'i' }, '', '', { desc = 'Move cursor to right' }) diff --git a/lua/config/lazy.lua b/lua/core/lazy.lua similarity index 97% rename from lua/config/lazy.lua rename to lua/core/lazy.lua index 64fc39a..7b2677e 100644 --- a/lua/config/lazy.lua +++ b/lua/core/lazy.lua @@ -19,7 +19,6 @@ vim.opt.rtp:prepend(lazypath) require('lazy').setup({ spec = { { import = 'plugins' }, - { import = 'list' }, }, install = { missing = true, @@ -59,6 +58,7 @@ require('lazy').setup({ }, }, }, + lockfile = vim.fn.stdpath('config') .. '/lua/lock.json', performance = { rtp = { disabled_plugins = { diff --git a/lua/config/options.lua b/lua/core/options.lua similarity index 100% rename from lua/config/options.lua rename to lua/core/options.lua diff --git a/lua/core/util.lua b/lua/core/util.lua new file mode 100644 index 0000000..b2f3de1 --- /dev/null +++ b/lua/core/util.lua @@ -0,0 +1,66 @@ +local util = {} + +util.get_user_config = function(key, default) + local status_ok, user = pcall(require, 'user') + if not status_ok then + return default + end + + local user_config = user[key] + if user_config == nil then + return default + end + return user_config +end + +util.get_root_dir = function() + local bufname = vim.fn.expand('%:p') + if vim.fn.filereadable(bufname) == 0 then + return + end + + local parent = vim.fn.fnamemodify(bufname, ':h') + local git_root = vim.fn.systemlist('git -C ' .. parent .. ' rev-parse --show-toplevel') + if #git_root > 0 and git_root[1] ~= '' then + return git_root[1] + else + return parent + end +end + +util.get_file_type_cmd = function(extension) + local root = util.get_root_dir() + + if extension == 'arb' and root then + local gemfile_exists = vim.fn.filereadable(root .. '/Gemfile') == 1 + local pubspec_exists = vim.fn.filereadable(root .. '/pubspec.yaml') == 1 + if gemfile_exists then + return 'setfiletype ruby' + end + if pubspec_exists then + return 'setfiletype json' + end + end + return '' +end + +util.is_present = function(bin) + return vim.fn.executable(bin) == 1 +end + +util.telescope_select = function(options, options_desc, select_prompt) + require('telescope.pickers') + .new({}, { + prompt_title = select_prompt, + results_title = options_desc, + finder = require('telescope.finders').new_table({ + results = options, + entry_maker = require('telescope.make_entry').gen_from_file(), + }), + sorter = require('telescope.sorters').get_fzy_sorter(), + previewer = require('telescope.previewers').vim_buffer_cat.new({}), + }) + :find() +end + +return util diff --git a/lua/list.lua b/lua/list.lua deleted file mode 100644 index c8a405d..0000000 --- a/lua/list.lua +++ /dev/null @@ -1,587 +0,0 @@ -return { - -- Delete Buffer - { - 'famiu/bufdelete.nvim', - event = { 'BufReadPre', 'BufNewFile' }, - init = function() - vim.keymap.set('n', 'q', function() - require('bufdelete').bufdelete(0, false) - end, { silent = true, desc = 'Quit Buffer' }) - end, - }, - -- Better Escape - { - 'max397574/better-escape.nvim', - config = function() - require('better_escape').setup() - end, - }, - -- Comment - { - { - 'LudoPinelli/comment-box.nvim', - opts = {}, - vscode = true, - keys = { - { 'cb', 'CBccbox', mode = { 'n', 'v' }, desc = 'Comment Box' }, - { 'ct', 'CBllline', mode = { 'n', 'v' }, desc = 'Tiled line' }, - { 'cl', 'CBline', desc = 'Line' }, - { 'cm', 'CBllbox14', mode = { 'n', 'v' }, desc = 'Marked' }, - { 'cc', 'CBcatalog', desc = 'Catalog' }, - { 'cd', 'CBd', mode = { 'n', 'v' }, desc = 'Delete Comment Style' }, - }, - }, - }, - -- Code Screnshot - { - 'mistricky/codesnap.nvim', - build = 'make', - cmd = { 'CodeSnap', 'CodeSnapSave' }, - vscode = false, - keys = { - { 'cp', mode = 'v', "'<,'>CodeSnap", desc = 'Screenshot (Clipboard)' }, - { 'cP', mode = 'v', "'<,'>CodeSnapSave", desc = 'Screenshot (Save)' }, - }, - cond = vim.env.KITTY_SCROLLBACK_NVIM == nil, - opts = { - save_path = (os.getenv('HOME') .. '/Pictures/screenshots/'), - title = 'CodeSnap.nvim', - watermark = '', - bg_theme = 'summer', - }, - }, - -- Generate dotfyle metadata for your config - { - 'creativenull/dotfyle-metadata.nvim', - cmd = { 'DotfyleGenerate', 'DotfyleOpen' }, - }, - -- improve the default vim.ui interfaces - { - 'stevearc/dressing.nvim', - event = 'VeryLazy', - }, - -- Show diagnostics and lsp info inside a custom window, following the mouse position - { - 'soulis-1256/eagle.nvim', - event = { 'BufReadPre', 'BufNewFile' }, - config = function() - require('eagle').setup({}) - end, - }, - -- Navigate your code with search labels, enhanced character motions and Treesitter integration - { - 'folke/flash.nvim', - event = { 'CursorHold', 'CursorHoldI' }, - vscode = true, - opts = {}, - keys = { - { - 's', - mode = { 'n', 'x', 'o' }, - function() - require('flash').jump() - end, - desc = 'Flash', - }, - { - 'S', - mode = { 'n', 'o', 'x' }, - function() - require('flash').treesitter() - end, - desc = 'Flash Treesitter', - }, - { - 'r', - mode = 'o', - function() - require('flash').remote() - end, - desc = 'Remote Flash', - }, - { - 'R', - mode = { 'o', 'x' }, - function() - require('flash').treesitter_search() - end, - desc = 'Treesitter Search', - }, - { - '', - mode = { 'c' }, - function() - require('flash').toggle() - end, - desc = 'Toggle Flash Search', - }, - }, - }, - --open files in neovim without creating a nested sessions - { - 'willothy/flatten.nvim', - priority = 1001, - opts = { - window = { - open = 'alternate', - }, - }, - }, - -- highlight arguments - { - 'm-demare/hlargs.nvim', - event = { 'BufReadPost', 'BufNewFile' }, - }, - -- emoji picker - { - 'ziontee113/icon-picker.nvim', - enabled = true, - cmd = { 'IconPickerInsert' }, - vim.keymap.set('n', 'se', 'IconPickerInsert emoji'), - config = function() - require('icon-picker').setup({ disable_legacy_commands = true }) - end, - }, - -- Incremental rename - { - 'smjonas/inc-rename.nvim', - cmd = 'IncRename', - config = true, - }, - -- automtically guess indent - { - 'nmac427/guess-indent.nvim', - event = 'FileType', - config = function() - require('guess-indent').setup({}) - end, - }, - -- Faster LuaLS setup - { - 'folke/lazydev.nvim', - ft = 'lua', -- only load on lua files - cmd = 'LazyDev', - lazy = true, - event = 'LspAttach', - opts = { - library = {}, - }, - }, - -- Snippets - { - 'L3MON4D3/LuaSnip', - event = { 'BufReadPost', 'BufNewFile' }, - dependencies = { - 'rafamadriz/friendly-snippets', - 'mstuttgart/odoo-snippets', - }, - opts = { - history = true, - updateevents = 'TextChanged,TextChangedI', - }, - keys = function() - return {} - end, - config = function() - require('luasnip.loaders.from_vscode').lazy_load() - end, - }, - -- Markdown preview - { - 'iamcco/markdown-preview.nvim', - build = 'cd app && yarn install', - ft = { 'markdown' }, - keys = { - { - 'mp', - 'MarkdownPreviewToggle', - desc = 'toggle markdown preview', - }, - }, - }, - -- Colorscheme - { - 'bluz71/vim-moonfly-colors', - name = 'moonfly', - lazy = false, - priority = 1000, - config = function() - require('moonfly').custom_colors({ - bg = '#000000', - }) - vim.cmd([[colorscheme moonfly]]) - end, - }, - -- navigate between neovim and terminal - { - 'numToStr/Navigator.nvim', - keys = { - { '', 'NavigatorLeft' }, - { '', 'NavigatorDown' }, - { '', 'NavigatorUp' }, - { '', 'NavigatorRight' }, - { '', 'NavigatorPrevious' }, - }, - config = function() - require('Navigator').setup() - end, - }, - -- popup display that provides breadcrumbs like navigation features - { - 'SmiteshP/nvim-navbuddy', - dependencies = { - 'neovim/nvim-lspconfig', - 'SmiteshP/nvim-navic', - }, - keys = { - { 'nv', 'Navbuddy', desc = 'Nav' }, - }, - config = function() - local actions = require('nvim-navbuddy.actions') - local navbuddy = require('nvim-navbuddy') - navbuddy.setup({ - window = { - border = 'double', - }, - mappings = { - ['k'] = actions.next_sibling, - ['i'] = actions.previous_sibling, - ['j'] = actions.parent, - ['l'] = actions.children, - }, - lsp = { auto_attach = true }, - }) - end, - }, - -- smooth scrolling - { - 'karb94/neoscroll.nvim', - event = 'UIEnter', - config = function() - require('neoscroll').setup({ - mappings = { -- Keys to be mapped to their corresponding default scrolling animation - '', - '', - '', - '', - '', - '', - 'zt', - 'zz', - 'zb', - }, - hide_cursor = true, -- Hide cursor while scrolling - stop_eof = true, -- Stop at when scrolling downwards - respect_scrolloff = false, -- Stop scrolling when the cursor reaches the scrolloff margin of the file - cursor_scrolls_alone = true, -- The cursor will keep on scrolling even if the window cannot scroll further - easing = 'linear', -- Default easing function - pre_hook = nil, -- Function to run before the scrolling animation starts - post_hook = nil, -- Function to run after the scrolling animation ends - performance_mode = false, -- Disable "Performance Mode" on all buffers. - }) - end, - }, - -- Notifications - { - 'rcarriga/nvim-notify', - event = 'VeryLazy', - keys = { - { - 'un', - function() - require('notify').dismiss({ silent = true, pending = true }) - end, - desc = 'Dismiss All Notifications', - }, - }, - opts = { - level = 2, - minimum_width = 50, - stages = 'fade', - timeout = 3000, - top_down = true, - render = 'compact', - background_colour = '#000000', - }, - }, - -- Ui components - { - 'MunifTanjim/nui.nvim', - lazy = true, - }, - -- Peek lines just when you intend - { - 'nacro90/numb.nvim', - event = 'CmdlineEnter', - config = function() - require('numb').setup({ - show_numbers = true, -- Enable 'number' for the window while peeking - show_cursorline = true, -- Enable 'cursorline' for the window while peeking - hide_relativenumbers = true, -- Enable turning off 'relativenumber' for the window while peeking - number_only = false, -- Peek only when the command is only a number instead of when it starts with a number - centered_peeking = true, -- Peeked line will be centered relative to window - }) - end, - }, - { - 'nvim-lua/plenary.nvim', - lazy = true, - }, - -- Session Management - { - 'folke/persistence.nvim', - event = 'BufReadPre', - opts = { options = vim.opt.sessionoptions:get() }, - keys = { - { - 'ss', - function() - require('persistence').load() - end, - desc = 'Restore Session', - }, - { - 'sl', - function() - require('persistence').load({ last = true }) - end, - desc = 'Restore Last Session', - }, - { - 'sd', - function() - require('persistence').stop() - end, - desc = "Don't Save Current Session", - }, - }, - }, - -- alternating syntax highlighting - { - 'HiPhish/rainbow-delimiters.nvim', - event = { 'BufReadPost', 'BufNewFile' }, - config = function() - local rainbow_delimiters = require('rainbow-delimiters') - require('rainbow-delimiters.setup').setup({ - { - strategy = { - [''] = rainbow_delimiters.strategy['global'], - vim = rainbow_delimiters.strategy['local'], - }, - query = { - [''] = 'rainbow-delimiters', - lua = 'rainbow-blocks', - }, - priority = { - [''] = 110, - lua = 210, - }, - highlight = { - 'RainbowDelimiterRed', - 'RainbowDelimiterYellow', - 'RainbowDelimiterBlue', - 'RainbowDelimiterOrange', - 'RainbowDelimiterGreen', - 'RainbowDelimiterViolet', - 'RainbowDelimiterCyan', - }, - }, - }) - end, - }, - -- Enhance the usage of macros - { - 'chrisgrieser/nvim-recorder', - dependencies = { 'rcarriga/nvim-notify' }, - event = 'VeryLazy', - vscode = true, - keys = { - { 'q', desc = 'Start Recording' }, - { 'Q', desc = 'Play Recording' }, - { '', desc = 'Switch Slot' }, - { 'cq', desc = 'Edit Macro' }, - { 'yq', desc = 'Yank Macro' }, - { 'dq', desc = 'Delete All Macros' }, - }, - opts = { - useNerdFontsIcons = false, - slots = { 'a', 'b', 'c', 'd' }, - mapping = { - startStopRecording = 'q', - playMacro = 'Q', - editMacro = 'cq', - switchSlot = '', - deleteAllMacros = 'dq', - yankMacro = 'yq', - }, - }, - }, - -- Screencast the keys - { - 'NStefan002/screenkey.nvim', - cmd = 'Screenkey', - version = '*', - vim.keymap.set('n', 'kt', 'Screenkey', { desc = 'Toggle keys' }), - config = function() - require('screenkey').setup({ - -- see :h nvim_open_win - win_opts = { - relative = 'editor', - anchor = 'SE', - width = 40, - height = 1, - border = 'single', - }, - -- compress input when repeated times - compress_after = 3, - -- clear the input after seconds of inactivity - clear_after = 3, - -- temporarily disable screenkey (for example when inside of the terminal) - disable = { - filetypes = {}, -- for example: "toggleterm" - -- :h 'buftype' - buftypes = {}, -- for example: "terminal" - }, - }) - end, - }, - -- search panel - { - 'nvim-pack/nvim-spectre', - build = false, - cmd = 'Spectre', - opts = { open_cmd = 'noswapfile vnew' }, - keys = { - { - 'sr', - function() - require('spectre').open() - end, - desc = 'Replace in Files (Spectre)', - }, - }, - }, - { - 'luukvbaal/statuscol.nvim', - event = 'BufReadPre', - config = function() - local builtin = require('statuscol.builtin') - require('statuscol').setup({ - setopt = true, - separator = '', - foldfunc = 'builtin', - relculright = true, - segments = { - { text = { '%s' }, click = 'v:lua.ScSa' }, - { - text = { builtin.lnumfunc, ' ' }, - click = 'v:lua.ScLa', - }, - }, - }) - end, - }, - -- undo history visualizer - { - 'mbbill/undotree', - keys = { - { 'uu', 'UndotreeToggle', desc = 'Toggle Undotree' }, - }, - }, - -- maximizer & restore current window - { - 'szw/vim-maximizer', - - keys = { - { 'sm', 'MaximizerToggle', desc = 'Maximize/minimize a split' }, - }, - }, - -- for programming activity - { - 'wakatime/vim-wakatime', - lazy = false, - }, - -- show keymaps - { - 'folke/which-key.nvim', - event = 'UIEnter', - opts = { - preset = 'helix', - }, - keys = { - { - '?', - function() - require('which-key').show({ global = false }) - end, - desc = 'Buffer Local Keymaps (which-key)', - }, - }, - }, - -- Distraction-free coding - { - 'folke/zen-mode.nvim', - cmd = { 'ZenMode' }, - opts = {}, - keys = { - { 'zz', 'ZenMode', desc = 'Toggle zen mode' }, - }, - }, - -- Prismatic line decorations - { - 'mvllow/modes.nvim', - event = { 'BufReadPost', 'BufNewFile' }, - tag = 'v0.2.0', - config = function() - require('modes').setup({ - - colors = { - visual = '#f5c359', - delete = '#c75c6a', - copy = '#78ccc5', - insert = '#c5739a', - }, - line_opacity = 0.15, - set_cursor = true, - set_cursorline = true, - set_number = true, - ignore_filetypes = { 'NvimTree', 'TelescopePrompt' }, - }) - end, - }, - -- Make editing big files faster - { - 'LunarVim/bigfile.nvim', - event = { 'BufEnter', 'WinEnter' }, - opts = { - -- Disables LSP/treesitter, etc for files above 5000 lives (even if they have really long lines) - pattern = function(bufnr, filesize_mib) - if filesize_mib >= 2 then - return true - end - -- you can't use `nvim_buf_line_count` because this runs on BufReadPre - local file_contents = vim.fn.readfile(vim.api.nvim_buf_get_name(bufnr)) - local file_length = #file_contents - if file_length > 5000 then - return true - end - - return false - end, - }, - }, - -- url-opener - { - 'sontungexpt/url-open', - event = { 'BufEnter', 'WinEnter' }, - cmd = 'URLOpenUnderCursor', - config = function() - local status_ok, url_open = pcall(require, 'url-open') - if not status_ok then - return - end - url_open.setup({}) - end, - vim.keymap.set('n', 'gx', ':URLOpenUnderCursor'), - }, -} diff --git a/lazy-lock.json b/lua/lock.json similarity index 77% rename from lazy-lock.json rename to lua/lock.json index ef99851..fbbe76c 100644 --- a/lazy-lock.json +++ b/lua/lock.json @@ -5,7 +5,7 @@ "barbecue": { "branch": "main", "commit": "cd7e7da622d68136e13721865b4d919efd6325ed" }, "better-escape.nvim": { "branch": "master", "commit": "d337e02b140d909345441392de47a42d283747c1" }, "bigfile.nvim": { "branch": "main", "commit": "33eb067e3d7029ac77e081cfe7c45361887a311a" }, - "bufdelete.nvim": { "branch": "master", "commit": "f6bcea78afb3060b198125256f897040538bcb81" }, + "bufferline.nvim": { "branch": "main", "commit": "2e3c8cc5a57ddd32f1edd2ffd2ccb10c09421f6c" }, "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, "cmp-cmdline": { "branch": "main", "commit": "d250c63aa13ead745e3a40f61fdd3470efde3923" }, "cmp-nvim-lsp": { "branch": "main", "commit": "39e2eda76828d88b773cc27a3f61d2ad782c922d" }, @@ -13,20 +13,17 @@ "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, "cmp_luasnip": { "branch": "master", "commit": "05a9ab28b53f71d1aece421ef32fee2cb857a843" }, "codeium.vim": { "branch": "main", "commit": "0b74f274b82c00eaad4b5b5cd8b2e76f872d19f1" }, - "codesnap.nvim": { "branch": "main", "commit": "c2924bf6c9a2c2c03318fae9b7fe0706412b9d9c" }, "comment-box.nvim": { "branch": "main", "commit": "06bb771690bc9df0763d14769b779062d8f12bc5" }, "dotfyle-metadata.nvim": { "branch": "main", "commit": "342ef8f3f98f3ccc451c9cf2be74e95149ced05d" }, "dressing.nvim": { "branch": "master", "commit": "c5775a888adbc50652cb370073fcfec963eca93e" }, - "eagle.nvim": { "branch": "main", "commit": "f590404f510be11ef2cf7c68e135441bfa48c9a8" }, "flash.nvim": { "branch": "main", "commit": "34c7be146a91fec3555c33fe89c7d643f6ef5cf1" }, "flatten.nvim": { "branch": "main", "commit": "e420e531d2ab24aebcf7b3c9fca28e6c5c34964d" }, "friendly-snippets": { "branch": "main", "commit": "00ebcaa159e817150bd83bfe2d51fa3b3377d5c4" }, - "guess-indent.nvim": { "branch": "main", "commit": "6cd61f7a600bb756e558627cd2e740302c58e32d" }, + "hardtime.nvim": { "branch": "main", "commit": "91c6be1a54fa057002e21ae209a49436bd215355" }, "hlargs.nvim": { "branch": "main", "commit": "cc0d9ee75e5ffba730393049119361b9e3a5b1b6" }, - "icon-picker.nvim": { "branch": "master", "commit": "3ee9a0ea9feeef08ae35e40c8be6a2fa2c20f2d3" }, "inc-rename.nvim": { "branch": "main", "commit": "8ba77017ca468f3029bf88ef409c2d20476ea66b" }, + "indent-blankline.nvim": { "branch": "master", "commit": "dddb5d21811c319eb6e51a993d8fb44b193aae3f" }, "lazy.nvim": { "branch": "main", "commit": "077102c5bfc578693f12377846d427f49bc50076" }, - "lazydev.nvim": { "branch": "main", "commit": "491452cf1ca6f029e90ad0d0368848fac717c6d2" }, "lspkind.nvim": { "branch": "master", "commit": "cff4ae321a91ee3473a92ea1a8c637e3a9510aec" }, "lspsaga.nvim": { "branch": "main", "commit": "4ce44df854f447cf0a8972e5387b3aeb5efc798b" }, "lualine.nvim": { "branch": "master", "commit": "b431d228b7bbcdaea818bdc3e25b8cdbe861f056" }, @@ -36,33 +33,30 @@ "mason-null-ls.nvim": { "branch": "main", "commit": "de19726de7260c68d94691afb057fa73d3cc53e7" }, "mason-tool-installer.nvim": { "branch": "main", "commit": "c5e07b8ff54187716334d585db34282e46fa2932" }, "mason.nvim": { "branch": "main", "commit": "e2f7f9044ec30067bc11800a9e266664b88cda22" }, - "mini.nvim": { "branch": "main", "commit": "7e30f58071dd963f2a6e81415aa121eb090da2c0" }, + "mini.files": { "branch": "main", "commit": "170d0dd321ca377cb427fb5576d4d75601c1c2da" }, + "mini.nvim": { "branch": "main", "commit": "d6e6a6fb010cc452b491704aa9ecc96a8aa2cde1" }, "modes.nvim": { "branch": "main", "commit": "3188692abf02a8838ec75e59d68c2ce3e4323f5c" }, "moonfly": { "branch": "master", "commit": "4f7d18cb471ede7407dd966c7563868cae7f4f99" }, "neo-tree.nvim": { "branch": "main", "commit": "206241e451c12f78969ff5ae53af45616ffc9b72" }, - "neoscroll.nvim": { "branch": "master", "commit": "532dcc8cea4287c4cad6bb77532989a8217cfc7b" }, "neotest": { "branch": "master", "commit": "32ff2ac21135a372a42b38ae131e531e64833bd3" }, "neotest-jest": { "branch": "main", "commit": "514fd4eae7da15fd409133086bb8e029b65ac43f" }, - "neotest-vitest": { "branch": "main", "commit": "e939b7c0ca705ad1f4be18894e30e7b4340a0148" }, + "neotest-python": { "branch": "master", "commit": "e5bff6dcf3cb33e6dfb97722e142961099c6021e" }, + "neotest-rspec": { "branch": "main", "commit": "53fc108a06ae43d7f873d42ee5189c2301e33623" }, "noice.nvim": { "branch": "main", "commit": "448bb9c524a7601035449210838e374a30153172" }, "none-ls.nvim": { "branch": "main", "commit": "cfa65d86e21eeb60544d5e823f6db43941322a53" }, "nui.nvim": { "branch": "main", "commit": "61574ce6e60c815b0a0c4b5655b8486ba58089a1" }, "numb.nvim": { "branch": "master", "commit": "3f7d4a74bd456e747a1278ea1672b26116e0824d" }, - "nvim-autopairs": { "branch": "master", "commit": "48ca9aaee733911424646cb1605f27bc01dedbe3" }, "nvim-cmp": { "branch": "main", "commit": "ae644feb7b67bf1ce4260c231d1d4300b19c6f30" }, - "nvim-cokeline": { "branch": "main", "commit": "adfd1eb87e0804b6b86126e03611db6f62bb2909" }, - "nvim-dap": { "branch": "master", "commit": "2b428ff2632e73295e9decbcf1c40d8e26213305" }, - "nvim-dap-go": { "branch": "main", "commit": "5511788255c92bdd845f8d9690f88e2e0f0ff9f2" }, + "nvim-dap": { "branch": "master", "commit": "281a2e4cd1e7a17cea7ecb1745d84a8ab1249925" }, "nvim-dap-ui": { "branch": "master", "commit": "a5606bc5958db86f8d92803bea7400ee26a8d7e4" }, "nvim-lsp-file-operations": { "branch": "master", "commit": "92a673de7ecaa157dd230d0128def10beb56d103" }, "nvim-lspconfig": { "branch": "master", "commit": "a89de2e049b5f89a0ee55029d5a31213bd4de6f8" }, - "nvim-navbuddy": { "branch": "master", "commit": "f22bac988f2dd073601d75ba39ea5636ab6e38cb" }, "nvim-navic": { "branch": "master", "commit": "8649f694d3e76ee10c19255dece6411c29206a54" }, "nvim-nio": { "branch": "master", "commit": "a428f309119086dc78dd4b19306d2d67be884eee" }, "nvim-notify": { "branch": "master", "commit": "d333b6f167900f6d9d42a59005d82919830626bf" }, - "nvim-recorder": { "branch": "main", "commit": "2b307756704a0ba26e8a3adfe98d02eeaecaa52e" }, + "nvim-recorder": { "branch": "main", "commit": "ce96792c1ff750977fc3affc56f0561b0c20a7e2" }, "nvim-spectre": { "branch": "master", "commit": "ba7fb777edff6c1fbbeffd343e113af64c04e90a" }, - "nvim-treesitter": { "branch": "master", "commit": "63e1337f1b60c84a4100ebedfb1dc80924c49122" }, + "nvim-treesitter": { "branch": "master", "commit": "ec8776ed9ef56ffe7a61e67b64d5d6b6aba2c631" }, "nvim-treesitter-context": { "branch": "master", "commit": "0f3332788e0bd37716fbd25f39120dcfd557c90f" }, "nvim-treesitter-textobjects": { "branch": "master", "commit": "ced6375723b20616282f9f6a1018a63ae19b106a" }, "nvim-ts-autotag": { "branch": "main", "commit": "0cb76eea80e9c73b88880f0ca78fbd04c5bdcac7" }, @@ -71,23 +65,24 @@ "persistence.nvim": { "branch": "main", "commit": "f6aad7dde7fcf54148ccfc5f622c6d5badd0cc3d" }, "plenary.nvim": { "branch": "master", "commit": "a3e3bc82a3f95c5ed0d7201546d5d2c19b20d683" }, "rainbow-delimiters.nvim": { "branch": "master", "commit": "c097f728a409d9923a3c70c1507e8389978a9b85" }, - "screenkey.nvim": { "branch": "main", "commit": "a96a13fede30bba0b37f6a87cb0a2cdd1679e422" }, - "statuscol.nvim": { "branch": "main", "commit": "93d8bcda516fc86e11c03f9ef577bae9a72fba0e" }, + "screenkey.nvim": { "branch": "main", "commit": "b1516d5d610c89555062397d29fa7f32fc8ec431" }, + "tdo.nvim": { "branch": "main", "commit": "f8d4ee275309c8a696236fcee92d78ecd98971bd" }, "telescope-file-browser.nvim": { "branch": "master", "commit": "a46780830b576049c675680650f773bedfa8677a" }, "telescope-fzf-native.nvim": { "branch": "main", "commit": "cf48d4dfce44e0b9a2e19a008d6ec6ea6f01a83b" }, + "telescope-symbols.nvim": { "branch": "master", "commit": "a6d0127a53d39b9fc2af75bd169d288166118aec" }, "telescope-ui-select.nvim": { "branch": "master", "commit": "6e51d7da30bd139a6950adf2a47fda6df9fa06d2" }, + "telescope-undo.nvim": { "branch": "main", "commit": "51be9ae7c42fc27c0b05505e3a0162e0f05fbb6a" }, "telescope.nvim": { "branch": "master", "commit": "5972437de807c3bc101565175da66a1aa4f8707a" }, "termim.nvim": { "branch": "main", "commit": "58344167abb97bcef9bf720a762ea653a94e9daa" }, - "toggleterm.nvim": { "branch": "main", "commit": "137d06fb103952a0fb567882bb8527e2f92d327d" }, + "toggleterm.nvim": { "branch": "main", "commit": "48be57eaba817f038d61bbf64d2c597f578c0827" }, "trouble.nvim": { "branch": "main", "commit": "6efc446226679fda0547c0fd6a7892fd5f5b15d8" }, "ultimate-autopair.nvim": { "branch": "v0.6", "commit": "1420fb9e07b1d80cc6d87e7d90827fb2c1109cb3" }, - "undotree": { "branch": "master", "commit": "56c684a805fe948936cda0d1b19505b84ad7e065" }, - "url-open": { "branch": "main", "commit": "9f8f4a56ac709f26aa17d8ef921b272bf2262a30" }, "vim-dadbod": { "branch": "master", "commit": "7888cb7164d69783d3dce4e0283decd26b82538b" }, "vim-dadbod-completion": { "branch": "master", "commit": "880f7e9f2959e567c718d52550f9fae1aa07aa81" }, "vim-dadbod-ui": { "branch": "master", "commit": "0f51d8de368c8c6220973e8acd156d17da746f4c" }, "vim-maximizer": { "branch": "master", "commit": "2e54952fe91e140a2e69f35f22131219fcd9c5f1" }, "vim-wakatime": { "branch": "master", "commit": "53bba6bb8342de9cbdafc82142a9b5e82008d858" }, "which-key.nvim": { "branch": "main", "commit": "6c1584eb76b55629702716995cca4ae2798a9cca" }, + "yanky.nvim": { "branch": "main", "commit": "73215b77d22ebb179cef98e7e1235825431d10e4" }, "zen-mode.nvim": { "branch": "main", "commit": "29b292bdc58b76a6c8f294c961a8bf92c5a6ebd6" } } diff --git a/lua/plugins/auto-pairs.lua b/lua/plugins/auto-pairs.lua deleted file mode 100644 index 164e972..0000000 --- a/lua/plugins/auto-pairs.lua +++ /dev/null @@ -1,72 +0,0 @@ -return { - { - { - 'windwp/nvim-autopairs', - keys = { - { '', mode = 'i' }, - { '', mode = 'i' }, - { '{', mode = 'i' }, - { '[', mode = 'i' }, - { '(', mode = 'i' }, - { '"', mode = 'i' }, - { "'", mode = 'i' }, - { '`', mode = 'i' }, - { '<', mode = 'i' }, - }, - lazy = true, - init = function() - vim.api.nvim_create_autocmd('User', { - pattern = 'IntPairsComp', - callback = function() - require('cmp').event:on( - 'confirm_done', - require('nvim-autopairs.completion.cmp').on_confirm_done() - ) - end, - once = true, - }) - end, - config = function() - require('nvim-autopairs').setup({ - map_bs = false, - check_ts = true, - fast_wrap = { highlight = 'Question', highlight_grey = 'LspCodeLens' }, - }) - end, - }, - { - 'hrsh7th/nvim-cmp', - optional = true, - opts = function() - require('cmp').event:on('menu_opened', function() - if vim.api.nvim_get_mode().mode:sub(1, 1) ~= 'c' then - vim.api.nvim_exec_autocmds('User', { pattern = 'IntPairsComp', modeline = false }) - end - end) - end, - }, - }, - { - 'altermo/ultimate-autopair.nvim', - keys = { - { '', mode = { 'i', 'c' } }, - { '', mode = { 'i', 'c' } }, - { '', mode = { 'i', 'c' } }, - { '{', mode = 'c' }, - { '[', mode = 'c' }, - { '(', mode = 'c' }, - { '"', mode = 'c' }, - { "'", mode = 'c' }, - { '`', mode = 'c' }, - }, - lazy = true, - config = function() - require('ultimate-autopair').setup({ - pair_map = true, - cr = { enable = false }, - space2 = { enable = true }, - fastwarp = { enable = false }, - }) - end, - }, -} diff --git a/lua/plugins/barbecue.lua b/lua/plugins/barbecue.lua deleted file mode 100644 index 84d0c6c..0000000 --- a/lua/plugins/barbecue.lua +++ /dev/null @@ -1,40 +0,0 @@ -return { - 'utilyre/barbecue.nvim', - name = 'barbecue', - version = '*', - event = { 'BufReadPost', 'BufAdd', 'BufNewFile' }, - dependencies = { - 'SmiteshP/nvim-navic', - 'nvim-tree/nvim-web-devicons', -- optional dependency - }, - opts = {}, - keys = { - { - 'bq', - function() - require('barbecue.ui').toggle() - end, - desc = 'toggle barbecue', - }, - }, - config = function() - require('barbecue').setup({ - create_autocmd = false, -- prevent barbecue from updating itself automatically - }) - - vim.api.nvim_create_autocmd({ - 'WinScrolled', -- or WinResized on NVIM-v0.9 and higher - 'BufWinEnter', - 'CursorHold', - 'InsertLeave', - - -- include this if you have set `show_modified` to `true` - -- "BufModifiedSet", - }, { - group = vim.api.nvim_create_augroup('barbecue.updater', {}), - callback = function() - require('barbecue.ui').update() - end, - }) - end, -} diff --git a/lua/plugins/codeium.lua b/lua/plugins/codeium.lua deleted file mode 100644 index a727af4..0000000 --- a/lua/plugins/codeium.lua +++ /dev/null @@ -1,49 +0,0 @@ -return { - { - 'Exafunction/codeium.vim', - event = 'InsertEnter', - config = function() - local cmp = require('cmp') - cmp.event:on('menu_opened', function() - vim.g.codeium_manual = true - vim.fn['codeium#Clear']() - end) - cmp.event:on('menu_closed', function() - vim.g.codeium_manual = false - vim.fn['codeium#Complete']() - end) - - vim.g.codeium_filetypes = { - TelescopePrompt = false, - DressingInput = false, - ['neo-tree-popup'] = false, - ['dap-repl'] = false, - } - - local opts = { expr = true, silent = true } - vim.g.codeium_disable_bindings = 1 - - vim.keymap.set('i', '', function() - return vim.fn['codeium#Accept']() - end, opts) - - vim.keymap.set('n', 'ch', function() - return vim.fn['codeium#Chat']() - end, { desc = 'Chat with IA (Codeium)' }) - - vim.keymap.set('i', '', function() - return vim.fn['codeium#CycleCompletions'](1) - end, opts) - - vim.keymap.set('i', '', function() - return vim.fn['codeium#CycleCompletions'](-1) - end, opts) - - vim.keymap.set('i', '', function() - return vim.fn['codeium#Clear']() - end, opts) - - vim.keymap.set('n', 'cI', 'CodeiumToggle', { desc = 'Toggle IA (Codeium)' }) - end, - }, -} diff --git a/lua/plugins/coding.lua b/lua/plugins/coding.lua new file mode 100644 index 0000000..f382178 --- /dev/null +++ b/lua/plugins/coding.lua @@ -0,0 +1,211 @@ +return { + { + 'max397574/better-escape.nvim', + event = 'InsertEnter', + opts = { + k = function() + vim.api.nvim_input('') + local current_line = vim.api.nvim_get_current_line() + if current_line:match('^%s+j$') then + vim.schedule(function() + vim.api.nvim_set_current_line('') + end) + end + end, + }, + }, + { + 'L3MON4D3/LuaSnip', + event = { 'BufReadPost', 'BufNewFile' }, + dependencies = { + 'rafamadriz/friendly-snippets', + 'mstuttgart/odoo-snippets', + }, + opts = { + history = true, + updateevents = 'TextChanged,TextChangedI', + }, + keys = function() + return {} + end, + config = function() + require('luasnip.loaders.from_vscode').lazy_load() + end, + }, + { + 'altermo/ultimate-autopair.nvim', + event = { 'InsertEnter', 'CmdlineEnter' }, + branch = 'v0.6', --recommended as each new version will have breaking changes + opts = {}, + }, + { + 'hrsh7th/nvim-cmp', + event = { 'InsertEnter' }, + dependencies = { + -- autocomplete plugins + 'hrsh7th/cmp-buffer', + 'hrsh7th/cmp-path', + 'hrsh7th/cmp-cmdline', + 'hrsh7th/cmp-nvim-lsp', + 'hrsh7th/cmp-nvim-lua', + 'saadparwaiz1/cmp_luasnip', + -- "hrsh7th/cmp-nvim-lsp-signature-help", + -- "hrsh7th/cmp-calc", + + -- vscode like icons to autocomplete list + 'onsails/lspkind.nvim', + -- snippet plugin + { 'L3MON4D3/LuaSnip', event = { 'BufReadPost', 'BufNewFile' } }, + { 'rafamadriz/friendly-snippets', event = { 'BufReadPost', 'BufNewFile' } }, + }, + config = function() + require('configs.cmp') + end, + }, + { + 'Exafunction/codeium.vim', + event = 'InsertEnter', + config = function() + local cmp = require('cmp') + cmp.event:on('menu_opened', function() + vim.g.codeium_manual = true + vim.fn['codeium#Clear']() + end) + cmp.event:on('menu_closed', function() + vim.g.codeium_manual = false + vim.fn['codeium#Complete']() + end) + + vim.g.codeium_filetypes = { + TelescopePrompt = false, + DressingInput = false, + ['neo-tree-popup'] = false, + ['dap-repl'] = false, + } + + local opts = { expr = true, silent = true } + vim.g.codeium_disable_bindings = 1 + + vim.keymap.set('i', '', function() + return vim.fn['codeium#Accept']() + end, opts) + + vim.keymap.set('n', 'ch', function() + return vim.fn['codeium#Chat']() + end, { desc = 'Chat with IA (Codeium)' }) + + vim.keymap.set('i', '', function() + return vim.fn['codeium#CycleCompletions'](1) + end, opts) + + vim.keymap.set('i', '', function() + return vim.fn['codeium#CycleCompletions'](-1) + end, opts) + + vim.keymap.set('i', '', function() + return vim.fn['codeium#Clear']() + end, opts) + + vim.keymap.set('n', 'cI', 'CodeiumToggle', { desc = 'Toggle IA (Codeium)' }) + end, + }, + { + 'nacro90/numb.nvim', + event = 'CmdlineEnter', + config = function() + require('numb').setup({ + show_numbers = true, -- Enable 'number' for the window while peeking + show_cursorline = true, -- Enable 'cursorline' for the window while peeking + hide_relativenumbers = true, -- Enable turning off 'relativenumber' for the window while peeking + number_only = false, -- Peek only when the command is only a number instead of when it starts with a number + centered_peeking = true, -- Peeked line will be centered relative to window + }) + end, + }, + { + 'NStefan002/screenkey.nvim', + cmd = 'Screenkey', + version = '*', + vim.keymap.set('n', 'kt', 'Screenkey', { desc = 'Toggle keys' }), + config = function() + require('screenkey').setup({ + win_opts = { + relative = 'editor', + anchor = 'SE', + width = 40, + height = 1, + border = 'single', + }, + compress_after = 3, + clear_after = 3, + disable = { + filetypes = {}, -- for example: "toggleterm" + buftypes = {}, -- for example: "terminal" + }, + }) + end, + }, + { + 'gbprod/yanky.nvim', + event = 'BufReadPost', + keys = { + { '', '(YankyCycleForward)' }, + { '', '(YankyCycleBackward)' }, + { + 'yp', + function() + require('telescope').extensions.yank_history.yank_history({}) + end, + desc = 'Open Yank History', + }, + { 'y', '(YankyYank)', mode = { 'n', 'x' }, desc = 'Yank text' }, + { 'p', '(YankyPutAfter)', mode = { 'n', 'x' }, desc = 'Put yanked text after cursor' }, + { 'P', '(YankyPutBefore)', mode = { 'n', 'x' }, desc = 'Put yanked text before cursor' }, + { 'gp', '(YankyGPutAfter)', mode = { 'n', 'x' }, desc = 'Put yanked text after selection' }, + { 'gP', '(YankyGPutBefore)', mode = { 'n', 'x' }, desc = 'Put yanked text before selection' }, + -- This is not plugin keymaps + { 'yP', 'CopyAbsolutePath', desc = 'Absolute Path' }, + { 'ya', '%y+', desc = 'Copy Whole File' }, + { 'yf', 'CopyFileName', desc = 'File Name' }, + { 'yg', 'lua require"gitlinker".get_buf_range_url()', desc = 'Copy Git URL' }, + { 'yp', 'CopyRelativePath', desc = 'Relative Path' }, + }, + opts = { + highlight = { + timer = 150, + }, + }, + }, + { + { + 'LudoPinelli/comment-box.nvim', + opts = {}, + vscode = true, + keys = { + { 'Cb', 'CBccbox', mode = { 'n', 'v' }, desc = 'Comment Box' }, + { 'Ct', 'CBllline', mode = { 'n', 'v' }, desc = 'Tiled line' }, + { 'Cl', 'CBline', desc = 'Line' }, + { 'Cm', 'CBllbox14', mode = { 'n', 'v' }, desc = 'Marked' }, + { 'Cc', 'CBcatalog', desc = 'Catalog' }, + { 'Cd', 'CBd', mode = { 'n', 'v' }, desc = 'Delete Comment Style' }, + }, + }, + }, + { + 'm-demare/hlargs.nvim', + event = { 'BufReadPost', 'BufNewFile' }, + }, + { + 'numToStr/Navigator.nvim', + keys = { + { '', 'NavigatorLeft' }, + { '', 'NavigatorDown' }, + { '', 'NavigatorUp' }, + { '', 'NavigatorRight' }, + { '', 'NavigatorPrevious' }, + }, + config = function() + require('Navigator').setup() + end, + }, +} diff --git a/lua/plugins/cokeline.lua b/lua/plugins/cokeline.lua deleted file mode 100644 index ba6d1e5..0000000 --- a/lua/plugins/cokeline.lua +++ /dev/null @@ -1,78 +0,0 @@ -return { - 'willothy/nvim-cokeline', - event = 'UIEnter', - config = function() - local get_hex = require('cokeline.hlgroups').get_hl_attr - - local yellow = vim.g.terminal_color_3 - - require('cokeline').setup({ - default_hl = { - fg = function(buffer) - return buffer.is_focused and get_hex('Normal', 'fg') or get_hex('Comment', 'fg') - end, - bg = function() - return get_hex('ColorColumn', 'bg') - end, - }, - - sidebar = { - filetype = { 'NvimTree', 'neo-tree' }, - components = { - { - text = function(buf) - -- Center the text by adding padding spaces - local total_width = vim.api.nvim_win_get_width(0) - local padding = math.floor((total_width - #buf.filetype) / 2) - return string.rep(' ', padding) .. buf.filetype .. string.rep(' ', padding) - end, - fg = yellow, - bg = function() - return get_hex('NvimTreeNormal', 'bg') - end, - bold = true, - }, - }, - }, - - components = { - { - text = function(buffer) - return (buffer.index ~= 1) and '▏' or '' - end, - }, - { - text = ' ', - }, - { - text = function(buffer) - return buffer.devicon.icon - end, - fg = function(buffer) - return buffer.devicon.color - end, - }, - { - text = ' ', - }, - { - text = function(buffer) - return buffer.filename .. ' ' - end, - bold = function(buffer) - return buffer.is_focused - end, - }, - { - text = '', - on_click = function(_, _, _, _, buffer) - buffer:delete() - end, - }, - { - text = ' ', - }, - }, - }) - end, -} diff --git a/lua/plugins/colorscheme.lua b/lua/plugins/colorscheme.lua new file mode 100644 index 0000000..b8233e9 --- /dev/null +++ b/lua/plugins/colorscheme.lua @@ -0,0 +1,14 @@ +return { + { + 'bluz71/vim-moonfly-colors', + name = 'moonfly', + lazy = false, + priority = 1000, + config = function() + require('moonfly').custom_colors({ + bg = '#000000', + }) + vim.cmd([[colorscheme moonfly]]) + end, + }, +} diff --git a/lua/plugins/completions.lua b/lua/plugins/completions.lua deleted file mode 100644 index d78e26f..0000000 --- a/lua/plugins/completions.lua +++ /dev/null @@ -1,89 +0,0 @@ --- configure autocomplete -return { - 'hrsh7th/nvim-cmp', - event = { 'InsertEnter' }, - dependencies = { - -- autocomplete plugins - 'hrsh7th/cmp-buffer', - 'hrsh7th/cmp-path', - 'hrsh7th/cmp-cmdline', - 'hrsh7th/cmp-nvim-lsp', - 'hrsh7th/cmp-nvim-lua', - 'saadparwaiz1/cmp_luasnip', - -- "hrsh7th/cmp-nvim-lsp-signature-help", - -- "hrsh7th/cmp-calc", - - -- vscode like icons to autocomplete list - 'onsails/lspkind.nvim', - -- snippet plugin - { 'L3MON4D3/LuaSnip', event = { 'BufReadPost', 'BufNewFile' } }, - { 'rafamadriz/friendly-snippets', event = { 'BufReadPost', 'BufNewFile' } }, - }, - config = function() - local cmp = require('cmp') - local luasnip = require('luasnip') - require('luasnip/loaders/from_vscode').lazy_load() - - cmp.setup({ - completion = { - keyword_length = 1, - completeopt = 'menu,menuone', - }, - window = { - completion = cmp.config.window.bordered(), - documentation = cmp.config.window.bordered(), - }, - formatting = { - fields = { 'kind', 'abbr', 'menu' }, - format = function(entry, vim_item) - local kind = require('lspkind').cmp_format({ mode = 'symbol_text', maxwidth = 50 })(entry, vim_item) - local strings = vim.split(kind.kind, '%s', { trimempty = true }) - kind.kind = ' ' .. (strings[1] or '') .. ' ' - kind.menu = ' (' .. (strings[2] or '') .. ')' - - return kind - end, - }, - snippet = { -- configure how nvim-cmp interacts with snippet engine - expand = function(args) - luasnip.lsp_expand(args.body) - end, - }, - mapping = { - [''] = cmp.mapping.select_next_item({ behavior = cmp.SelectBehavior.Insert }), - [''] = cmp.mapping.select_prev_item({ behavior = cmp.SelectBehavior.Insert }), - [''] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.complete(), -- show completion suggestions - [''] = cmp.mapping.abort(), -- close completion window - [''] = cmp.mapping.close(), - [''] = cmp.mapping.confirm({ - behavior = cmp.ConfirmBehavior.Insert, - select = true, - }), - }, - cmp.setup.cmdline(':', { - mapping = cmp.mapping.preset.cmdline(), - sources = { - { name = 'cmdline' }, - }, - }), - cmp.setup.cmdline('/', { - mapping = cmp.mapping.preset.cmdline(), - sources = { - { name = 'buffer' }, - }, - }), - -- sources for autocompletion - sources = { - { name = 'nvim_lsp' }, - { name = 'luasnip' }, -- snippets - { name = 'buffer' }, -- text within current buffer - { name = 'path' }, -- file system paths - { name = 'codeium' }, -- AI for autocompletion - -- { name = "nvim_lsp_signature_help" }, - -- { name = "calc" }, --for maths calculations - }, - }) - end, -} diff --git a/lua/plugins/dap.lua b/lua/plugins/dap.lua new file mode 100644 index 0000000..19d0c79 --- /dev/null +++ b/lua/plugins/dap.lua @@ -0,0 +1,132 @@ +return { + { + 'mfussenegger/nvim-dap', + dependencies = { + 'rcarriga/nvim-dap-ui', + }, + cmd = { 'DapUIToggle', 'DapToggleRepl', 'DapToggleBreakpoint' }, + keys = { + { 'bO', 'DapStepOut', desc = 'Out' }, + { 'bR', 'DapRestartFrame', desc = 'Restart Frame' }, + { 'bb', 'DapToggleBreakpoint', desc = 'Breakpoint' }, + { 'bc', 'DapContinue', desc = 'Continue' }, + { 'bi', 'DapStepInto', desc = 'Into' }, + { 'bl', "lua require'dap'.run_last()", desc = 'Last' }, + { 'bo', 'DapStepOver', desc = 'Over' }, + { 'br', 'DapToggleRepl', desc = 'Repl' }, + { 'bt', 'DapUIToggle', desc = 'Debugger' }, + { 'bx', 'DapTerminate', desc = 'Exit' }, + }, + config = function() + local dap = require('dap') + local dapui = require('dapui') + + dapui.setup({ + icons = { expanded = ' ', collapsed = ' ' }, + mappings = { + expand = { '', '<2-LeftMouse>' }, + open = 'o', + remove = 'd', + edit = 'e', + repl = 'r', + toggle = 't', + }, + expand_lines = vim.fn.has('nvim-0.7'), + layouts = { + { + elements = { + { id = 'scopes', size = 0.25 }, + 'breakpoints', + 'stacks', + 'watches', + }, + size = 40, + position = 'right', + }, + { + elements = { + 'repl', + 'console', + }, + size = 0.25, + position = 'bottom', + }, + }, + floating = { + max_height = nil, + max_width = nil, + border = 'rounded', + mappings = { + close = { 'q', '' }, + }, + }, + windows = { indent = 1 }, + render = { + max_type_length = nil, + }, + }) + + vim.fn.sign_define( + 'DapBreakpoint', + { text = ' ', texthl = 'DiagnosticSignError', linehl = '', numhl = '' } + ) + + dap.listeners.after.event_initialized['dapui_config'] = function() + dapui.open() + end + dap.listeners.before.event_terminated['dapui_config'] = function() + dapui.close() + end + dap.listeners.before.event_exited['dapui_config'] = function() + dapui.close() + end + + dap.adapters.python = { + type = 'executable', + command = '/usr/bin/python', + args = { '-m', 'debugpy.adapter' }, + } + + dap.configurations.python = { + { + type = 'python', + request = 'launch', + name = 'Launch file', + + program = '${file}', + pythonPath = function() + local cwd = vim.fn.getcwd() + if vim.fn.executable(cwd .. '/venv/bin/python') == 1 then + return cwd .. '/venv/bin/python' + elseif vim.fn.executable(cwd .. '/.venv/bin/python') == 1 then + return cwd .. '/.venv/bin/python' + else + return '/usr/bin/python' + end + end, + }, + } + + -- dap.adapters.ruby = { + -- type = 'executable', + -- command = 'bundle', + -- args = { 'exec', 'readapt', 'stdio' }, + -- } + + -- dap.configurations.ruby = { + -- { + -- type = 'ruby', + -- request = 'launch', + -- name = 'Rails', + -- program = 'bundle', + -- programArgs = { 'exec', 'rails', 's' }, + -- useBundler = true, + -- }, + -- } + + vim.api.nvim_create_user_command('DapUIToggle', function() + require('dapui').toggle() + end, {}) + end, + }, +} diff --git a/lua/plugins/editor.lua b/lua/plugins/editor.lua new file mode 100644 index 0000000..8f3084b --- /dev/null +++ b/lua/plugins/editor.lua @@ -0,0 +1,281 @@ +return { + { + 'echasnovski/mini.files', + version = false, + keys = { + { '-', "lua require('mini.files').open(vim.api.nvim_buf_get_name(0))", { silent = true } }, + }, + }, + { + 'nvim-neo-tree/neo-tree.nvim', + keys = { + { 'ee', ':Neotree toggle float', silent = true, desc = 'Float File Explorer' }, + { '', ':Neotree toggle left', silent = true, desc = ' Left File Explorer' }, + }, + cmd = { 'Neotree' }, + opts = { + filesystem = { + filtered_items = { + visible = true, + show_hidden_count = true, + hide_dotfiles = false, + hide_gitignored = true, + hide_by_name = { + '.git', + '.DS_Store', + 'thumbs.db', + '.venv', + }, + never_show = {}, + }, + }, + window = { + position = 'right', + width = 35, + }, + }, + }, + { + 'folke/flash.nvim', + event = 'VeryLazy', + opts = { + modes = { + char = { + jump_labels = true, + }, + }, + }, + -- stylua: ignore + keys = { + { + 'jN', + "lua require('flash').jump({search = { forward = false, wrap = false, multi_window = false },})", mode = { "n", "v" }, + desc = 'Search Backward', + }, + { 'jc', '*', desc = 'Word' }, + { 'jd', 'FlashDiagnostics', mode = { "n", "v" }, desc = 'Diagnostics' }, + { 'jf', 'Telescope jumplist', desc = 'Jumplist' }, + { 'jh', '', desc = 'Backward' }, + { 'jj', "lua require('flash').remote()", mode = { "n", "v" }, desc = 'Remote' }, + { 'jk', "lua require('flash').treesitter()", mode = { "n", "v" }, desc = 'Treesitter' }, + { 'jl', '', desc = 'Forward' }, + { + 'jn', + "lua require('flash').jump({search = { forward = true, wrap = false, multi_window = false },})", mode = { "n", "v" }, + desc = 'Search Forward', + }, + { 'jp', "lua require('flash').jump({continue = true})", mode = { "n", "v" }, desc = 'Previous Jump' }, + { 'js', "lua require('flash').jump()", mode = { "n", "v" }, desc = 'Search' }, + { 'jt', "lua require('flash').treesitter_search()", mode = { "n", "v" }, desc = 'Remote Treesitter' }, + { + 'jw', + 'lua require("flash").jump({ pattern = vim.fn.expand("")})', mode = { "n", "v" }, + desc = 'Current Word', + }, + + }, + }, + { + 'folke/trouble.nvim', + lazy = true, + cmd = { 'Trouble', 'TroubleToggle', 'TroubleRefresh' }, + opts = { + modes = { + lsp = { + win = { position = 'right' }, + }, + }, + }, + keys = { + { 'xx', 'Trouble diagnostics toggle', desc = 'Diagnostics (Trouble)' }, + { 'xX', 'Trouble diagnostics toggle filter.buf=0', desc = 'Buffer Diagnostics (Trouble)' }, + { 'xs', 'Trouble symbols toggle', desc = 'Symbols (Trouble)' }, + { 'xS', 'Trouble lsp toggle', desc = 'LSP references/definitions/... (Trouble)' }, + { 'xL', 'Trouble loclist toggle', desc = 'Location List (Trouble)' }, + { 'xQ', 'Trouble qflist toggle', desc = 'Quickfix List (Trouble)' }, + { + '[q', + function() + if require('trouble').is_open() then + require('trouble').prev({ skip_groups = true, jump = true }) + else + local ok, err = pcall(vim.cmd.cprev) + if not ok then + vim.notify(err, vim.log.levels.ERROR) + end + end + end, + desc = 'Previous Trouble/Quickfix Item', + }, + { + ']q', + function() + if require('trouble').is_open() then + require('trouble').next({ skip_groups = true, jump = true }) + else + local ok, err = pcall(vim.cmd.cnext) + if not ok then + vim.notify(err, vim.log.levels.ERROR) + end + end + end, + desc = 'Next Trouble/Quickfix Item', + }, + }, + }, + { + 'nvim-telescope/telescope.nvim', + cmd = 'Telescope', + version = false, + lazy = true, + dependencies = { + { 'nvim-tree/nvim-web-devicons' }, + { 'nvim-telescope/telescope-fzf-native.nvim', build = 'zig' }, + { 'nvim-telescope/telescope-ui-select.nvim' }, + { 'nvim-telescope/telescope-symbols.nvim' }, + { 'nvim-telescope/telescope-file-browser.nvim' }, + { 'debugloop/telescope-undo.nvim' }, + }, + keys = { + { 'ff', 'Telescope find_files', desc = 'Find Files (CWD)' }, + { 'fg', 'Telescope live_grep', desc = 'Live Grep' }, + { 'fb', 'Telescope buffers', desc = 'Buffers' }, + { 'fh', 'Telescope help_tags', desc = 'Find Help' }, + { 'fo', 'Telescope oldfiles', desc = 'Old Recent Files' }, + { 'fm', 'Telescope marks', desc = 'Marks' }, + { 'fH', 'Telescope highlights', desc = 'Find Highlight Groups' }, + { 'fG', 'Telescope grep_string', desc = 'Grep String' }, + { 'kk', 'Telescope keymaps', desc = 'Keymaps' }, + { 'kc', 'Telescope commands', desc = 'Commands' }, + { 'kh', 'Telescope command_history', desc = 'Command History' }, + { 'ks', 'Telescope search_history', desc = 'Search History' }, + { 'fd', 'Telescope diagnostics', desc = 'Diagnostics' }, + { 'ef', 'Telescope file_browser', desc = 'File Browser' }, + { 'cr', 'Telescope reloader', desc = 'Reload Module' }, + { 'cn', 'Telescope notify', desc = 'Notifications' }, + { 'fu', 'Telescope undo', desc = 'Undo History' }, + { 'fb', 'Telescope buffers', desc = 'Buffers' }, + { 'fq', 'Telescope quickfix', desc = 'Quickfix' }, + { 'fs', 'Telescope current_buffer_fuzzy_find', desc = 'Fuzzy Find in File' }, + }, + + config = function() + require('configs.telescope') + end, + }, + { + 'smjonas/inc-rename.nvim', + cmd = 'IncRename', + config = true, + }, + { + + 'akinsho/toggleterm.nvim', + cmd = { 'ToggleTerm' }, + version = 'v2.*', + keys = { + { 't1', '1ToggleTerm', desc = 'Toggle Terminal', mode = 'n' }, + { 't2', '2ToggleTerm', desc = 'Toggle Terminal', mode = 'n' }, + }, + config = function() + require('configs.toggleterm') + end, + }, + { + '2kabhishek/termim.nvim', + cmd = { 'Fterm', 'FTerm', 'Sterm', 'STerm', 'Vterm', 'VTerm' }, + keys = { + { 'th', 'Sterm', desc = 'Horizontal Terminal' }, + { 'tv', 'Vterm', desc = 'Vertical Terminal' }, + }, + }, + { + 'nvimdev/lspsaga.nvim', + lazy = true, + event = 'LspAttach', + config = function() + vim.keymap.set( + 'n', + 'lo', + 'Lspsaga outline', + { desc = 'Lspsaga | Code Outline', silent = true } + ) + require('lspsaga').setup({ + ui = { + theme = 'round', + border = 'rounded', + winblend = 0, + expand = '', + collaspe = '', + preview = ' ', + code_action = '󱧣 ', + diagnostic = ' ', + hover = ' ', + kind = {}, + }, + lightbulb = { + enable = false, + enable_in_insert = true, + sign = true, + sign_priority = 40, + virtual_text = true, + }, + symbol_in_winbar = { + enable = false, + separator = '  ', + hide_keyword = true, + show_file = true, + folder_level = 0, + }, + }) + end, + }, + { + 'HiPhish/rainbow-delimiters.nvim', + event = { 'BufReadPost', 'BufNewFile' }, + config = function() + local rainbow_delimiters = require('rainbow-delimiters') + require('rainbow-delimiters.setup').setup({ + { + strategy = { + [''] = rainbow_delimiters.strategy['global'], + vim = rainbow_delimiters.strategy['local'], + }, + query = { + [''] = 'rainbow-delimiters', + lua = 'rainbow-blocks', + }, + priority = { + [''] = 110, + lua = 210, + }, + highlight = { + 'RainbowDelimiterRed', + 'RainbowDelimiterYellow', + 'RainbowDelimiterBlue', + 'RainbowDelimiterOrange', + 'RainbowDelimiterGreen', + 'RainbowDelimiterViolet', + 'RainbowDelimiterCyan', + }, + }, + }) + end, + }, + { + '2kabhishek/tdo.nvim', + dependencies = 'nvim-telescope/telescope.nvim', + cmd = { 'Tdo', 'TdoEntry', 'TdoNote', 'TdoTodos', 'TdoToggle', 'TdoFind', 'TdoFiles' }, + keys = { + { 'nd', 'Tdo', desc = "Today's Todo" }, + { 'ne', 'TdoEntry', desc = "Today's Entry" }, + { 'nf', 'TdoFiles', desc = 'All Notes' }, + { 'ng', 'TdoFind', desc = 'Find Notes' }, + { 'nh', 'Tdo -1', desc = "Yesterday's Todo" }, + { 'nl', 'Tdo 1', desc = "Tomorrow's Todo" }, + { 'nn', 'TdoNote', desc = 'New Note' }, + { 'nt', 'TdoTodos', desc = 'Incomplete Todos' }, + { 'nx', 'TdoToggle', desc = 'Toggle Todo' }, + }, + }, +} diff --git a/lua/plugins/linter_formatter.lua b/lua/plugins/linter_formatter.lua new file mode 100644 index 0000000..aea0654 --- /dev/null +++ b/lua/plugins/linter_formatter.lua @@ -0,0 +1,24 @@ +return { + { + 'williamboman/mason.nvim', + cmd = { 'Mason', 'MasonInstall', 'MasonInstallAll', 'MasonUpdate' }, + dependencies = { + { 'williamboman/mason-lspconfig.nvim', event = { 'BufReadPre', 'BufNewFile' } }, + { 'WhoIsSethDaniel/mason-tool-installer.nvim' }, + { 'zapling/mason-lock.nvim', cmd = { 'MasonLock', 'MasonLockRestore' }, opts = {} }, + }, + config = function() + require('mason').setup() + end, + }, + { + 'nvimtools/none-ls.nvim', -- configure formatters & linters + event = { 'BufRead', 'FileType' }, + dependencies = { + 'jay-babu/mason-null-ls.nvim', + }, + config = function() + require('configs.none-ls') + end, + }, +} diff --git a/lua/plugins/lsp.lua b/lua/plugins/lsp.lua new file mode 100644 index 0000000..59d56a1 --- /dev/null +++ b/lua/plugins/lsp.lua @@ -0,0 +1,13 @@ +return { + { + 'neovim/nvim-lspconfig', + event = { 'BufReadPost', 'BufNewFile', 'BufWritePre' }, + dependencies = { + 'hrsh7th/cmp-nvim-lsp', + { 'antosha417/nvim-lsp-file-operations', config = true }, + }, + config = function() + require('configs.lsp') + end, + }, +} diff --git a/lua/plugins/lspconfig.lua b/lua/plugins/lspconfig.lua deleted file mode 100644 index 4a0fdb9..0000000 --- a/lua/plugins/lspconfig.lua +++ /dev/null @@ -1,169 +0,0 @@ -return { - 'neovim/nvim-lspconfig', - event = { 'BufReadPost', 'FileType' }, - dependencies = { - 'hrsh7th/cmp-nvim-lsp', - { 'antosha417/nvim-lsp-file-operations', config = true }, - }, - config = function() - -- import lspconfig plugin - local lspconfig = require('lspconfig') - -- import cmp-nvim-lsp plugin - local cmp_nvim_lsp = require('cmp_nvim_lsp') - - local keymap = vim.keymap -- for conciseness - - vim.api.nvim_create_autocmd('LspAttach', { - group = vim.api.nvim_create_augroup('UserLspConfig', {}), - callback = function(ev) - -- Buffer local mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - local opts = { buffer = ev.buf, silent = true } - - -- set keybinds - opts.desc = 'Show LSP references' - keymap.set('n', 'gR', 'Telescope lsp_references', opts) -- show definition, references - - opts.desc = 'Go to declaration' - keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) -- go to declaration - - opts.desc = 'Show LSP definitions' - keymap.set('n', 'gd', 'Telescope lsp_definitions', opts) -- show lsp definitions - - opts.desc = 'Show LSP implementations' - keymap.set('n', 'gi', 'Telescope lsp_implementations', opts) -- show lsp implementations - - opts.desc = 'Show LSP type definitions' - keymap.set('n', 'gt', 'Telescope lsp_type_definitions', opts) -- show lsp type definitions - - opts.desc = 'See available code actions' - keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, opts) -- see available code actions, in visual mode will apply to selection - - opts.desc = 'Smart rename' - keymap.set('n', 'rn', vim.lsp.buf.rename, opts) -- smart rename - - opts.desc = 'Show buffer diagnostics' - keymap.set('n', 'D', 'Telescope diagnostics bufnr=0', opts) -- show diagnostics for file - - opts.desc = 'Show line diagnostics' - keymap.set('n', 'd', vim.diagnostic.open_float, opts) -- show diagnostics for line - - opts.desc = 'Show documentation for what is under cursor' - keymap.set('n', 'K', vim.lsp.buf.hover, opts) -- show documentation for what is under cursor - - opts.desc = 'Restart LSP' - keymap.set('n', 'rs', ':LspRestart', opts) -- mapping to restart lsp if necessary - end, - }) - - -- used to enable autocompletion (assign to every lsp server config) - local capabilities = cmp_nvim_lsp.default_capabilities() - - -- configure matlab server - lspconfig['clangd'].setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - -- configure bash server - lspconfig['bashls'].setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - -- configure html server - lspconfig['html'].setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - -- configure typescript server with plugin - lspconfig['tsserver'].setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - - -- configure css server - lspconfig['cssls'].setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - - -- configure tailwindcss server - lspconfig['tailwindcss'].setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - - -- configure svelte server - lspconfig['svelte'].setup({ - capabilities = capabilities, - on_attach = function(client, bufnr) - on_attach(client, bufnr) - - vim.api.nvim_create_autocmd('BufWritePost', { - pattern = { '*.js', '*.ts' }, - callback = function(ctx) - if client.name == 'svelte' then - client.notify('$/onDidChangeTsOrJsFile', { uri = ctx.file }) - end - end, - }) - end, - }) - -- configure python server - lspconfig['pyright'].setup({ - capabilities = capabilities, - on_attach = on_attach, - }) - - -- configure lua server (with special settings) - lspconfig['lua_ls'].setup({ - capabilities = capabilities, - on_attach = on_attach, - settings = { -- custom settings for lua - Lua = { - -- make the language server recognize "vim" global - diagnostics = { - globals = { 'vim' }, - }, - workspace = { - -- make language server aware of runtime files - library = { - [vim.fn.expand('$VIMRUNTIME/lua')] = true, - [vim.fn.stdpath('config') .. '/lua'] = true, - }, - }, - }, - }, - }) - - local x = vim.diagnostic.severity - local config = { - -- Enable virtual text - virtual_text = { -- or false for disable - prefix = '', -- ■  󰊠 - suffix = '', - format = function(diagnostic) - local prefix = '󰊠 ' - local suffix = ' ' - -- return full message with custom prefix & suffix - return prefix .. diagnostic.message .. suffix - end, - }, - update_in_insert = true, - signs = { text = { [x.ERROR] = '', [x.WARN] = '', [x.HINT] = '󰌵', [x.INFO] = '' } }, - underline = false, - severity_sort = true, - float = { - focusable = false, - style = 'minimal', - border = 'rounded', - source = 'always', - header = '', - prefix = '', - }, - } - - vim.diagnostic.config(config) - -- add borders to lsp info window - require('lspconfig.ui.windows').default_options.border = 'single' - end, -} diff --git a/lua/plugins/lspsaga.lua b/lua/plugins/lspsaga.lua deleted file mode 100644 index 87d61c9..0000000 --- a/lua/plugins/lspsaga.lua +++ /dev/null @@ -1,41 +0,0 @@ -return { - 'nvimdev/lspsaga.nvim', - lazy = true, - event = 'LspAttach', - config = function() - vim.keymap.set( - 'n', - 'ot', - 'Lspsaga outline', - { desc = 'Lspsaga | Code Outline', silent = true } - ) - require('lspsaga').setup({ - ui = { - theme = 'round', - border = 'rounded', - winblend = 0, - expand = '', - collaspe = '', - preview = ' ', - code_action = '󱧣 ', - diagnostic = ' ', - hover = ' ', - kind = {}, - }, - lightbulb = { - enable = false, - enable_in_insert = true, - sign = true, - sign_priority = 40, - virtual_text = true, - }, - symbol_in_winbar = { - enable = false, - separator = '  ', - hide_keyword = true, - show_file = true, - folder_level = 0, - }, - }) - end, -} diff --git a/lua/plugins/lualine.lua b/lua/plugins/lualine.lua deleted file mode 100644 index 35a06d6..0000000 --- a/lua/plugins/lualine.lua +++ /dev/null @@ -1,210 +0,0 @@ -return { - 'nvim-lualine/lualine.nvim', - dependencies = { - 'nvim-tree/nvim-web-devicons', - }, - event = 'UIEnter', - config = function() - -- Eviline config for lualine - -- Author: shadmansaleh - -- Credit: glepnir - local lualine = require('lualine') - --- Color table for highlights - -- stylua: ignore - local colors = { - bg = 'none', - fg = '#bbc2cf', - yellow = '#ECBE7B', - cyan = '#008080', - darkblue = '#081633', - green = '#98be65', - orange = '#FF8800', - violet = '#a9a1e1', - magenta = '#c678dd', - blue = '#51afef', - red = '#ec5f67', - } - - local conditions = { - buffer_not_empty = function() - return vim.fn.empty(vim.fn.expand('%:t')) ~= 1 - end, - hide_in_width = function() - return vim.fn.winwidth(0) > 80 - end, - check_git_workspace = function() - local filepath = vim.fn.expand('%:p:h') - local gitdir = vim.fn.finddir('.git', filepath .. ';') - return gitdir and #gitdir > 0 and #gitdir < #filepath - end, - } - - -- Config - local config = { - options = { - -- Disable sections and component separators - component_separators = '', - section_separators = '', - disabled_filetypes = { - 'NeoTree', - 'NvimTree', - 'Outline', - 'alpha', - }, - theme = { - -- We are going to use lualine_c an lualine_x as left and - -- right section. Both are highlighted by c theme . So we - -- are just setting default looks o statusline - normal = { c = { fg = colors.fg, bg = colors.bg } }, - inactive = { c = { fg = colors.fg, bg = colors.bg } }, - }, - }, - sections = { - -- these are to remove the defaults - lualine_a = {}, - lualine_b = {}, - lualine_y = {}, - lualine_z = {}, - -- These will be filled later - lualine_c = {}, - lualine_x = {}, - }, - inactive_sections = { - -- these are to remove the defaults - lualine_a = {}, - lualine_b = {}, - lualine_y = {}, - lualine_z = {}, - lualine_c = {}, - lualine_x = {}, - }, - } - - -- Inserts a component in lualine_c at left section - local function ins_left(component) - table.insert(config.sections.lualine_c, component) - end - - -- Inserts a component in lualine_x at right section - local function ins_right(component) - table.insert(config.sections.lualine_x, component) - end - - ins_left({ - function() - return '▊' - end, - color = { fg = colors.blue }, -- Sets highlighting of component - padding = { left = 0, right = 1 }, -- We don't need space before this - }) - - ins_left({ - -- mode component - function() - return '' - end, - color = function() - -- auto change color according to neovims mode - local mode_color = { - n = colors.red, - i = colors.green, - v = colors.blue, - ['␖'] = colors.blue, - V = colors.blue, - c = colors.magenta, - no = colors.red, - s = colors.orange, - S = colors.orange, - ['␓'] = colors.orange, - ic = colors.yellow, - R = colors.violet, - Rv = colors.violet, - cv = colors.red, - ce = colors.red, - r = colors.cyan, - rm = colors.cyan, - ['r?'] = colors.cyan, - ['!'] = colors.red, - t = colors.red, - } - return { fg = mode_color[vim.fn.mode()] } - end, - padding = { right = 1 }, - }) - - ins_left({ - 'filename', - cond = conditions.buffer_not_empty, - color = { fg = colors.magenta, gui = 'bold' }, - }) - - ins_left({ - 'diagnostics', - sources = { 'nvim_diagnostic' }, - symbols = { error = ' ', warn = ' ', info = ' ' }, - diagnostics_color = { - error = { fg = colors.red }, - warn = { fg = colors.yellow }, - info = { fg = colors.cyan }, - }, - }) - - -- Insert mid section. You can make any number of sections in neovim :) - -- for lualine it's any number greater then 2 - ins_left({ - function() - return '%=' - end, - }) - - ins_left({ - -- Lsp server name . - function() - local msg = 'No Active Lsp' - local clients = vim.lsp.get_clients() - if next(clients) == nil then - return msg - end - for _, client in ipairs(clients) do - local filetypes = client.config.filetypes - if filetypes and vim.fn.index(filetypes) ~= -1 then - return client.name - end - end - return msg - end, - icon = ' LSP:', - color = { fg = '#ffffff', gui = 'bold' }, - }) - - ins_right({ - 'diff', - -- Is it me or the symbol for modified us really weird - symbols = { added = ' ', modified = ' ', removed = ' ' }, - diff_color = { - added = { fg = colors.green }, - modified = { fg = colors.orange }, - removed = { fg = colors.red }, - }, - cond = conditions.hide_in_width, - }) - - ins_right({ - 'branch', - icon = '', - color = { fg = colors.violet, gui = 'bold' }, - }) - - ins_right({ - function() - return '▊' - end, - color = { fg = colors.blue }, - padding = { left = 1 }, - }) - - -- Now don't forget to initialize lualine - lualine.setup(config) - end, -} diff --git a/lua/plugins/mason.lua b/lua/plugins/mason.lua deleted file mode 100644 index 4398482..0000000 --- a/lua/plugins/mason.lua +++ /dev/null @@ -1,57 +0,0 @@ -return { - 'williamboman/mason.nvim', - cmd = { 'Mason', 'MasonInstall', 'MasonInstallAll', 'MasonUpdate' }, - dependencies = { - { 'williamboman/mason-lspconfig.nvim', event = { 'BufReadPre', 'BufNewFile' } }, - 'WhoIsSethDaniel/mason-tool-installer.nvim', - { 'zapling/mason-lock.nvim', cmd = { 'MasonLock', 'MasonLockRestore' }, opts = {} }, - }, - config = function() - local mason = require('mason') - local mason_lspconfig = require('mason-lspconfig') - local mason_tool_installer = require('mason-tool-installer') - - -- enable mason and configure icons - mason.setup({ - ui = { - border = 'rounded', - icons = { - package_installed = '✓', - package_pending = '➜', - package_uninstalled = '✗', - }, - }, - }) - - mason_lspconfig.setup({ - -- list of servers for mason to install - ensure_installed = { - 'tsserver', - 'html', - 'cssls', - 'tailwindcss', - 'svelte', - 'lua_ls', - 'pyright', - 'jdtls', - 'bashls', - 'jsonls', - 'clangd', - }, - }) - - mason_tool_installer.setup({ - ensure_installed = { - 'prettier', -- prettier formatter - 'biome', -- js formatter - 'stylua', -- lua formatter - 'black', -- python formatter - 'isort', -- python formatter - 'clang-format', -- c/c++ formatter - 'luacheck', - 'pylint', - 'eslint_d', - }, - }) - end, -} diff --git a/lua/plugins/mini.lua b/lua/plugins/mini.lua index 8158daf..0819162 100644 --- a/lua/plugins/mini.lua +++ b/lua/plugins/mini.lua @@ -5,15 +5,9 @@ return { version = false, config = function() require('mini.comment').setup({}) + require('mini.ai').setup({}) require('mini.cursorword').setup() -- require("mini.tabline").setup() - local statusline = require('mini.statusline') - statusline.setup({ use_icons = true }) - ---@diagnostic disable-next-line: duplicate-set-field - statusline.section_location = function() - return '%2l:%-2v' - end - require('mini.bracketed').setup({ file = { suffix = '' }, window = { suffix = '' }, @@ -31,6 +25,9 @@ return { highlight = 'gsh', -- Highlight surrounding update_n_lines = 'gsn', -- Update `n_lines` }, + keys = { + { 'gz', '', desc = '+surround' }, + }, }) require('mini.pairs').setup({ odes = { command = true }, diff --git a/lua/plugins/neo-tree.lua b/lua/plugins/neo-tree.lua deleted file mode 100644 index 44b72a5..0000000 --- a/lua/plugins/neo-tree.lua +++ /dev/null @@ -1,35 +0,0 @@ -return { - 'nvim-neo-tree/neo-tree.nvim', - enabled = true, - dependencies = { - 'nvim-lua/plenary.nvim', - 'nvim-tree/nvim-web-devicons', - 'MunifTanjim/nui.nvim', - }, - keys = { - { 'ee', ':Neotree toggle float', silent = true, desc = 'Float File Explorer' }, - { '', ':Neotree toggle left', silent = true, desc = 'Left File Explorer' }, - }, - cmd = { 'Neotree' }, - opts = { - filesystem = { - filtered_items = { - visible = true, - show_hidden_count = true, - hide_dotfiles = false, - hide_gitignored = true, - hide_by_name = { - '.git', - '.DS_Store', - 'thumbs.db', - '.venv', - }, - never_show = {}, - }, - }, - window = { - position = 'right', - width = 35, - }, - }, -} diff --git a/lua/plugins/neotest.lua b/lua/plugins/neotest.lua deleted file mode 100644 index 7e8b872..0000000 --- a/lua/plugins/neotest.lua +++ /dev/null @@ -1,73 +0,0 @@ -return { - 'nvim-neotest/neotest', - dependencies = { 'haydenmeade/neotest-jest', 'marilari88/neotest-vitest' }, - cmd = 'Neotest', - config = function() - require('neotest').setup({ - status = { virtual_text = true }, - output = { open_on_run = true }, - adapters = { - require('neotest-vitest'), - require('neotest-jest')({ - jestCommand = 'npm test --', - jestConfigFile = 'custom.jest.config.ts', - env = { CI = true }, - cwd = function(path) - return vim.fn.getcwd() - end, - }), - }, - }) - end, - keys = { - { - 'tw', - function() - require('neotest').run.run(vim.fn.expand('%')) - end, - desc = 'Run File', - }, - { - 'tT', - function() - require('neotest').run.run(vim.loop.cwd()) - end, - desc = 'Run All Test Files', - }, - { - 'tr', - function() - require('neotest').run.run() - end, - desc = 'Run Nearest', - }, - { - 'ts', - function() - require('neotest').summary.toggle() - end, - desc = 'Toggle Summary', - }, - { - 'to', - function() - require('neotest').output.open({ enter = true, auto_close = true }) - end, - desc = 'Show Output', - }, - { - 'tO', - function() - require('neotest').output_panel.toggle() - end, - desc = 'Toggle Output Panel', - }, - { - 'tS', - function() - require('neotest').run.stop() - end, - desc = 'Stop', - }, - }, -} diff --git a/lua/plugins/noice.lua b/lua/plugins/noice.lua deleted file mode 100644 index 8379300..0000000 --- a/lua/plugins/noice.lua +++ /dev/null @@ -1,101 +0,0 @@ --- override nvim ui -return { - 'folke/noice.nvim', - event = 'UIEnter', - dependencies = { - 'nvim-treesitter/nvim-treesitter', - 'MunifTanjim/nui.nvim', - 'rcarriga/nvim-notify', - }, - opts = { - cmdline = { - view = 'cmdline', - format = { - cmdline = { icon = '▍' }, - substitute = { - pattern = '^:%%?s/', - icon = ' ', - ft = 'regex', - opts = { border = { text = { top = ' sub (old/new/) ' } } }, - }, - input = { view = 'cmdline_input', icon = '█' }, - }, - }, - routes = { - { - view = 'notify', - filter = { event = 'msg_showmode' }, - }, - { - filter = { - event = 'msg_show', - kind = '', - find = 'written', - }, - opts = { skip = true }, - }, - }, - lsp = { - progress = { - enabled = false, - -- Lsp Progress is formatted using the builtins for lsp_progress. See config.format.builtin - -- See the section on formatting for more details on how to customize. - format = 'lsp_progress', - format_done = 'lsp_progress_done', - throttle = 1000 / 30, -- frequency to update lsp progress message - view = 'mini', - }, - override = { - -- override the default lsp markdown formatter with Noice - ['vim.lsp.util.convert_input_to_markdown_lines'] = true, - -- override the lsp markdown formatter with Noice - ['vim.lsp.util.stylize_markdown'] = true, - -- override cmp documentation with Noice (needs the other options to work) - ['cmp.entry.get_documentation'] = true, - }, - hover = { - enabled = true, - silent = false, -- set to true to not show a message if hover is not available - view = nil, -- when nil, use defaults from documentation - opts = {}, -- merged with defaults from documentation - }, - signature = { - enabled = false, - auto_open = { - enabled = true, - trigger = true, -- Automatically show signature help when typing a trigger character from the LSP - luasnip = true, -- Will open signature help when jumping to Luasnip insert nodes - throttle = 50, -- Debounce lsp signature help request by 50ms - }, - view = nil, -- when nil, use defaults from documentation - opts = {}, -- merged with defaults from documentation - }, - message = { - -- Messages shown by lsp servers - enabled = true, - view = 'notify', - opts = {}, - }, - -- defaults for hover and signature help - documentation = { - view = 'hover', - opts = { - lang = 'markdown', - replace = true, - render = 'plain', - format = { '{message}' }, - win_options = { concealcursor = 'n', conceallevel = 3 }, - }, - }, - }, - presets = { - -- you can enable a preset by setting it to true, or a table that will override the preset config - -- you can also add custom presets that you can enable/disable with enabled=true - bottom_search = true, -- use a classic bottom cmdline for search - command_palette = false, -- position the cmdline and popupmenu together - long_message_to_split = true, -- long messages will be sent to a split - inc_rename = false, -- enables an input dialog for inc-rename.nvim - lsp_doc_border = true, -- add a border to hover docs and signature help - }, - }, -} diff --git a/lua/plugins/none-ls.lua b/lua/plugins/none-ls.lua deleted file mode 100644 index 777f90d..0000000 --- a/lua/plugins/none-ls.lua +++ /dev/null @@ -1,70 +0,0 @@ -return { - 'nvimtools/none-ls.nvim', -- configure formatters & linters - event = { 'BufRead', 'FileType' }, - dependencies = { - 'jay-babu/mason-null-ls.nvim', - }, - config = function() - local mason_null_ls = require('mason-null-ls') - - local null_ls = require('null-ls') - - local null_ls_utils = require('null-ls.utils') - - mason_null_ls.setup({ - ensure_installed = { - 'prettier', -- prettier formatter - 'biome', -- js formatter - 'clang-format', -- c/c++ formatter - 'stylua', -- lua formatter - 'black', -- python formatter - 'pylint', -- python linter - -- "eslint_d", -- js linter - }, - }) - - -- for conciseness - local formatting = null_ls.builtins.formatting -- to setup formatters - local diagnostics = null_ls.builtins.diagnostics -- to setup linters - - -- to setup format on save - local augroup = vim.api.nvim_create_augroup('LspFormatting', {}) - - -- configure null_ls - null_ls.setup({ - root_dir = null_ls_utils.root_pattern('.null-ls-root', 'Makefile', '.git', 'package.json'), - sources = { - formatting.prettier, -- js/ts formatter - formatting.stylua, -- lua formatter - formatting.isort, - formatting.black, - formatting.clang_format, - diagnostics.pylint, - -- diagnostics.eslint_d.with({ -- js/ts linter - -- condition = function(utils) - -- return utils.root_has_file({ ".eslintrc.js", ".eslintrc.cjs" }) -- only enable if root has .eslintrc.js or .eslintrc.cjs - -- end, - -- }), - }, - -- configure format on save - on_attach = function(current_client, bufnr) - if current_client.supports_method('textDocument/formatting') then - vim.api.nvim_clear_autocmds({ group = augroup, buffer = bufnr }) - vim.api.nvim_create_autocmd('BufWritePre', { - group = augroup, - buffer = bufnr, - callback = function() - vim.lsp.buf.format({ - filter = function(client) - -- only use null-ls for formatting instead of lsp server - return client.name == 'null-ls' - end, - bufnr = bufnr, - }) - end, - }) - end - end, - }) - end, -} diff --git a/lua/plugins/nvim-dap.lua b/lua/plugins/nvim-dap.lua deleted file mode 100644 index 8e30c2e..0000000 --- a/lua/plugins/nvim-dap.lua +++ /dev/null @@ -1,32 +0,0 @@ -return { - 'mfussenegger/nvim-dap', - dependencies = { - 'leoluz/nvim-dap-go', - 'rcarriga/nvim-dap-ui', - 'nvim-neotest/nvim-nio', - }, - lazy = true, - config = function() - require('dap-go').setup() - require('dapui').setup() - local dap = require('dap') - local keymap = vim.keymap - local dapui = require('dapui') - - keymap.set('n', 'dt', dap.toggle_breakpoint, {}) - keymap.set('n', 'dc', dap.continue, {}) - - dap.listeners.before.attach.dapui_config = function() - dapui.open() - end - dap.listeners.before.launch.dapui_config = function() - dapui.open() - end - dap.listeners.before.event_terminated.dapui_config = function() - dapui.close() - end - dap.listeners.before.event_exited.dapui_config = function() - dapui.close() - end - end, -} diff --git a/lua/plugins/other.lua b/lua/plugins/other.lua new file mode 100644 index 0000000..903e3f2 --- /dev/null +++ b/lua/plugins/other.lua @@ -0,0 +1,170 @@ +return { + { + 'folke/persistence.nvim', + event = 'BufReadPre', + opts = { options = vim.opt.sessionoptions:get() }, + keys = { + { + 'ms', + function() + require('persistence').load() + end, + desc = 'Restore Session', + }, + { + 'ml', + function() + require('persistence').load({ last = true }) + end, + desc = 'Restore Last Session', + }, + { + 'md', + function() + require('persistence').stop() + end, + desc = "Don't Save Current Session", + }, + }, + }, + { + 'nvim-lua/plenary.nvim', + lazy = true, + }, + { + 'iamcco/markdown-preview.nvim', + build = 'cd app && yarn install', + ft = { 'markdown' }, + keys = { + { + 'cm', + 'MarkdownPreviewToggle', + desc = 'toggle markdown preview', + }, + }, + }, + { + 'nvim-pack/nvim-spectre', + build = false, + cmd = 'Spectre', + opts = { open_cmd = 'noswapfile vnew' }, + keys = { + { + 'mr', + function() + require('spectre').open() + end, + desc = 'Replace in Files (Spectre)', + }, + }, + }, + { + 'szw/vim-maximizer', + + keys = { + { 'mm', 'MaximizerToggle', desc = 'Maximize/minimize a split' }, + }, + }, + { + 'folke/zen-mode.nvim', + cmd = { 'ZenMode' }, + opts = {}, + keys = { + { 'wz', 'ZenMode', desc = 'Toggle zen mode' }, + }, + }, + { + 'chrisgrieser/nvim-recorder', + dependencies = { 'rcarriga/nvim-notify' }, + event = 'VeryLazy', + vscode = true, + keys = { + { 'q', desc = 'Start Recording' }, + { 'Q', desc = 'Play Recording' }, + { '', desc = 'Switch Slot' }, + { 'cq', desc = 'Edit Macro' }, + { 'yq', desc = 'Yank Macro' }, + { 'dq', desc = 'Delete All Macros' }, + }, + opts = { + useNerdFontsIcons = false, + slots = { 'a', 'b', 'c', 'd' }, + mapping = { + startStopRecording = 'q', + playMacro = 'Q', + editMacro = 'cq', + switchSlot = '', + deleteAllMacros = 'dq', + yankMacro = 'yq', + }, + }, + }, + { + 'creativenull/dotfyle-metadata.nvim', + cmd = { 'DotfyleGenerate', 'DotfyleOpen' }, + }, + { + 'willothy/flatten.nvim', + priority = 1001, + opts = { + window = { + open = 'alternate', + }, + }, + }, + { + 'wakatime/vim-wakatime', + lazy = false, + }, + { + 'mvllow/modes.nvim', + event = { 'BufReadPost', 'BufNewFile' }, + tag = 'v0.2.0', + config = function() + require('modes').setup({ + + colors = { + visual = '#f5c359', + delete = '#c75c6a', + copy = '#78ccc5', + insert = '#c5739a', + }, + line_opacity = 0.15, + set_cursor = true, + set_cursorline = true, + set_number = true, + ignore_filetypes = { 'NvimTree', 'TelescopePrompt' }, + }) + end, + }, + { + 'LunarVim/bigfile.nvim', + event = { 'BufEnter', 'WinEnter' }, + opts = { + -- Disables LSP/treesitter, etc for files above 5000 lives (even if they have really long lines) + pattern = function(bufnr, filesize_mib) + if filesize_mib >= 2 then + return true + end + -- you can't use `nvim_buf_line_count` because this runs on BufReadPre + local file_contents = vim.fn.readfile(vim.api.nvim_buf_get_name(bufnr)) + local file_length = #file_contents + if file_length > 5000 then + return true + end + + return false + end, + }, + }, + { + 'm4xshen/hardtime.nvim', + config = function() + require('hardtime').setup({ enabled = true }) + end, + cmd = 'Hardtime', + init = function() + vim.keymap.set('n', 'ch', 'HardtimeToggle', { desc = 'Toggle Hardtime' }) + end, + }, +} diff --git a/lua/plugins/telescope.lua b/lua/plugins/telescope.lua deleted file mode 100644 index b85044c..0000000 --- a/lua/plugins/telescope.lua +++ /dev/null @@ -1,145 +0,0 @@ -return { - { - 'nvim-telescope/telescope.nvim', - cmd = 'Telescope', - version = false, - lazy = true, - dependencies = { - { 'nvim-lua/plenary.nvim' }, - { 'nvim-tree/nvim-web-devicons' }, - { 'nvim-telescope/telescope-fzf-native.nvim', build = 'zig' }, - { 'nvim-telescope/telescope-ui-select.nvim' }, - { 'nvim-telescope/telescope-file-browser.nvim' }, - }, - keys = { - { - 'sf', - function() - require('telescope.builtin').find_files() - end, - desc = 'Find File (CWD)', - }, - { - 'sh', - function() - require('telescope.builtin').help_tags() - end, - desc = 'Find Help', - }, - { - 'sH', - function() - require('telescope.builtin').highlights() - end, - desc = 'Find highlight groups', - }, - { - 'sM', - function() - require('telescope.builtin').man_pages() - end, - desc = 'Map Pages', - }, - { - 'so', - function() - require('telescope.builtin').oldfiles() - end, - desc = 'Open Recent File', - }, - { - 'sg', - function() - require('telescope.builtin').live_grep() - end, - desc = 'Live Grep', - }, - { - 'sw', - function() - require('telescope.builtin').grep_string() - end, - desc = 'Grep String', - }, - { - 'sk', - function() - require('telescope.builtin').keymaps() - end, - desc = 'Keymaps', - }, - { - 'sC', - function() - require('telescope.builtin').commands() - end, - desc = 'Commands', - }, - { - '', - function() - require('telescope.builtin').buffers() - end, - desc = 'Buffers', - }, - { - 'sd', - function() - require('telescope.builtin').diagnostics() - end, - desc = 'diagnostics', - }, - { - 'sF', - 'Telescope file_browser', - desc = 'File Browser', - }, - }, - config = function() - local telescope = require('telescope') - local fb_actions = require('telescope').extensions.file_browser.actions - telescope.setup({ - file_ignore_patterns = { '%.git/.' }, - defaults = { - preview = { - treesitter = false, - }, - }, - extensions = { - fzf = { - fuzzy = true, -- false will only do exact matching - override_generic_sorter = true, -- override the generic sorter - override_file_sorter = true, -- override the file sorter - case_mode = 'smart_case', -- or "ignore_case" or "respect_case" - }, - file_browser = { - theme = 'ivy', - hijack_netrw = true, - mapping = { - ['i'] = { - [''] = fb_actions.create, - [''] = fb_actions.rename, - [''] = fb_actions.remove, - [''] = fb_actions.toggle_hidden, - }, - ['n'] = { - [''] = fb_actions.create, - ['1', '1ToggleTerm', desc = 'Toggle Terminal', mode = 'n' }, - { '', 'ToggleTerm size=' .. size() .. '', desc = 'Toggle Terminal', mode = 'n' }, - { '2', '2ToggleTerm', desc = 'Toggle Terminal', mode = 'n' }, - }, - opts = { - size = 10, - open_mapping = [[]], - hide_numbers = true, - shade_filetypes = {}, - shade_terminals = true, - shading_factor = '2', - start_in_insert = true, - insert_mappings = true, - terminal_mappings = true, - persist_size = true, - direction = 'float', -- Use 'float' for floating terminal windows - close_on_exit = true, - shell = vim.o.shell, - float_opts = { - border = 'curved', -- or 'single', 'double', 'shadow', etc. - winblend = 0, -- Set to 0 for full transparency - highlights = { - border = 'Normal', - background = 'Normal', - }, - }, - }, - { - '2kabhishek/termim.nvim', - cmd = { 'Fterm', 'FTerm', 'Sterm', 'STerm', 'Vterm', 'VTerm' }, - keys = { - { 'th', 'Sterm', desc = 'Horizontal Terminal' }, - { 'tv', 'Vterm', desc = 'Vertical Terminal' }, - }, - }, -} diff --git a/lua/plugins/test.lua b/lua/plugins/test.lua new file mode 100644 index 0000000..536de3d --- /dev/null +++ b/lua/plugins/test.lua @@ -0,0 +1,40 @@ +return { + 'nvim-neotest/neotest', + dependencies = { + 'nvim-neotest/nvim-nio', + 'olimorris/neotest-rspec', + 'nvim-neotest/neotest-jest', + 'nvim-neotest/neotest-python', + }, + cmd = 'Neotest', + config = function() + require('neotest').setup({ + status = { virtual_text = true }, + output = { open_on_run = true }, + adapters = { + require('neotest-vitest'), + require('neotest-jest')({ + jestCommand = 'npm test --', + jestConfigFile = 'custom.jest.config.ts', + env = { CI = true }, + cwd = function(path) + return vim.fn.getcwd() + end, + }), + }, + }) + end, + keys = { + { 'uc', 'lua require("neotest").run.run()', desc = 'Run Current Test' }, + { 'uf', 'lua require("neotest").run.run(vim.fn.expand("%"))', desc = 'Run Test File' }, + { + 'uo', + 'lua require("neotest").output.open({ enter = true, auto_close = true })', + desc = 'Show Output', + }, + { 'uS', 'lua require("neotest").summary.toggle', desc = 'Toggle Summary' }, + { 'ur', 'lua require("neotest").run.run()', desc = 'Run Nearest Test' }, + { 'us', 'lua require("neotest").run.stop()', desc = 'Stop' }, + { 'uO', 'lua require("neotest").output_panel.toggle', desc = 'Toggle Output Panel' }, + }, +} diff --git a/lua/plugins/nvim-treesitter.lua b/lua/plugins/treesitter.lua similarity index 77% rename from lua/plugins/nvim-treesitter.lua rename to lua/plugins/treesitter.lua index 6417bbd..930ed5a 100644 --- a/lua/plugins/nvim-treesitter.lua +++ b/lua/plugins/treesitter.lua @@ -7,7 +7,7 @@ return { cmd = { 'TSInstall', 'TSBufEnable', 'TSBufDisable', 'TSModuleInfo' }, dependencies = { 'nvim-treesitter/nvim-treesitter-textobjects', - 'windwp/nvim-ts-autotag', + { 'windwp/nvim-ts-autotag', event = { 'BufReadPost', 'BufNewFile', 'BufWritePre' } }, }, config = function() require('nvim-ts-autotag').setup() @@ -46,7 +46,6 @@ return { textobjects = { select = { enable = true, - -- Automatically jump forward to textobj, similar to targets.vim lookahead = true, keymaps = { ['af'] = { query = '@function.outer', desc = 'Select outer part of a function region' }, @@ -72,19 +71,12 @@ return { end, }, { - 'nvim-treesitter/nvim-treesitter-context', - dependencies = { 'nvim-treesitter/nvim-treesitter' }, - config = function() - require('treesitter-context').setup({ enable = false }) - end, - cmd = 'TSContextToggle', - init = function() - vim.keymap.set('n', '[c', function() - require('treesitter-context').go_to_context() - end, { silent = true, desc = 'Go to TS context' }) - vim.keymap.set('n', 'tc', function() - require('treesitter-context').toggle() - end, { silent = true, desc = 'Toggle TS Context' }) - end, + { + 'nvim-treesitter/nvim-treesitter-context', + event = 'VeryLazy', + config = function(_, opts) + require('treesitter-context').setup({ mode = 'cursor', max_lines = 3 }) + end, + }, }, } diff --git a/lua/plugins/trouble.lua b/lua/plugins/trouble.lua deleted file mode 100644 index 7dfac42..0000000 --- a/lua/plugins/trouble.lua +++ /dev/null @@ -1,48 +0,0 @@ -return { - 'folke/trouble.nvim', - lazy = true, - cmd = { 'Trouble', 'TroubleToggle', 'TroubleRefresh' }, - opts = { - modes = { - lsp = { - win = { position = 'right' }, - }, - }, - }, - keys = { - { 'xx', 'Trouble diagnostics toggle', desc = 'Diagnostics (Trouble)' }, - { 'xX', 'Trouble diagnostics toggle filter.buf=0', desc = 'Buffer Diagnostics (Trouble)' }, - { 'cs', 'Trouble symbols toggle', desc = 'Symbols (Trouble)' }, - { 'cS', 'Trouble lsp toggle', desc = 'LSP references/definitions/... (Trouble)' }, - { 'xL', 'Trouble loclist toggle', desc = 'Location List (Trouble)' }, - { 'xQ', 'Trouble qflist toggle', desc = 'Quickfix List (Trouble)' }, - { - '[q', - function() - if require('trouble').is_open() then - require('trouble').prev({ skip_groups = true, jump = true }) - else - local ok, err = pcall(vim.cmd.cprev) - if not ok then - vim.notify(err, vim.log.levels.ERROR) - end - end - end, - desc = 'Previous Trouble/Quickfix Item', - }, - { - ']q', - function() - if require('trouble').is_open() then - require('trouble').next({ skip_groups = true, jump = true }) - else - local ok, err = pcall(vim.cmd.cnext) - if not ok then - vim.notify(err, vim.log.levels.ERROR) - end - end - end, - desc = 'Next Trouble/Quickfix Item', - }, - }, -} diff --git a/lua/plugins/ui.lua b/lua/plugins/ui.lua new file mode 100644 index 0000000..914cef9 --- /dev/null +++ b/lua/plugins/ui.lua @@ -0,0 +1,222 @@ +return { + { + 'rcarriga/nvim-notify', + event = 'VeryLazy', + keys = { + { + 'mn', + function() + require('notify').dismiss({ silent = true, pending = true }) + end, + desc = 'Dismiss All Notifications', + }, + }, + opts = { + level = 2, + minimum_width = 50, + stages = 'fade', + timeout = 3000, + top_down = true, + render = 'compact', + background_colour = '#000000', + }, + }, + { + 'folke/noice.nvim', + event = 'UIEnter', + dependencies = { + { 'MunifTanjim/nui.nvim', lazy = true }, + 'rcarriga/nvim-notify', + }, + opts = { + cmdline = { + view = 'cmdline', + format = { + cmdline = { icon = '▍' }, + substitute = { + pattern = '^:%%?s/', + icon = ' ', + ft = 'regex', + opts = { border = { text = { top = ' sub (old/new/) ' } } }, + }, + input = { view = 'cmdline_input', icon = '█' }, + }, + }, + routes = { + { + view = 'notify', + filter = { event = 'msg_showmode' }, + }, + { + filter = { + event = 'msg_show', + kind = '', + find = 'written', + }, + opts = { skip = true }, + }, + }, + lsp = { + progress = { + enabled = false, + -- Lsp Progress is formatted using the builtins for lsp_progress. See config.format.builtin + -- See the section on formatting for more details on how to customize. + format = 'lsp_progress', + format_done = 'lsp_progress_done', + throttle = 1000 / 30, -- frequency to update lsp progress message + view = 'mini', + }, + override = { + -- override the default lsp markdown formatter with Noice + ['vim.lsp.util.convert_input_to_markdown_lines'] = true, + -- override the lsp markdown formatter with Noice + ['vim.lsp.util.stylize_markdown'] = true, + -- override cmp documentation with Noice (needs the other options to work) + ['cmp.entry.get_documentation'] = true, + }, + hover = { + enabled = true, + silent = false, -- set to true to not show a message if hover is not available + view = nil, -- when nil, use defaults from documentation + opts = {}, -- merged with defaults from documentation + }, + signature = { + enabled = false, + auto_open = { + enabled = true, + trigger = true, -- Automatically show signature help when typing a trigger character from the LSP + luasnip = true, -- Will open signature help when jumping to Luasnip insert nodes + throttle = 50, -- Debounce lsp signature help request by 50ms + }, + view = nil, -- when nil, use defaults from documentation + opts = {}, -- merged with defaults from documentation + }, + message = { + -- Messages shown by lsp servers + enabled = true, + view = 'notify', + opts = {}, + }, + -- defaults for hover and signature help + documentation = { + view = 'hover', + opts = { + lang = 'markdown', + replace = true, + render = 'plain', + format = { '{message}' }, + win_options = { concealcursor = 'n', conceallevel = 3 }, + }, + }, + }, + presets = { + bottom_search = true, -- use a classic bottom cmdline for search + command_palette = false, -- position the cmdline and popupmenu together + long_message_to_split = true, -- long messages will be sent to a split + inc_rename = false, -- enables an input dialog for inc-rename.nvim + lsp_doc_border = true, -- add a border to hover docs and signature help + }, + }, + }, + { + 'stevearc/dressing.nvim', + event = 'VeryLazy', + }, + { + 'akinsho/bufferline.nvim', + event = 'UIEnter', + version = '*', + config = function() + require('bufferline').setup({ + options = { + close_command = function() + require('bufdelete').bufdelete(0, true) + end, + right_mouse_command = function() + require('bufdelete').bugdelete(0, false) + end, + diagnostics = 'nvim_lsp', + always_show_bufferline = true, + buffer_close_icon = '', + modified_icon = '', + close_icon = '', + left_trunc_marker = '', + right_trunc_marker = '', + offsets = { + { + filetype = 'neo-tree', + text = 'Neo-tree', + highlight = 'Directory', + text_align = 'left', + }, + }, + }, + }) + end, + }, + { + 'nvim-lualine/lualine.nvim', + event = { 'BufReadPost', 'BufNewFile' }, + config = function() + require('configs.lualine') + end, + }, + { + 'nvim-tree/nvim-web-devicons', + config = true, + }, + { + 'lukas-reineke/indent-blankline.nvim', + main = 'ibl', + event = { 'BufReadPost', 'BufNewFile' }, + opts = { + exclude = { + filetypes = { 'help', 'alpha', 'dashboard', 'neo-tree', 'Trouble', 'lazy' }, + }, + }, + }, + + { + 'utilyre/barbecue.nvim', + name = 'barbecue', + version = '*', + event = { 'BufReadPost', 'BufAdd', 'BufNewFile' }, + dependencies = { + 'SmiteshP/nvim-navic', + }, + opts = {}, + keys = { + { + 'bq', + function() + require('barbecue.ui').toggle() + end, + desc = 'toggle barbecue', + }, + }, + config = function() + require('barbecue').setup({ + create_autocmd = false, -- prevent barbecue from updating itself automatically + }) + + vim.api.nvim_create_autocmd({ + 'WinScrolled', -- or WinResized on NVIM-v0.9 and higher + 'BufWinEnter', + 'CursorHold', + 'InsertLeave', + }, { + group = vim.api.nvim_create_augroup('barbecue.updater', {}), + callback = function() + require('barbecue.ui').update() + end, + }) + end, + }, + { + 'goolord/alpha-nvim', + event = 'VimEnter', + config = function() + require('configs.alpha') + end, + }, +} diff --git a/lua/plugins/whichkey.lua b/lua/plugins/whichkey.lua new file mode 100644 index 0000000..5642189 --- /dev/null +++ b/lua/plugins/whichkey.lua @@ -0,0 +1,166 @@ +return { + 'folke/which-key.nvim', + event = 'UIEnter', + opts = { + preset = 'helix', + icons = { + breadcrumb = ' ', + separator = ' ', + group = '', + rules = false, + }, + triggers = { + { '', mode = 'nixsotc' }, + { '', mode = { 'n', 'v' } }, + }, + spec = { + mode = { 'n', 'v' }, + { '[', group = ' Previous' }, + { ']', group = ' Next' }, + { 'b', group = ' Debug' }, + { 'c', group = ' Code' }, + { 'C', group = ' Comment' }, + { 'd', group = ' Database' }, + { 'e', group = ' Edit' }, + { 'f', group = ' Find' }, + { 'i', group = ' Insert' }, + { 'j', group = ' Jump' }, + { 'k', group = ' Keys' }, + { 'l', group = ' LSP' }, + { 'm', group = '󰠠 Misc' }, + { 'n', group = ' Notes' }, + { 'q', group = ' Quit' }, + { 's', group = ' Split' }, + { 't', group = ' Terminal' }, + { 'u', group = ' Test' }, + { 'v', group = ' Select' }, + { 'w', group = ' Writing' }, + { 'x', group = '󰁨 Diagnostics/Quickfix' }, + { 'y', group = ' Yank' }, + }, + }, + keys = { + { + '?', + function() + require('which-key').show({ global = false }) + end, + desc = ' Buffer Local Keymaps (which-key)', + }, + -- other keymaps + { 'cR', 'ReloadConfig', desc = 'Reload Configs' }, + { 'cd', 'RootDir', desc = 'Root Directory' }, + { 'cl', ':g/^\\s*$/d', desc = 'Clean Empty Lines' }, + { 'co', 'Alpha', desc = 'Alpha' }, + { 'cr', 'Telescope reloader', desc = 'Reload Module' }, + --edit + { 'ea', 'b#', desc = 'Alternate File' }, + { 'ec', 'e $MYVIMRC', desc = 'Config' }, + { + 'ed', + 'lua require("telescope.builtin").find_files({cwd = vim.fn.stdpath("config")})', + desc = 'Config Dir', + }, + { 'ee', 'NvimTreeToggle', desc = 'Explorer' }, + { 'em', 'e README.md', desc = 'Readme' }, + { 'en', 'enew', desc = 'New File' }, + -- split + { 's+', 'resize +10', desc = 'Increase window height' }, + { 's-', 'vertical resize -20', desc = 'Decrease window width' }, + { 's/', 's', desc = 'Split Below' }, + { 's=', 'vertical resize +20', desc = 'Increase window width' }, + { 'sH', 'vertical resize -10', desc = 'Decrease window width' }, + { 'sJ', 'resize -5', desc = 'Decrease window height' }, + { 'sK', 'resize +5', desc = 'Increase window height' }, + { 'sL', 'vertical resize +10', desc = 'Increase window width' }, + { 's\\', 'v', desc = 'Split Right' }, + { 's_', 'resize -10', desc = 'Decrease window height' }, + { 's`', 'p', desc = 'Previous Window' }, + { 'sa', 'split', desc = 'Horizontal Split' }, + { 'sc', 'tabclose', desc = 'Close Tab' }, + { 'sf', 'tabfirst', desc = 'First Tab' }, + { 'sh', 'h', desc = 'Move Left' }, + { 'sj', 'j', desc = 'Move Down' }, + { 'sk', 'k', desc = 'Move Up' }, + { 'sl', 'l', desc = 'Move Right' }, + { 'sp', 'NavigatorPrevious', desc = 'Previous Pane' }, + { 'sq', 'c', desc = 'Close Split' }, + { 'ss', 'vsplit', desc = 'Vertical Split' }, + -- select + { 'vB', 'vab', desc = 'Around Bracket' }, + { 'vP', 'vap', desc = 'Around Para' }, + { 'vQ', 'vaq', desc = 'Around Quote' }, + { 'vb', 'vib', desc = 'Bracket' }, + { 'vp', 'vip', desc = 'Paragraph' }, + { 'vq', 'viq', desc = 'Quote' }, + -- writing + { 'wc', 'set spell!', desc = 'Spellcheck' }, + { 'wf', "lua require'utils'.sudo_write()", desc = 'Force Write' }, + { 'wj', ']s', desc = 'Next Misspell' }, + { 'wk', '[s', desc = 'Prev Misspell' }, + { 'wq', 'wq', desc = 'Write and Quit' }, + { 'ws', 'Telescope spell_suggest', desc = 'Suggestions' }, + { 'ww', 'w', desc = 'Write and Quit' }, + { 'x', 'x', desc = ' Save and Quit' }, + --quit + { 'qa', 'qall', desc = 'Quit All' }, + { 'qc', 'bw', desc = 'Close Buffer' }, + { 'qd', 'bdelete', desc = 'Delete Buffer' }, + { 'qf', 'qall!', desc = 'Force Quit' }, + { 'qo', ':%bdelete|b#|bdelete#', desc = 'Close Others' }, + { 'qq', 'q', desc = 'Quit' }, + { 'qs', 'c', desc = 'Close Split' }, + { 'qw', 'wq', desc = 'Write and Quit' }, + -- insert + { 'iP', 'put %:p', desc = 'Absolute Path' }, + { 'id', "put =strftime('## %a, %d %b, %Y, %r')", desc = 'Date' }, + { 'ie', 'Telescope symbols', desc = 'Emojis' }, + { 'if', "put =expand('%:t')", desc = 'File Name' }, + { 'in', 'Nerdy', desc = 'Nerd Glyphs' }, + { 'ip', 'put %', desc = 'Relative Path' }, + { 'ir', 'Telescope registers', desc = 'Registers' }, + { 'it', "put =strftime('## %r')", desc = 'Time' }, + + -- Visiual Mode + { 'cS', ':sort!', mode = 'v', desc = 'Sort Desc' }, + { 'ci', ':sort i', mode = 'v', desc = 'Sort Case Insensitive' }, + { 'cs', ':sort', mode = 'v', desc = 'Sort Asc' }, + { 'cu', ':!uniq', mode = 'v', desc = 'Unique' }, + + { 'la', mode = 'v', desc = 'Lspsaga range_code_action' }, + + -- no leader + { '[B', 'bfirst', desc = 'First Buffer' }, + { '[b', 'bprevious', desc = 'Buffer' }, + { '[d', 'Lspsaga diagnostic_jump_prev', desc = 'Diagnostic' }, + { '[e', 'g;', desc = 'Edit' }, + { '[j', '', desc = 'Jump' }, + + { ']', group = ' Next' }, + { ']B', 'blast', desc = 'Buffer' }, + { ']b', 'bnext', desc = 'Buffer' }, + { ']d', 'Lspsaga diagnostic_jump_next', desc = 'Diagnostic' }, + { ']e', 'g,', desc = 'Edit' }, + { ']j', '', desc = 'Jump' }, + + { '', 'resize -10', desc = 'Decrease window height' }, + { '', 'vertical resize -10', desc = 'Decrease window width' }, + { '', 'vertical resize +10', desc = 'Increase window width' }, + { '', 'resize +10', desc = 'Increase window height' }, + { '', 'Telescope find_files', desc = 'Find Files' }, + { '', 'Telescope file_browser', desc = 'Find browser' }, + + { '', 'h', desc = 'Move Left' }, + { '', 'j', desc = 'Move Down' }, + { '', 'k', desc = 'Move Up' }, + { '', 'l', desc = 'Move Right' }, + { '', 'p', desc = 'Previous Pane' }, + + { '', 'bprevious', desc = 'Previous Buffer' }, + { '', 'bnext', desc = 'Next Buffer' }, + + { 'K', 'Lspsaga hover_doc', desc = 'LSP Hover' }, + { 'Q', 'qall!', desc = 'Force Quit!' }, + { 'U', 'redo', desc = 'Redo' }, + }, +}