├── .gitignore ├── .markdownlint-cli2.yaml ├── .neoconf.json ├── LICENSE ├── README.md ├── init.lua ├── lazy-lock.json ├── lazyvim.json ├── lua ├── config │ ├── autocmds.lua │ ├── keymaps.lua │ ├── lazy.lua │ ├── options.lua │ └── utils.lua └── plugins │ ├── avante.lua │ ├── blame.lua │ ├── blink.lua │ ├── bufferline.lua │ ├── conform.lua │ ├── copilot-chat.lua │ ├── copilot.lua │ ├── diffview.lua │ ├── go.lua │ ├── lint-markdown.lua │ ├── lint-sql.lua │ ├── lspconfig-go.lua │ ├── lspconfig-keymaps.lua │ ├── lualine-copilot.lua │ ├── lualine-wordcount.lua │ ├── mason-ruff.lua │ ├── mason-sql.lua │ ├── obsidian.lua │ ├── orphans.lua │ ├── project.lua │ ├── snacks.lua │ ├── text-case.lua │ ├── tokyonight.lua │ ├── treesitter.lua │ ├── wakatime.lua │ ├── which-key.lua │ └── yazi.lua └── stylua.toml /.gitignore: -------------------------------------------------------------------------------- 1 | tt.* 2 | .tests 3 | doc/tags 4 | debug 5 | .repro 6 | foo.* 7 | *.log 8 | data 9 | -------------------------------------------------------------------------------- /.markdownlint-cli2.yaml: -------------------------------------------------------------------------------- 1 | config: 2 | # MD013: Line length 3 | MD013: false 4 | # MD024: Multiple headings with the same content 5 | MD024: false 6 | # MD041: First line in file should be a top-level heading 7 | MD041: false 8 | # MD034: Bare URL used 9 | MD034: false 10 | -------------------------------------------------------------------------------- /.neoconf.json: -------------------------------------------------------------------------------- 1 | { 2 | "neodev": { 3 | "library": { 4 | "enabled": true, 5 | "plugins": true 6 | } 7 | }, 8 | "neoconf": { 9 | "plugins": { 10 | "lua_ls": { 11 | "enabled": true 12 | } 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nvim-config 🚀 2 | 3 | My Neovim configuration based on [LazyVim](https://github.com/LazyVim/LazyVim) with additional plugins and customizations for enhanced productivity. 4 | 5 | ![dashboard](https://github.com/user-attachments/assets/12d0997a-9869-4825-8b4c-7e399b1d4728) 6 | 7 | ![which-key](https://github.com/user-attachments/assets/506ccb08-70c1-442e-bed5-a2bd7eeca19f) 8 | 9 | ![ai](https://github.com/user-attachments/assets/b35889ee-685f-40d5-8fc7-edab76df48c5) 10 | 11 | ![grep](https://github.com/user-attachments/assets/01e22664-290a-4f6b-a369-365244d15b3e) 12 | 13 | ## 📦 Install 14 | 15 | ```sh 16 | git clone https://github.com/joelazar/nvim-config.git ~/.config/nvim 17 | nvim 18 | ``` 19 | 20 | At first run, Neovim will install all necessary plugins, LSPs, formatters, and DAP adapters. 21 | 22 | And you are done! 🎉 23 | 24 | ## ✨ Features 25 | 26 | ### 🧠 AI Integration 27 | 28 | - **Copilot Integration** [`lua/plugins/copilot.lua`](./lua/plugins/copilot.lua) - GitHub Copilot for code suggestions with custom key bindings (`aT` to toggle) 29 | - **CopilotChat.nvim** [`lua/plugins/copilot-chat.lua`](./lua/plugins/copilot-chat.lua) - Interactive chat interface with Copilot using Claude model (`ac` prefix) 30 | - **Avante.nvim** [`lua/plugins/avante.lua`](./lua/plugins/avante.lua) - AI assistant for Neovim with multiple LLM providers and chat interface 31 | 32 | ### 📝 Note Taking & Knowledge Management 33 | 34 | - **Obsidian.nvim** [`lua/plugins/obsidian.lua`](./lua/plugins/obsidian.lua) - First-class support for [Obsidian](https://obsidian.md/) vaults (`z` prefix) 35 | 36 | ### 📂 File Management 37 | 38 | - **Yazi.nvim** [`lua/plugins/yazi.lua`](./lua/plugins/yazi.lua) - Terminal file browser integration (`y` to toggle) 39 | - **Orphans.nvim** [`lua/plugins/orphans.lua`](./lua/plugins/orphans.lua) - Find orphaned plugins in your configuration 40 | - **Project.nvim** [`lua/plugins/project.lua`](./lua/plugins/project.lua) - Smart project detection for multiple workspaces 41 | 42 | ### 🧰 Development Tools 43 | 44 | - **Go.nvim** [`lua/plugins/go.lua`](./lua/plugins/go.lua) - Enhanced Go development experience 45 | - **SQL Tools** [`lua/plugins/conform.lua`](./lua/plugins/conform.lua) & [`lua/plugins/lint-sql.lua`](./lua/plugins/lint-sql.lua) - SQL formatting and linting with sqlfluff 46 | - **Rust Tools** - Rustaceanvim for Rust development 47 | - **Git Enhancements**: 48 | - **Diffview** [`lua/plugins/diffview.lua`](./lua/plugins/diffview.lua) - Enhanced diff viewing 49 | - **Git blame** [`lua/plugins/blame.lua`](./lua/plugins/blame.lua) - Inline git blame information 50 | - **Text-case.nvim** [`lua/plugins/text-case.lua`](./lua/plugins/text-case.lua) - Case conversion utilities 51 | - **Blink.cmp** [`lua/plugins/blink.lua`](./lua/plugins/blink.lua) - Enhanced auto-completion with multiple sources 52 | - **Snacks.nvim** [`lua/plugins/snacks.lua`](./lua/plugins/snacks.lua) - Clean dashboard, file picker, and workspace management 53 | 54 | ### 🎨 UI Enhancements 55 | 56 | - **Tokyo Night** [`lua/plugins/tokyonight.lua`](./lua/plugins/tokyonight.lua) - Modern dark theme with customizations 57 | - **Bufferline** [`lua/plugins/bufferline.lua`](./lua/plugins/bufferline.lua) - Stylish buffer management with custom keymaps 58 | - **Lualine Customizations**: 59 | - **Copilot Status** [`lua/plugins/lualine-copilot.lua`](./lua/plugins/lualine-copilot.lua) - Shows Copilot status in statusline 60 | - **Word Count** [`lua/plugins/lualine-wordcount.lua`](./lua/plugins/lualine-wordcount.lua) - Displays word count in text files 61 | 62 | ## ⚙️ Custom Configuration 63 | 64 | ### Core Files 65 | 66 | - **Main Neovim options** [`lua/config/options.lua`](./lua/config/options.lua) - Sets up Neovim behavior 67 | - **Key mappings** [`lua/config/keymaps.lua`](./lua/config/keymaps.lua) - Custom keyboard shortcuts 68 | - **Auto commands** [`lua/config/autocmds.lua`](./lua/config/autocmds.lua) - Custom automated behaviors 69 | - **Lazy plugin manager** [`lua/config/lazy.lua`](./lua/config/lazy.lua) - Plugin setup and management 70 | - **Utility functions** [`lua/config/utils.lua`](./lua/config/utils.lua) - Helper functions including sudo write 71 | 72 | ### Key Customizations 73 | 74 | This config modifies several LazyVim defaults (see [`lua/config/keymaps.lua`](./lua/config/keymaps.lua)): 75 | 76 | - `Q` - Close window instead of entering Ex mode 77 | - `gy`, `gp` - System clipboard operations 78 | - `` - Save file 79 | - ``, `` - Better page navigation with centering 80 | - Smart `dd` that preserves your last yank when deleting empty lines 81 | - `+j` - Toggle terminal in current directory 82 | 83 | ### Additional Features 84 | 85 | - **Sudo Integration** [`lua/config/utils.lua`](./lua/config/utils.lua) - Write with sudo privileges (`W`) 86 | - **Wrapped Lines** [`lua/config/keymaps.lua`](./lua/config/keymaps.lua) - Comfortable navigation in wrapped text files 87 | - **Custom Spell Checking** [`lua/config/autocmds.lua`](./lua/config/autocmds.lua) - Targeted spell checking for specific file types 88 | - **Absolute Line Numbers** [`lua/config/options.lua`](./lua/config/options.lua) - Uses absolute instead of relative line numbers 89 | - **Clipboard Handling** [`lua/config/options.lua`](./lua/config/options.lua) - Doesn't use system clipboard by default for better control 90 | 91 | ## 📋 [LazyVim Extras](https://www.lazyvim.org/extras) 92 | 93 | This configuration includes numerous LazyVim extras (see [`lazyvim.json`](./lazyvim.json)): 94 | 95 | - **AI**: copilot, copilot-chat 96 | - **Coding**: mini-surround, yanky 97 | - **DAP**: core, nlua 98 | - **Editor**: dial, inc-rename, overseer, snacks_explorer, snacks_picker 99 | - **Formatting**: black, prettier 100 | - **Languages**: ansible, docker, git, go, json, markdown, python, rust, tailwind, terraform, toml, typescript, yaml, zig 101 | - **Linting**: eslint 102 | - **Testing**: core 103 | - **Utilities**: chezmoi, dot, mini-hipatterns, octo, project, rest, vscode 104 | 105 | ## 🔧 File Structure 106 | 107 | - `init.lua` - Entry point that loads the configuration 108 | - `lua/config/` - Core configuration files 109 | - `lua/plugins/` - Custom plugin configurations 110 | - `stylua.toml` - Formatting rules for Lua files 111 | 112 | ## 🎨 Theme 113 | 114 | Using [Tokyo Night](https://github.com/folke/tokyonight.nvim) with the "night" style for a clean, modern look. See [`lua/plugins/tokyonight.lua`](./lua/plugins/tokyonight.lua) for configuration. 115 | -------------------------------------------------------------------------------- /init.lua: -------------------------------------------------------------------------------- 1 | require("config.lazy") 2 | -------------------------------------------------------------------------------- /lazy-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "CopilotChat.nvim": { "branch": "main", "commit": "16d897fd43d07e3b54478ccdb2f8a16e4df4f45a" }, 3 | "LazyVim": { "branch": "main", "commit": "25abbf546d564dc484cf903804661ba12de45507" }, 4 | "SchemaStore.nvim": { "branch": "main", "commit": "6c52c57432280c54596feb0c0958e1a6cb546f4d" }, 5 | "avante.nvim": { "branch": "main", "commit": "bc403ddcbf98c4181ee2a7efd35cd1e18a2fdc5c" }, 6 | "blame.nvim": { "branch": "main", "commit": "b87b8c820e4cec06fbbd2f946b7b35c45906ee0c" }, 7 | "blink-cmp-avante": { "branch": "master", "commit": "ddefb8de3cb1286ab39e0ccec0f32a45d03391f2" }, 8 | "blink-cmp-copilot": { "branch": "main", "commit": "439cff78780c033aa23cf061d7315314b347e3c1" }, 9 | "blink-cmp-dictionary": { "branch": "master", "commit": "43e0fbe8d273f92a87c58aa958c51c95557d20c4" }, 10 | "blink-cmp-git": { "branch": "master", "commit": "e78e9ff3de63f82685e3c5f2eed1ec203222f63b" }, 11 | "blink.cmp": { "branch": "main", "commit": "022521a8910a5543b0251b21c9e1a1e989745796" }, 12 | "blink.compat": { "branch": "main", "commit": "2ed6d9a28b07fa6f3bface818470605f8896408c" }, 13 | "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, 14 | "catppuccin": { "branch": "main", "commit": "62dbc841f48046dfe1be74179e92f53e1c33952c" }, 15 | "chezmoi.nvim": { "branch": "main", "commit": "e0b3ebafd910b63acdfbf6677b44b03eb3d09f19" }, 16 | "chezmoi.vim": { "branch": "main", "commit": "abf37336437867cbd99ce2f8849b717415391cc3" }, 17 | "cmp-calc": { "branch": "main", "commit": "5947b412da67306c5b68698a02a846760059be2e" }, 18 | "conform.nvim": { "branch": "master", "commit": "6feb2f28f9a9385e401857b21eeac3c1b66dd628" }, 19 | "copilot.lua": { "branch": "master", "commit": "5f726c8e6bbcd7461ee0b870d4e6c8a973b55b64" }, 20 | "crates.nvim": { "branch": "main", "commit": "5d8b1bef686db0fabe5f1bb593744b617e8f1405" }, 21 | "dial.nvim": { "branch": "master", "commit": "2c7e2750372918f072a20f3cf754d845e143d7c9" }, 22 | "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, 23 | "dressing.nvim": { "branch": "master", "commit": "2d7c2db2507fa3c4956142ee607431ddb2828639" }, 24 | "flash.nvim": { "branch": "main", "commit": "3c942666f115e2811e959eabbdd361a025db8b63" }, 25 | "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, 26 | "gitsigns.nvim": { "branch": "main", "commit": "8bdaccdb897945a3c99c1ad8df94db0ddf5c8790" }, 27 | "go.nvim": { "branch": "master", "commit": "a3455f48cff718a86275115523dcc735535a13aa" }, 28 | "grug-far.nvim": { "branch": "main", "commit": "6fd719634c529bfbfe031a03b7af9d728d849dc7" }, 29 | "guihua.lua": { "branch": "master", "commit": "87bea7b98429405caf2a0ce4d029b027bb017c70" }, 30 | "img-clip.nvim": { "branch": "main", "commit": "08a02e14c8c0d42fa7a92c30a98fd04d6993b35d" }, 31 | "inc-rename.nvim": { "branch": "main", "commit": "2eaff20526ff6101337b84f4b0d238c11f47d7f4" }, 32 | "kulala.nvim": { "branch": "main", "commit": "aa462decb4aa2f0cb9783fba4ad8f401b042c3be" }, 33 | "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, 34 | "lazydev.nvim": { "branch": "main", "commit": "2367a6c0a01eb9edb0464731cc0fb61ed9ab9d2c" }, 35 | "lualine.nvim": { "branch": "master", "commit": "0c6cca9f2c63dadeb9225c45bc92bb95a151d4af" }, 36 | "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, 37 | "mason-lspconfig.nvim": { "branch": "main", "commit": "1a31f824b9cd5bc6f342fc29e9a53b60d74af245" }, 38 | "mason-nvim-dap.nvim": { "branch": "main", "commit": "4c2cdc69d69fe00c15ae8648f7e954d99e5de3ea" }, 39 | "mason.nvim": { "branch": "main", "commit": "fc98833b6da5de5a9c5b1446ac541577059555be" }, 40 | "mini.ai": { "branch": "main", "commit": "4b5348fac5912f1957f4c012c2e0ab0c4b865386" }, 41 | "mini.hipatterns": { "branch": "main", "commit": "e5083df391171dc9d8172645606f8496d9443374" }, 42 | "mini.icons": { "branch": "main", "commit": "397ed3807e96b59709ef3292f0a3e253d5c1dc0a" }, 43 | "mini.pairs": { "branch": "main", "commit": "69864a2efb36c030877421634487fd90db1e4298" }, 44 | "mini.surround": { "branch": "main", "commit": "f4307f935ad87cfe3e570dbaae485b35cce4e5ec" }, 45 | "neotest": { "branch": "master", "commit": "ef492755730e59e1d8122c461abbd086bee4c76b" }, 46 | "neotest-golang": { "branch": "main", "commit": "5718217f750704210a6b62f6b294e272f2bf5516" }, 47 | "neotest-python": { "branch": "master", "commit": "34c9f6f3dc53fc462ea658b5071238037f95f7aa" }, 48 | "neotest-zig": { "branch": "main", "commit": "de63f3b9a182d374d2e71cf44385326682ec90e7" }, 49 | "noice.nvim": { "branch": "main", "commit": "0427460c2d7f673ad60eb02b35f5e9926cf67c59" }, 50 | "nui.nvim": { "branch": "main", "commit": "7cd18e73cfbd70e1546931b7268b3eebaeff9391" }, 51 | "nvim-ansible": { "branch": "main", "commit": "bba61168b7aef735e7f950fdfece5ef6c388eacf" }, 52 | "nvim-dap": { "branch": "master", "commit": "b0f983507e3702f073bfe1516846e58b56d4e42f" }, 53 | "nvim-dap-go": { "branch": "main", "commit": "8763ced35b19c8dc526e04a70ab07c34e11ad064" }, 54 | "nvim-dap-python": { "branch": "master", "commit": "261ce649d05bc455a29f9636dc03f8cdaa7e0e2c" }, 55 | "nvim-dap-ui": { "branch": "master", "commit": "73a26abf4941aa27da59820fd6b028ebcdbcf932" }, 56 | "nvim-dap-virtual-text": { "branch": "master", "commit": "fbdb48c2ed45f4a8293d0d483f7730d24467ccb6" }, 57 | "nvim-lint": { "branch": "master", "commit": "b47cbb249351873e3a571751c3fb66ed6369852f" }, 58 | "nvim-lspconfig": { "branch": "master", "commit": "03bc581e05e81d33808b42b2d7e76d70adb3b595" }, 59 | "nvim-nio": { "branch": "master", "commit": "21f5324bfac14e22ba26553caf69ec76ae8a7662" }, 60 | "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, 61 | "nvim-treesitter-textobjects": { "branch": "master", "commit": "0f051e9813a36481f48ca1f833897210dbcfffde" }, 62 | "nvim-ts-autotag": { "branch": "main", "commit": "a1d526af391f6aebb25a8795cbc05351ed3620b5" }, 63 | "obsidian.nvim": { "branch": "main", "commit": "e01166d1827661c5298ed2f4a49c6833adb4fa70" }, 64 | "octo.nvim": { "branch": "master", "commit": "53a424b7432d97f3ef0b5cf7a08972d7c9974f5a" }, 65 | "one-small-step-for-vimkind": { "branch": "main", "commit": "2eff53bed71e7e0737d1bd7c22de79d99ae0dad7" }, 66 | "orphans.nvim": { "branch": "main", "commit": "35f995fbb04b679b7d829072d7209a2117c15adf" }, 67 | "overseer.nvim": { "branch": "master", "commit": "72c68aab0358c92f451168b704c411c4a3e3410e" }, 68 | "persistence.nvim": { "branch": "main", "commit": "166a79a55bfa7a4db3e26fc031b4d92af71d0b51" }, 69 | "plenary.nvim": { "branch": "master", "commit": "857c5ac632080dba10aae49dba902ce3abf91b35" }, 70 | "project.nvim": { "branch": "main", "commit": "8c6bad7d22eef1b71144b401c9f74ed01526a4fb" }, 71 | "render-markdown.nvim": { "branch": "main", "commit": "d69f0d8c80ba293d25dad498ec86e9b583a6bbbf" }, 72 | "rustaceanvim": { "branch": "master", "commit": "eaa8d3dc22026da53fbb1b63f504541c70de44f4" }, 73 | "snacks.nvim": { "branch": "main", "commit": "bc0630e43be5699bb94dadc302c0d21615421d93" }, 74 | "text-case.nvim": { "branch": "main", "commit": "e898cfd46fa6cde0e83abb624a16e67d2ffc6457" }, 75 | "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" }, 76 | "tokyonight.nvim": { "branch": "main", "commit": "057ef5d260c1931f1dffd0f052c685dcd14100a3" }, 77 | "trouble.nvim": { "branch": "main", "commit": "85bedb7eb7fa331a2ccbecb9202d8abba64d37b3" }, 78 | "ts-comments.nvim": { "branch": "main", "commit": "1bd9d0ba1d8b336c3db50692ffd0955fe1bb9f0c" }, 79 | "vim-wakatime": { "branch": "master", "commit": "f39c4a201ae350aaba713b59d4a4fdd88e0811aa" }, 80 | "which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" }, 81 | "yanky.nvim": { "branch": "main", "commit": "04775cc6e10ef038c397c407bc17f00a2f52b378" }, 82 | "yazi.nvim": { "branch": "main", "commit": "59c22d1a8bcb3d00a7115ef7f2d59b90cf989ab3" } 83 | } 84 | -------------------------------------------------------------------------------- /lazyvim.json: -------------------------------------------------------------------------------- 1 | { 2 | "extras": [ 3 | "lazyvim.plugins.extras.ai.copilot", 4 | "lazyvim.plugins.extras.ai.copilot-chat", 5 | "lazyvim.plugins.extras.coding.mini-surround", 6 | "lazyvim.plugins.extras.coding.yanky", 7 | "lazyvim.plugins.extras.dap.core", 8 | "lazyvim.plugins.extras.dap.nlua", 9 | "lazyvim.plugins.extras.editor.dial", 10 | "lazyvim.plugins.extras.editor.inc-rename", 11 | "lazyvim.plugins.extras.editor.overseer", 12 | "lazyvim.plugins.extras.editor.snacks_explorer", 13 | "lazyvim.plugins.extras.editor.snacks_picker", 14 | "lazyvim.plugins.extras.formatting.black", 15 | "lazyvim.plugins.extras.formatting.prettier", 16 | "lazyvim.plugins.extras.lang.ansible", 17 | "lazyvim.plugins.extras.lang.docker", 18 | "lazyvim.plugins.extras.lang.git", 19 | "lazyvim.plugins.extras.lang.go", 20 | "lazyvim.plugins.extras.lang.json", 21 | "lazyvim.plugins.extras.lang.markdown", 22 | "lazyvim.plugins.extras.lang.python", 23 | "lazyvim.plugins.extras.lang.rust", 24 | "lazyvim.plugins.extras.lang.tailwind", 25 | "lazyvim.plugins.extras.lang.terraform", 26 | "lazyvim.plugins.extras.lang.toml", 27 | "lazyvim.plugins.extras.lang.typescript", 28 | "lazyvim.plugins.extras.lang.yaml", 29 | "lazyvim.plugins.extras.lang.zig", 30 | "lazyvim.plugins.extras.linting.eslint", 31 | "lazyvim.plugins.extras.test.core", 32 | "lazyvim.plugins.extras.util.chezmoi", 33 | "lazyvim.plugins.extras.util.dot", 34 | "lazyvim.plugins.extras.util.mini-hipatterns", 35 | "lazyvim.plugins.extras.util.octo", 36 | "lazyvim.plugins.extras.util.project", 37 | "lazyvim.plugins.extras.util.rest", 38 | "lazyvim.plugins.extras.vscode" 39 | ], 40 | "install_version": 7, 41 | "news": { 42 | "NEWS.md": "10960" 43 | }, 44 | "version": 8 45 | } -------------------------------------------------------------------------------- /lua/config/autocmds.lua: -------------------------------------------------------------------------------- 1 | -- Autocmds are automatically loaded on the VeryLazy event 2 | -- Default autocmds that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/autocmds.lua 3 | -- Add any additional autocmds here 4 | 5 | vim.api.nvim_del_augroup_by_name("lazyvim_wrap_spell") 6 | 7 | local function augroup(name) 8 | return vim.api.nvim_create_augroup("lazyvim_custom_" .. name, { clear = true }) 9 | end 10 | 11 | -- wrap and check for spell in text filetypes 12 | vim.api.nvim_create_autocmd("FileType", { 13 | group = augroup("wrap"), 14 | pattern = { "text", "plaintex", "typst", "gitcommit", "markdown" }, 15 | callback = function() 16 | vim.opt_local.wrap = true 17 | end, 18 | }) 19 | 20 | vim.api.nvim_create_autocmd("FileType", { 21 | group = augroup("spell"), 22 | pattern = { "text", "plaintex", "typst", "gitcommit" }, 23 | callback = function() 24 | vim.opt_local.spell = true 25 | end, 26 | }) 27 | -------------------------------------------------------------------------------- /lua/config/keymaps.lua: -------------------------------------------------------------------------------- 1 | -- Keymaps are automatically loaded on the VeryLazy event 2 | -- Default keymaps that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/keymaps.lua 3 | -- Add any additional keymaps here 4 | 5 | ----------------------------------------------------------- 6 | -- Key Mapping Configuration 7 | ----------------------------------------------------------- 8 | 9 | -- Shorthand for mapping keys 10 | local map = vim.keymap.set 11 | 12 | -- Window Management 13 | -- Q: Close current window (replaces default 'Q' which enters Ex mode) 14 | map("n", "Q", "close", { silent = true }) 15 | 16 | -- System Clipboard Integration 17 | -- gy: Copy to system clipboard (normal and visual modes) 18 | map({ "n", "x" }, "gy", '"+y', { desc = "Copy to system clipboard" }) 19 | -- gp: Paste from system clipboard (normal mode) 20 | map("n", "gp", '"+p', { desc = "Paste from system clipboard" }) 21 | -- gp: Paste in Visual mode without copying selected text (see :h v_P) 22 | map("x", "gp", '"+P', { desc = "Paste from system clipboard" }) 23 | 24 | -- Better Navigation for Wrapped Lines 25 | -- These mappings make j/k move by visible lines rather than file lines 26 | -- Only applies when not using a count (e.g. 5j still moves 5 actual lines) 27 | -- Not mapped in operator-pending mode to preserve behavior of operations like 'dj' 28 | map({ "n", "x" }, "j", [[v:count == 0 ? 'gj' : 'j']], { expr = true }) 29 | map({ "n", "x" }, "k", [[v:count == 0 ? 'gk' : 'k']], { expr = true }) 30 | 31 | -- Reselect latest changed, put, or yanked text 32 | map( 33 | "n", 34 | "gV", 35 | '"`[" . strpart(getregtype(), 0, 1) . "`]"', 36 | { expr = true, replace_keycodes = false, desc = "Visually select changed text" } 37 | ) 38 | 39 | -- Search inside visually highlighted text. Use `silent = false` for it to 40 | -- make effect immediately. 41 | map("x", "g/", "/\\%V", { silent = false, desc = "Search inside visual selection" }) 42 | 43 | -- Alternative way to save and exit in Normal mode. 44 | -- NOTE: Adding `redraw` helps with `cmdheight=0` if buffer is not modified 45 | map("n", "", "silent! update | redraw", { desc = "Save" }) 46 | map({ "i", "x" }, "", "silent! update | redraw", { desc = "Save and go to Normal mode" }) 47 | 48 | -- Better page up/down 49 | map("n", "", "zz") 50 | map("n", "", "zz") 51 | 52 | -- Add undo break-points 53 | map("i", ",", ",u") 54 | map("i", ".", ".u") 55 | map("i", ";", ";u") 56 | 57 | -- smart deletion, dd 58 | -- It solves the issue, where you want to delete empty line, but dd will override you last yank. 59 | -- Code above will check if u are deleting empty line, if so - use black hole register. 60 | -- [src: https://www.reddit.com/r/neovim/comments/w0jzzv/comment/igfjx5y/?utm_source=share&utm_medium=web2x&context=3] 61 | local function smart_dd() 62 | if vim.api.nvim_get_current_line():match("^%s*$") then 63 | return '"_dd' 64 | else 65 | return "dd" 66 | end 67 | end 68 | 69 | vim.keymap.set("n", "dd", smart_dd, { noremap = true, expr = true }) 70 | 71 | -- Configure toggle terminal for CMD+J 72 | map("n", "", function() 73 | Snacks.terminal(nil, { cwd = LazyVim.root() }) 74 | end, { desc = "Terminal (Root Dir)" }) 75 | map("t", "", "close", { desc = "Hide Terminal" }) 76 | 77 | map("n", "cD", "%s/\\s\\+$//e", { desc = "Delete trailing spaces" }) 78 | -------------------------------------------------------------------------------- /lua/config/lazy.lua: -------------------------------------------------------------------------------- 1 | local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 2 | if not (vim.uv or vim.loop).fs_stat(lazypath) then 3 | local lazyrepo = "https://github.com/folke/lazy.nvim.git" 4 | local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) 5 | if vim.v.shell_error ~= 0 then 6 | vim.api.nvim_echo({ 7 | { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, 8 | { out, "WarningMsg" }, 9 | { "\nPress any key to exit..." }, 10 | }, true, {}) 11 | vim.fn.getchar() 12 | os.exit(1) 13 | end 14 | end 15 | vim.opt.rtp:prepend(lazypath) 16 | 17 | require("lazy").setup({ 18 | spec = { 19 | -- add LazyVim and import its plugins 20 | { "LazyVim/LazyVim", import = "lazyvim.plugins" }, 21 | -- import/override with your plugins 22 | { import = "plugins" }, 23 | }, 24 | defaults = { 25 | lazy = false, 26 | version = false, 27 | }, 28 | install = { colorscheme = { "tokyonight", "habamax" } }, 29 | checker = { enabled = false }, -- automatically check for plugin updates 30 | performance = { 31 | rtp = { 32 | disabled_plugins = { 33 | "gzip", 34 | "tarPlugin", 35 | "tohtml", 36 | "tutor", 37 | "zipPlugin", 38 | }, 39 | }, 40 | }, 41 | }) 42 | -------------------------------------------------------------------------------- /lua/config/options.lua: -------------------------------------------------------------------------------- 1 | -- Options are automatically loaded before lazy.nvim startup 2 | -- Default options that are always set: https://github.com/LazyVim/LazyVim/blob/main/lua/lazyvim/config/options.lua 3 | -- Add any additional options here 4 | 5 | -- LSP Server to use for Python. 6 | vim.g.lazyvim_python_lsp = "basedpyright" 7 | vim.g.lazyvim_python_ruff = "ruff_lsp" 8 | 9 | -- Show absolute line number in front of each line 10 | vim.o.relativenumber = false 11 | 12 | -- Do not use system clipboard 13 | vim.o.clipboard = "" 14 | 15 | -- Snacks animations 16 | vim.g.snacks_animate = false 17 | -------------------------------------------------------------------------------- /lua/config/utils.lua: -------------------------------------------------------------------------------- 1 | -- Utility functions for elevated privileges operations 2 | local M = {} 3 | 4 | ---Execute a command with sudo privileges 5 | ---@param cmd string The command to execute 6 | ---@param print_output boolean Whether to print the command output 7 | ---@return boolean success Whether the command executed successfully 8 | M.sudo_exec = function(cmd, print_output) 9 | -- Prompt for sudo password securely 10 | local password = vim.fn.inputsecret("Password: ") 11 | -- Execute command with sudo, using -S to read password from stdin 12 | local out = vim.fn.system(string.format("/usr/bin/sudo -p '' -S %s", cmd), password) 13 | -- Check for execution errors 14 | if vim.v.shell_error ~= 0 then 15 | print("\r\n") 16 | print(out) 17 | return false 18 | end 19 | -- Optionally display command output 20 | if print_output then 21 | print("\r\n", out) 22 | end 23 | return true 24 | end 25 | 26 | ---Write the current buffer to a file with sudo privileges 27 | ---@param tmpfile? string Optional temporary file path 28 | ---@param filepath? string Optional target file path (defaults to current buffer's file) 29 | M.sudo_write = function(tmpfile, filepath) 30 | -- Use system temp file if none provided 31 | if not tmpfile then 32 | tmpfile = vim.fn.tempname() 33 | end 34 | -- Default to current buffer's file path 35 | if not filepath then 36 | filepath = vim.fn.expand("%") 37 | end 38 | -- Validate we have a target file path 39 | if not filepath or #filepath == 0 then 40 | print("E32: No file name") 41 | return 42 | end 43 | -- `bs=1048576` is equivalent to `bs=1M` for GNU dd or `bs=1m` for BSD dd 44 | -- Both `bs=1M` and `bs=1m` are non-POSIX 45 | -- Use dd command to copy with elevated privileges 46 | local cmd = string.format("dd if=%s of=%s bs=1048576", vim.fn.shellescape(tmpfile), vim.fn.shellescape(filepath)) 47 | -- Write current buffer to temporary file 48 | vim.api.nvim_exec(string.format("write! %s", tmpfile), true) 49 | -- Execute dd command with sudo and handle result 50 | if M.sudo_exec(cmd) then 51 | print(string.format('\r\n"%s" written', filepath)) 52 | vim.cmd("e!") -- Reload the buffer to reflect changes 53 | end 54 | -- Clean up temporary file 55 | vim.fn.delete(tmpfile) 56 | end 57 | 58 | return M 59 | -------------------------------------------------------------------------------- /lua/plugins/avante.lua: -------------------------------------------------------------------------------- 1 | -- Avante.nvim configuration 2 | -- A modern and feature-rich note-taking plugin for Neovim 3 | return { 4 | "yetone/avante.nvim", 5 | -- Load on startup since it's a core functionality 6 | event = "VeryLazy", 7 | lazy = false, 8 | -- Track main branch for latest features 9 | version = false, 10 | opts = { 11 | hints = { enabled = false }, 12 | file_selector = { 13 | provider = "snacks", 14 | provider_opts = {}, 15 | }, 16 | claude = { 17 | endpoint = "https://api.anthropic.com", 18 | model = "claude-3-7-sonnet-latest", 19 | temperature = 0, 20 | max_tokens = 4096, 21 | }, 22 | ollama = { 23 | model = "qwq:32b", 24 | }, 25 | gemini = { 26 | model = "gemini-2.0-flash", 27 | }, 28 | 29 | provider = "claude", 30 | -- provider = "gemini-pro", 31 | cursor_applying_provider = "groq", 32 | -- NOTE: only needed for weaker models 33 | -- behaviour = { 34 | -- enable_cursor_planning_mode = true, -- enable cursor planning mode! 35 | -- }, 36 | vendors = { 37 | groq = { 38 | __inherited_from = "openai", 39 | api_key_name = "GROQ_API_KEY", 40 | endpoint = "https://api.groq.com/openai/v1/", 41 | model = "llama-3.3-70b-versatile", 42 | max_completion_tokens = 32768, 43 | }, 44 | ["gemini-pro"] = { 45 | __inherited_from = "gemini", 46 | model = "gemini-2.5-pro-exp-03-25", 47 | }, 48 | }, 49 | }, 50 | -- Required build step 51 | build = "make", 52 | -- Required dependencies for full functionality 53 | dependencies = { 54 | "stevearc/dressing.nvim", -- Enhanced UI components 55 | "nvim-lua/plenary.nvim", -- Lua utility functions 56 | "MunifTanjim/nui.nvim", -- UI component library 57 | "echasnovski/mini.icons", -- File icons support 58 | "zbirenbaum/copilot.lua", -- AI completion integration 59 | { 60 | -- Image handling capabilities 61 | "HakonHarnes/img-clip.nvim", 62 | event = "VeryLazy", 63 | opts = { 64 | default = { 65 | -- Don't embed images as base64 in documents 66 | embed_image_as_base64 = false, 67 | -- Don't prompt for image filenames 68 | prompt_for_file_name = false, 69 | drag_and_drop = { 70 | -- Enable drag-and-drop in insert mode 71 | insert_mode = true, 72 | }, 73 | }, 74 | }, 75 | }, 76 | }, 77 | } 78 | -------------------------------------------------------------------------------- /lua/plugins/blame.lua: -------------------------------------------------------------------------------- 1 | -- Git blame integration 2 | -- Shows git blame information in the current buffer 3 | return { 4 | "FabijanZulj/blame.nvim", 5 | config = function() 6 | require("blame").setup() 7 | end, 8 | cmd = "BlameToggle", 9 | } -------------------------------------------------------------------------------- /lua/plugins/blink.lua: -------------------------------------------------------------------------------- 1 | -- Blink.cmp configuration 2 | -- Autocompletion plugin with multiple sources 3 | return { 4 | "saghen/blink.cmp", 5 | dependencies = { 6 | "hrsh7th/cmp-calc", 7 | "saghen/blink.compat", 8 | "Kaiser-Yang/blink-cmp-avante", 9 | { 10 | "Kaiser-Yang/blink-cmp-git", 11 | dependencies = { "nvim-lua/plenary.nvim" }, 12 | }, 13 | { 14 | "Kaiser-Yang/blink-cmp-dictionary", 15 | dependencies = { "nvim-lua/plenary.nvim" }, 16 | }, 17 | }, 18 | opts = { 19 | keymap = { 20 | [""] = { LazyVim.cmp.map({ "snippet_forward" }), "select_next", "fallback" }, 21 | [""] = { LazyVim.cmp.map({ "snippet_backward" }), "select_prev", "fallback" }, 22 | [""] = { "accept", "fallback" }, 23 | [""] = { "hide", "fallback" }, 24 | [""] = { "select_and_accept" }, 25 | }, 26 | completion = { list = { selection = { preselect = false, auto_insert = false } } }, 27 | sources = { 28 | default = { "avante", "git", "dictionary", "calc" }, 29 | compat = { "calc" }, 30 | providers = { 31 | calc = { 32 | kind = "calc", 33 | }, 34 | git = { 35 | module = "blink-cmp-git", 36 | name = "Git", 37 | opts = {}, 38 | }, 39 | avante = { 40 | module = "blink-cmp-avante", 41 | name = "Avante", 42 | opts = {}, 43 | }, 44 | dictionary = { 45 | module = "blink-cmp-dictionary", 46 | name = "Dict", 47 | min_keyword_length = 3, 48 | opts = {}, 49 | }, 50 | }, 51 | }, 52 | }, 53 | } -------------------------------------------------------------------------------- /lua/plugins/bufferline.lua: -------------------------------------------------------------------------------- 1 | -- Buffer line configuration 2 | -- Shows open buffers at the top of the screen 3 | return { 4 | "akinsho/bufferline.nvim", 5 | opts = { 6 | options = { 7 | always_show_bufferline = false, 8 | show_buffer_close_icons = false, 9 | show_close_icon = false, 10 | }, 11 | }, 12 | keys = { 13 | { "", "BufferLineCyclePrev", desc = "Move to previous buffer" }, 14 | { "", "BufferLineCycleNext", desc = "Move to next buffer" }, 15 | { "", "BufferLineMovePrev", desc = "Re-order to previous buffer" }, 16 | { "", "BufferLineMoveNext", desc = "Re-order to next buffer" }, 17 | { "", "BufferLineTogglePin", desc = "Toggle Pin" }, 18 | { "bP", false }, 19 | { "bw", "BufferLineCloseOthers", desc = "Delete All Buffers" }, 20 | { "bW", "BufferLineGroupClose ungrouped", desc = "Delete Non-Pinned Buffers" }, 21 | }, 22 | } -------------------------------------------------------------------------------- /lua/plugins/conform.lua: -------------------------------------------------------------------------------- 1 | -- Code formatting configuration 2 | -- Sets up formatters for SQL and Mojo languages 3 | return { 4 | "stevearc/conform.nvim", 5 | opts = { 6 | formatters_by_ft = { 7 | mojo = { "mojo" }, 8 | sql = { "sqlfluff" }, 9 | mysql = { "sqlfluff" }, 10 | plsql = { "sqlfluff" }, 11 | }, 12 | formatters = { 13 | sqlfluff = { 14 | require_cwd = false, 15 | args = { "format", "--dialect=postgres", "-" }, 16 | }, 17 | mojo = { 18 | inherit = false, 19 | command = "mojo", 20 | args = { "format", "--quiet", "$FILENAME" }, 21 | stdin = false, 22 | }, 23 | }, 24 | }, 25 | } -------------------------------------------------------------------------------- /lua/plugins/copilot-chat.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "CopilotC-Nvim/CopilotChat.nvim", 3 | keys = { 4 | { "aa", false }, 5 | { "ax", false }, 6 | { "aq", false }, 7 | { "ap", false }, 8 | { "ac", "", desc = "+copilotchat", mode = { "n", "v" } }, 9 | { 10 | "aca", 11 | function() 12 | return require("CopilotChat").toggle() 13 | end, 14 | desc = "Toggle (CopilotChat)", 15 | mode = { "n", "v" }, 16 | }, 17 | { 18 | "acx", 19 | function() 20 | return require("CopilotChat").reset() 21 | end, 22 | desc = "Clear (CopilotChat)", 23 | mode = { "n", "v" }, 24 | }, 25 | { 26 | "acq", 27 | function() 28 | local input = vim.fn.input("Quick Chat: ") 29 | if input ~= "" then 30 | require("CopilotChat").ask(input) 31 | end 32 | end, 33 | desc = "Quick Chat (CopilotChat)", 34 | mode = { "n", "v" }, 35 | }, 36 | { 37 | "acp", 38 | function() 39 | require("CopilotChat").select_prompt() 40 | end, 41 | desc = "Prompt Actions (CopilotChat)", 42 | mode = { "n", "v" }, 43 | }, 44 | }, 45 | opts = { 46 | model = "claude-3.7-sonnet", 47 | show_help = false, 48 | auto_insert_mode = false, 49 | mappings = { 50 | reset = { 51 | normal = "", 52 | insert = "", 53 | }, 54 | }, 55 | }, 56 | } 57 | -------------------------------------------------------------------------------- /lua/plugins/copilot.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "zbirenbaum/copilot.lua", 3 | keys = { 4 | { "aT", "Copilot! toggle", desc = "copilot: toggle" }, 5 | }, 6 | opts = { 7 | copilot_node_command = "/opt/homebrew/bin/node", -- so Copilot works in projects where node <18 is used 8 | filetypes = { 9 | -- Enable Copilot for specific filetypes 10 | yaml = true, 11 | gitcommit = true, 12 | gitrebase = true, 13 | conf = false, 14 | -- Disable for dot files 15 | ["."] = false, 16 | -- Custom handling for markdown files 17 | markdown = function() 18 | -- Disable Copilot in Obsidian vault directories 19 | if string.match(vim.fn.expand("%:p:h"), "Obsidian") then 20 | return false 21 | end 22 | return true 23 | end, 24 | -- Custom handling for fish shell scripts 25 | fish = function() 26 | -- Disable Copilot for hidden files (starting with .) 27 | if string.match(vim.fs.basename(vim.api.nvim_buf_get_name(0)), "^%..*") then 28 | return false 29 | end 30 | return true 31 | end, 32 | -- Custom handling for shell scripts 33 | sh = function() 34 | -- Disable Copilot for hidden files (starting with .) 35 | if string.match(vim.fs.basename(vim.api.nvim_buf_get_name(0)), "^%..*") then 36 | return false 37 | end 38 | return true 39 | end, 40 | }, 41 | }, 42 | } 43 | -------------------------------------------------------------------------------- /lua/plugins/diffview.lua: -------------------------------------------------------------------------------- 1 | -- Diffview configuration 2 | -- A single tabpage interface for easily cycling through diffs 3 | return { 4 | "sindrets/diffview.nvim", 5 | -- Load only when these commands are used 6 | cmd = { 7 | "DiffviewOpen", -- Open diff view 8 | "DiffviewClose", -- Close diff view 9 | "DiffviewToggleFiles", -- Toggle file panel 10 | "DiffviewFocusFiles", -- Focus file panel 11 | "DiffviewFileHistory", -- Show file history 12 | "DiffviewRefresh", -- Refresh diff view 13 | }, 14 | opts = { 15 | -- Enable enhanced diff highlighting 16 | enhanced_diff_hl = true, 17 | view = { 18 | merge_tool = { 19 | -- Use 4-way diff layout for merge conflicts 20 | layout = "diff4_mixed", 21 | -- Disable LSP diagnostics in diff view 22 | disable_diagnostics = true, 23 | }, 24 | }, 25 | }, 26 | } 27 | -------------------------------------------------------------------------------- /lua/plugins/go.lua: -------------------------------------------------------------------------------- 1 | -- Go development plugin configuration 2 | -- Provides enhanced Go language support 3 | return { 4 | "ray-x/go.nvim", 5 | -- Required dependencies for Go development 6 | dependencies = { 7 | "ray-x/guihua.lua", -- UI components 8 | "neovim/nvim-lspconfig", -- LSP configuration 9 | "nvim-treesitter/nvim-treesitter", -- Syntax highlighting 10 | }, 11 | config = function() 12 | -- Initialize with default settings 13 | require("go").setup() 14 | end, 15 | -- Load only for Go-related files 16 | ft = { "go", "gomod" }, 17 | -- Install/update Go tools on plugin installation 18 | build = ':lua require("go.install").update_all_sync()', 19 | } 20 | -------------------------------------------------------------------------------- /lua/plugins/lint-markdown.lua: -------------------------------------------------------------------------------- 1 | -- Markdown linting configuration 2 | -- Uses markdownlint-cli2 for linting markdown files 3 | return { 4 | "mfussenegger/nvim-lint", 5 | opts = { 6 | linters = { 7 | ["markdownlint-cli2"] = { 8 | args = { "--config", os.getenv("HOME") .. "/.config/nvim/.markdownlint-cli2.yaml", "--" }, 9 | }, 10 | }, 11 | }, 12 | } -------------------------------------------------------------------------------- /lua/plugins/lint-sql.lua: -------------------------------------------------------------------------------- 1 | -- SQL linting configuration 2 | -- Configures sqlfluff linter for SQL dialects 3 | return { 4 | "mfussenegger/nvim-lint", 5 | optional = true, 6 | opts = { 7 | linters_by_ft = { 8 | sql = { "sqlfluff" }, 9 | mysql = { "sqlfluff" }, 10 | plsql = { "sqlfluff" }, 11 | }, 12 | linters = { 13 | sqlfluff = { prepend_args = { "--dialect", "postgres" } }, 14 | }, 15 | }, 16 | } -------------------------------------------------------------------------------- /lua/plugins/lspconfig-go.lua: -------------------------------------------------------------------------------- 1 | -- LSP configuration for Go 2 | -- Adds golangci_lint_ls server 3 | return { 4 | "neovim/nvim-lspconfig", 5 | opts = { 6 | servers = { 7 | golangci_lint_ls = {}, 8 | }, 9 | }, 10 | } -------------------------------------------------------------------------------- /lua/plugins/lspconfig-keymaps.lua: -------------------------------------------------------------------------------- 1 | -- LSP keymaps configuration 2 | -- Disables some default LSP keybindings 3 | return { 4 | "neovim/nvim-lspconfig", 5 | opts = function() 6 | local keys = require("lazyvim.plugins.lsp.keymaps").get() 7 | -- disable mappings 8 | keys[#keys + 1] = { "", false } 9 | keys[#keys + 1] = { "", false } 10 | end, 11 | } -------------------------------------------------------------------------------- /lua/plugins/lualine-copilot.lua: -------------------------------------------------------------------------------- 1 | -- Lualine Copilot integration 2 | -- Shows Copilot status in the status line 3 | -- NOTE: This is a temporary fix until the issue is fixed in LazyVim: https://github.com/LazyVim/LazyVim/pull/5900 4 | return { 5 | "nvim-lualine/lualine.nvim", 6 | opts = function(_, opts) 7 | opts.sections.lualine_x[2] = LazyVim.lualine.status(LazyVim.config.icons.kinds.Copilot, function() 8 | local clients = package.loaded["copilot"] and LazyVim.lsp.get_clients({ name = "copilot", bufnr = 0 }) or {} 9 | if #clients > 0 then 10 | local status = require("copilot.status").data.status 11 | return (status == "InProgress" and "pending") or (status == "Warning" and "error") or "ok" 12 | end 13 | end) 14 | end, 15 | } -------------------------------------------------------------------------------- /lua/plugins/lualine-wordcount.lua: -------------------------------------------------------------------------------- 1 | -- Lualine word count extension 2 | -- Shows word count in the status line for text files 3 | return { 4 | "nvim-lualine/lualine.nvim", 5 | event = "VeryLazy", 6 | opts = function(_, opts) 7 | local function is_textfile() 8 | local filetype = vim.bo.filetype 9 | return filetype == "markdown" 10 | or filetype == "asciidoc" 11 | or filetype == "pandoc" 12 | or filetype == "tex" 13 | or filetype == "text" 14 | end 15 | 16 | local function wordcount() 17 | local wc = vim.fn.wordcount() 18 | local visual_words = wc.visual_words or wc.words 19 | local word_string = visual_words == 1 and " word" or " words" 20 | return tostring(visual_words) .. word_string 21 | end 22 | 23 | table.insert(opts.sections.lualine_z, { wordcount, cond = is_textfile }) 24 | end, 25 | } -------------------------------------------------------------------------------- /lua/plugins/mason-ruff.lua: -------------------------------------------------------------------------------- 1 | -- Mason Python tools configuration 2 | -- Ensures Python linting and formatting tools are installed 3 | return { 4 | "williamboman/mason.nvim", 5 | opts = { ensure_installed = { "ruff" } }, 6 | } 7 | -------------------------------------------------------------------------------- /lua/plugins/mason-sql.lua: -------------------------------------------------------------------------------- 1 | -- Mason SQL tools configuration 2 | -- Ensures SQL linting and formatting tools are installed 3 | return { 4 | "williamboman/mason.nvim", 5 | opts = { ensure_installed = { "sqlfluff" } }, 6 | } -------------------------------------------------------------------------------- /lua/plugins/obsidian.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "obsidian-nvim/obsidian.nvim", 3 | event = { "BufReadPre " .. vim.fn.expand("~") .. "/Obsidian/**.md" }, 4 | dependencies = { 5 | "nvim-lua/plenary.nvim", 6 | }, 7 | cmd = { 8 | "ObsidianBacklinks", 9 | "ObsidianDailies", 10 | "ObsidianExtractNote", 11 | "ObsidianFollowLink", 12 | "ObsidianLink", 13 | "ObsidianLinkNew", 14 | "ObsidianLinks", 15 | "ObsidianNew", 16 | "ObsidianOpen", 17 | "ObsidianPasteImg", 18 | "ObsidianQuickSwitch", 19 | "ObsidianRename", 20 | "ObsidianSearch", 21 | "ObsidianTags", 22 | "ObsidianTemplate", 23 | "ObsidianToday", 24 | "ObsidianTomorrow", 25 | "ObsidianWorkspace", 26 | "ObsidianYesterday", 27 | }, 28 | config = function() 29 | require("obsidian").setup({ 30 | workspaces = { 31 | { 32 | name = "private", 33 | path = "~/Obsidian/private", 34 | }, 35 | { 36 | name = "home", 37 | path = "~/Obsidian/home", 38 | }, 39 | }, 40 | 41 | completion = { 42 | nvim_cmp = false, 43 | blink = true, 44 | }, 45 | 46 | mappings = { 47 | -- Overrides the 'gf' mapping to work on markdown/wiki links within your vault. 48 | ["gf"] = { 49 | action = function() 50 | return require("obsidian").util.gf_passthrough() 51 | end, 52 | opts = { noremap = false, expr = true, buffer = true }, 53 | }, 54 | -- Toggle check-boxes. 55 | [""] = { 56 | action = function() 57 | return require("obsidian").util.toggle_checkbox() 58 | end, 59 | opts = { buffer = true }, 60 | }, 61 | -- Smart action depending on context, either follow link or toggle checkbox. 62 | [""] = { 63 | action = function() 64 | return require("obsidian").util.smart_action() 65 | end, 66 | opts = { buffer = true, expr = true }, 67 | }, 68 | }, 69 | 70 | -- Where to put new notes. Valid options are 71 | -- * "current_dir" - put new notes in same directory as the current buffer. 72 | -- * "notes_subdir" - put new notes in the default notes subdirectory. 73 | new_notes_location = "notes_subdir", 74 | 75 | -- Optional, customize how names/IDs for new notes are created. 76 | note_id_func = function(title) 77 | -- Create note IDs in a Zettelkasten format with a timestamp and a suffix. 78 | -- In this case a note with the title 'My new note' will given an ID that looks 79 | -- like '1657296016-my-new-note', and therefore the file name '1657296016-my-new-note.md' 80 | local suffix = "" 81 | if title ~= nil then 82 | -- If title is given, transform it into valid file name. 83 | suffix = title:gsub(" ", "-"):gsub("[^A-Za-z0-9-]", ""):lower() 84 | else 85 | -- If title is nil, just add 4 random uppercase letters to the suffix. 86 | for _ = 1, 4 do 87 | suffix = suffix .. string.char(math.random(65, 90)) 88 | end 89 | end 90 | return suffix 91 | end, 92 | 93 | -- Optional, customize how wiki links are formatted. 94 | ---@param opts {path: string, label: string, id: string|?} 95 | ---@return string 96 | wiki_link_func = function(opts) 97 | if opts.id == nil then 98 | return string.format("[[%s]]", opts.label) 99 | elseif opts.label ~= opts.id then 100 | return string.format("[[%s|%s]]", opts.id, opts.label) 101 | else 102 | return string.format("[[%s]]", opts.id) 103 | end 104 | end, 105 | 106 | -- Optional, customize how markdown links are formatted. 107 | ---@param opts {path: string, label: string, id: string|?} 108 | ---@return string 109 | markdown_link_func = function(opts) 110 | return string.format("[%s](%s)", opts.label, opts.path) 111 | end, 112 | 113 | -- Either 'wiki' or 'markdown'. 114 | preferred_link_style = "wiki", 115 | 116 | -- Optional, customize the default name or prefix when pasting images via `:ObsidianPasteImg`. 117 | ---@return string 118 | image_name_func = function() 119 | -- Prefix image names with timestamp. 120 | return string.format("%s-", os.time()) 121 | end, 122 | 123 | -- Optional, set to true if you don't want obsidian.nvim to manage frontmatter. 124 | disable_frontmatter = true, 125 | 126 | -- Optional, alternatively you can customize the frontmatter data. 127 | note_frontmatter_func = function(note) 128 | -- This is equivalent to the default frontmatter function. 129 | local out = { title = note.id, tags = note.tags } 130 | -- `note.metadata` contains any manually added fields in the frontmatter. 131 | -- So here we just make sure those fields are kept in the frontmatter. 132 | if note.metadata ~= nil and not vim.tbl_isempty(note.metadata) then 133 | for k, v in pairs(note.metadata) do 134 | out[k] = v 135 | end 136 | end 137 | return out 138 | end, 139 | 140 | templates = { 141 | subdir = "_templates", 142 | date_format = "%Y-%m-%d", 143 | time_format = "%H:%M", 144 | }, 145 | 146 | -- Optional, by default when you use `:ObsidianFollowLink` on a link to an external 147 | -- URL it will be ignored but you can customize this behavior here. 148 | follow_url_func = function(url) 149 | -- Open the URL in the default web browser. 150 | vim.fn.jobstart({ "open", url }) -- linux 151 | end, 152 | 153 | -- Optional, set to true if you use the Obsidian Advanced URI plugin. 154 | -- https://github.com/Vinzent03/obsidian-advanced-uri 155 | use_advanced_uri = true, 156 | 157 | -- Optional, set to true to force ':ObsidianOpen' to bring the app to the foreground. 158 | open_app_foreground = false, 159 | 160 | picker = { 161 | -- Set your preferred picker. Can be one of 'telescope.nvim', 'fzf-lua', or 'mini.pick'. 162 | name = "snacks.pick", 163 | -- Optional, configure key mappings for the picker. These are the defaults. 164 | -- Not all pickers support all mappings. 165 | note_mappings = { 166 | -- Create a new note from your query. 167 | new = "", 168 | -- Insert a link to the selected note. 169 | insert_link = "", 170 | }, 171 | tag_mappings = { 172 | -- Add tag(s) to current note. 173 | tag_note = "", 174 | -- Insert a tag at the current location. 175 | insert_tag = "", 176 | }, 177 | }, 178 | 179 | -- Optional, sort search results by "path", "modified", "accessed", or "created". 180 | -- The recommend value is "modified" and `true` for `sort_reversed`, which means, for example, 181 | -- that `:ObsidianQuickSwitch` will show the notes sorted by latest modified time 182 | sort_by = "modified", 183 | sort_reversed = true, 184 | 185 | -- Optional, determines whether to open notes in a horizontal split, a vertical split, 186 | -- or replacing the current buffer (default) 187 | -- Accepted values are "current", "hsplit" and "vsplit" 188 | open_notes_in = "current", 189 | 190 | -- Optional, configure additional syntax highlighting / extmarks. 191 | -- This requires you have `conceallevel` set to 1 or 2. See `:help conceallevel` for more details. 192 | ui = { 193 | enable = false, -- set to false to disable all additional syntax features 194 | update_debounce = 200, -- update delay after a text change (in milliseconds) 195 | -- Define how various check-boxes are displayed 196 | checkboxes = { 197 | -- NOTE: the 'char' value has to be a single character, and the highlight groups are defined below. 198 | [" "] = { char = "󰄱", hl_group = "ObsidianTodo" }, 199 | ["x"] = { char = "", hl_group = "ObsidianDone" }, 200 | [">"] = { char = "", hl_group = "ObsidianRightArrow" }, 201 | ["~"] = { char = "󰰱", hl_group = "ObsidianTilde" }, 202 | -- Replace the above with this if you don't have a patched font: 203 | -- [" "] = { char = "☐", hl_group = "ObsidianTodo" }, 204 | -- ["x"] = { char = "✔", hl_group = "ObsidianDone" }, 205 | 206 | -- You can also add more custom ones... 207 | }, 208 | -- Use bullet marks for non-checkbox lists. 209 | bullets = { char = "•", hl_group = "ObsidianBullet" }, 210 | external_link_icon = { char = "", hl_group = "ObsidianExtLinkIcon" }, 211 | -- Replace the above with this if you don't have a patched font: 212 | -- external_link_icon = { char = "", hl_group = "ObsidianExtLinkIcon" }, 213 | reference_text = { hl_group = "ObsidianRefText" }, 214 | highlight_text = { hl_group = "ObsidianHighlightText" }, 215 | tags = { hl_group = "ObsidianTag" }, 216 | hl_groups = { 217 | -- The options are passed directly to `vim.api.nvim_set_hl()`. See `:help nvim_set_hl`. 218 | ObsidianTodo = { bold = true, fg = "#f78c6c" }, 219 | ObsidianDone = { bold = true, fg = "#89ddff" }, 220 | ObsidianRightArrow = { bold = true, fg = "#f78c6c" }, 221 | ObsidianTilde = { bold = true, fg = "#ff5370" }, 222 | ObsidianBullet = { bold = true, fg = "#89ddff" }, 223 | ObsidianRefText = { underline = true, fg = "#c792ea" }, 224 | ObsidianExtLinkIcon = { fg = "#c792ea" }, 225 | ObsidianTag = { italic = true, fg = "#89ddff" }, 226 | ObsidianHighlightText = { bg = "#75662e" }, 227 | }, 228 | }, 229 | 230 | -- Specify how to handle attachments. 231 | attachments = { 232 | -- The default folder to place images in via `:ObsidianPasteImg`. 233 | -- If this is a relative path it will be interpreted as relative to the vault root. 234 | -- You can always override this per image by passing a full path to the command instead of just a filename. 235 | img_folder = "_assets/", 236 | -- A function that determines the text to insert in the note when pasting an image. 237 | -- It takes two arguments, the `obsidian.Client` and a plenary `Path` to the image file. 238 | -- This is the default implementation. 239 | ---@param client obsidian.Client 240 | ---@param path Path the absolute path to the image file 241 | ---@return string 242 | img_text_func = function(client, path) 243 | local link_path 244 | local vault_relative_path = client:vault_relative_path(path) 245 | if vault_relative_path ~= nil then 246 | -- Use relative path if the image is saved in the vault dir. 247 | link_path = vault_relative_path 248 | else 249 | -- Otherwise use the absolute path. 250 | link_path = tostring(path) 251 | end 252 | local display_name = vim.fs.basename(link_path) 253 | return string.format("![%s](%s)", display_name, link_path) 254 | end, 255 | }, 256 | 257 | -- Optional, set the YAML parser to use. The valid options are: 258 | -- * "native" - uses a pure Lua parser that's fast but potentially misses some edge cases. 259 | -- * "yq" - uses the command-line tool yq (https://github.com/mikefarah/yq), which is more robust 260 | -- but much slower and needs to be installed separately. 261 | -- In general you should be using the native parser unless you run into a bug with it, in which 262 | -- case you can temporarily switch to the "yq" parser until the bug is fixed. 263 | yaml_parser = "native", 264 | }) 265 | vim.keymap.set("n", "gf", function() 266 | if require("obsidian").util.cursor_on_markdown_link() then 267 | return "ObsidianFollowLink" 268 | else 269 | return "gf" 270 | end 271 | end, { noremap = false, expr = true }) 272 | end, 273 | keys = { 274 | { "z", "", desc = "+obsidian", mode = { "n", "v" } }, 275 | { "zl", "ObsidianQuickSwitch", desc = "List notes", mode = { "n" } }, 276 | { 277 | "zn", 278 | function() 279 | local title = vim.fn.input("Title: ") 280 | if title ~= "" then 281 | vim.cmd("ObsidianNew " .. title) 282 | end 283 | end, 284 | desc = "Create new note (in current dir)", 285 | mode = { "n" }, 286 | }, 287 | { "zl", "ObsidianLink", desc = "Link a note", mode = { "v" } }, 288 | { 289 | "zn", 290 | function() 291 | local title = vim.fn.input("Title: ") 292 | if title ~= "" then 293 | vim.cmd("ObsidianLinkNew " .. title) 294 | end 295 | end, 296 | desc = "Create new linked note (in current dir)", 297 | mode = { "v" }, 298 | }, 299 | { "zb", "ObsidianBacklinks", desc = "List backlinks" }, 300 | { "zi", "ObsidianTemplate", desc = "Insert template" }, 301 | { "zo", "ObsidianOpen", desc = "Open obsidian" }, 302 | { "zs", "ObsidianSearch", desc = "Search notes" }, 303 | { "zw", "ObsidianWorkspace", desc = "Select active workspace" }, 304 | }, 305 | } 306 | -------------------------------------------------------------------------------- /lua/plugins/orphans.lua: -------------------------------------------------------------------------------- 1 | -- Orphans plugin configuration 2 | -- Helps to find orphaned files in your project 3 | return { 4 | "ZWindL/orphans.nvim", 5 | config = function() 6 | require("orphans").setup({}) 7 | end, 8 | cmd = { "Orphans" }, 9 | } -------------------------------------------------------------------------------- /lua/plugins/project.lua: -------------------------------------------------------------------------------- 1 | -- Project management configuration 2 | -- Automatically detects and switches working directory based on project files 3 | return { 4 | "ahmedkhalf/project.nvim", 5 | event = "VeryLazy", 6 | config = function() 7 | require("project_nvim").setup({ 8 | patterns = { "go.mod", ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json", ".obsidian" }, 9 | }) 10 | end, 11 | } -------------------------------------------------------------------------------- /lua/plugins/snacks.lua: -------------------------------------------------------------------------------- 1 | -- Snacks.nvim configuration 2 | -- Provides dashboard, indent guides, and file picker 3 | return { 4 | "folke/snacks.nvim", 5 | opts = { 6 | dashboard = { 7 | preset = { 8 | header = [[Hey Joe 👋!]], 9 | }, 10 | }, 11 | indent = { 12 | scope = { enabled = false }, 13 | animate = { enabled = false }, 14 | }, 15 | scroll = { 16 | enabled = false, 17 | }, 18 | picker = { 19 | formatters = { 20 | file = { 21 | filename_first = true, -- display filename before the file path 22 | truncate = 100, -- truncate the file path to (roughly) this length 23 | }, 24 | }, 25 | hidden = true, -- show hidden files by default 26 | }, 27 | }, 28 | keys = { 29 | { 30 | "", 31 | function() 32 | Snacks.picker.files({ hidden = true }) 33 | end, 34 | desc = "Find Files (Root Dir)", 35 | }, 36 | }, 37 | } -------------------------------------------------------------------------------- /lua/plugins/text-case.lua: -------------------------------------------------------------------------------- 1 | -- Text Case plugin configuration 2 | -- Provides case conversion utilities 3 | return { 4 | "johmsalas/text-case.nvim", 5 | config = function() 6 | require("textcase").setup({}) 7 | end, 8 | } -------------------------------------------------------------------------------- /lua/plugins/tokyonight.lua: -------------------------------------------------------------------------------- 1 | -- Tokyo Night colorscheme configuration 2 | return { 3 | "folke/tokyonight.nvim", 4 | opts = { style = "night" }, 5 | } -------------------------------------------------------------------------------- /lua/plugins/treesitter.lua: -------------------------------------------------------------------------------- 1 | -- Treesitter configuration 2 | -- Additional language parsers configuration 3 | return { 4 | "nvim-treesitter/nvim-treesitter", 5 | optional = true, 6 | opts = { ensure_installed = { "sql", "gotmpl", "comment" } }, 7 | } -------------------------------------------------------------------------------- /lua/plugins/wakatime.lua: -------------------------------------------------------------------------------- 1 | -- WakaTime plugin configuration 2 | -- Measures the time spent on projects 3 | return { 4 | "wakatime/vim-wakatime", 5 | event = "VeryLazy", 6 | } -------------------------------------------------------------------------------- /lua/plugins/which-key.lua: -------------------------------------------------------------------------------- 1 | -- Which-key configuration 2 | -- Shows keybinding hints in a popup 3 | return { 4 | "folke/which-key.nvim", 5 | opts = { 6 | preset = "helix", 7 | icons = { 8 | mappings = false, 9 | rules = false, 10 | }, 11 | spec = { 12 | { 13 | mode = { "n" }, 14 | { "W", 'lua require("config.utils").sudo_write()', desc = "Write (sudo)" }, 15 | }, 16 | }, 17 | }, 18 | } -------------------------------------------------------------------------------- /lua/plugins/yazi.lua: -------------------------------------------------------------------------------- 1 | return { 2 | "mikavilpas/yazi.nvim", 3 | event = "VeryLazy", 4 | keys = { 5 | { 6 | "y", 7 | "Yazi toggle", 8 | desc = "Yazi", 9 | }, 10 | { 11 | "Y", 12 | "Yazi cwd", 13 | desc = "Yazi - root dir", 14 | }, 15 | }, 16 | opts = { 17 | open_for_directories = false, 18 | keymaps = { 19 | show_help = "", 20 | }, 21 | }, 22 | } 23 | -------------------------------------------------------------------------------- /stylua.toml: -------------------------------------------------------------------------------- 1 | indent_type = "Spaces" 2 | indent_width = 2 3 | column_width = 120 --------------------------------------------------------------------------------