this repo has no description

add updated nvim config

+19
nvim/LICENSE.md
··· 1 + MIT License 2 + 3 + Permission is hereby granted, free of charge, to any person obtaining a copy 4 + of this software and associated documentation files (the "Software"), to deal 5 + in the Software without restriction, including without limitation the rights 6 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 + copies of the Software, and to permit persons to whom the Software is 8 + furnished to do so, subject to the following conditions: 9 + 10 + The above copyright notice and this permission notice shall be included in all 11 + copies or substantial portions of the Software. 12 + 13 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 + SOFTWARE.
+238
nvim/README.md
··· 1 + # kickstart.nvim 2 + 3 + ## Introduction 4 + 5 + A starting point for Neovim that is: 6 + 7 + * Small 8 + * Single-file 9 + * Completely Documented 10 + 11 + **NOT** a Neovim distribution, but instead a starting point for your configuration. 12 + 13 + ## Installation 14 + 15 + ### Install Neovim 16 + 17 + Kickstart.nvim targets *only* the latest 18 + ['stable'](https://github.com/neovim/neovim/releases/tag/stable) and latest 19 + ['nightly'](https://github.com/neovim/neovim/releases/tag/nightly) of Neovim. 20 + If you are experiencing issues, please make sure you have the latest versions. 21 + 22 + ### Install External Dependencies 23 + 24 + External Requirements: 25 + - Basic utils: `git`, `make`, `unzip`, C Compiler (`gcc`) 26 + - [ripgrep](https://github.com/BurntSushi/ripgrep#installation) 27 + - Clipboard tool (xclip/xsel/win32yank or other depending on the platform) 28 + - A [Nerd Font](https://www.nerdfonts.com/): optional, provides various icons 29 + - if you have it set `vim.g.have_nerd_font` in `init.lua` to true 30 + - Language Setup: 31 + - If you want to write Typescript, you need `npm` 32 + - If you want to write Golang, you will need `go` 33 + - etc. 34 + 35 + > **NOTE** 36 + > See [Install Recipes](#Install-Recipes) for additional Windows and Linux specific notes 37 + > and quick install snippets 38 + 39 + ### Install Kickstart 40 + 41 + > **NOTE** 42 + > [Backup](#FAQ) your previous configuration (if any exists) 43 + 44 + Neovim's configurations are located under the following paths, depending on your OS: 45 + 46 + | OS | PATH | 47 + | :- | :--- | 48 + | Linux, MacOS | `$XDG_CONFIG_HOME/nvim`, `~/.config/nvim` | 49 + | Windows (cmd)| `%localappdata%\nvim\` | 50 + | Windows (powershell)| `$env:LOCALAPPDATA\nvim\` | 51 + 52 + #### Recommended Step 53 + 54 + [Fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this repo 55 + so that you have your own copy that you can modify, then install by cloning the 56 + fork to your machine using one of the commands below, depending on your OS. 57 + 58 + > **NOTE** 59 + > Your fork's URL will be something like this: 60 + > `https://github.com/<your_github_username>/kickstart.nvim.git` 61 + 62 + You likely want to remove `lazy-lock.json` from your fork's `.gitignore` file 63 + too - it's ignored in the kickstart repo to make maintenance easier, but it's 64 + [recommended to track it in version control](https://lazy.folke.io/usage/lockfile). 65 + 66 + #### Clone kickstart.nvim 67 + > **NOTE** 68 + > If following the recommended step above (i.e., forking the repo), replace 69 + > `nvim-lua` with `<your_github_username>` in the commands below 70 + 71 + <details><summary> Linux and Mac </summary> 72 + 73 + ```sh 74 + git clone https://github.com/nvim-lua/kickstart.nvim.git "${XDG_CONFIG_HOME:-$HOME/.config}"/nvim 75 + ``` 76 + 77 + </details> 78 + 79 + <details><summary> Windows </summary> 80 + 81 + If you're using `cmd.exe`: 82 + 83 + ``` 84 + git clone https://github.com/nvim-lua/kickstart.nvim.git "%localappdata%\nvim" 85 + ``` 86 + 87 + If you're using `powershell.exe` 88 + 89 + ``` 90 + git clone https://github.com/nvim-lua/kickstart.nvim.git "${env:LOCALAPPDATA}\nvim" 91 + ``` 92 + 93 + </details> 94 + 95 + ### Post Installation 96 + 97 + Start Neovim 98 + 99 + ```sh 100 + nvim 101 + ``` 102 + 103 + That's it! Lazy will install all the plugins you have. Use `:Lazy` to view 104 + the current plugin status. Hit `q` to close the window. 105 + 106 + #### Read The Friendly Documentation 107 + 108 + Read through the `init.lua` file in your configuration folder for more 109 + information about extending and exploring Neovim. That also includes 110 + examples of adding popularly requested plugins. 111 + 112 + > [!NOTE] 113 + > For more information about a particular plugin check its repository's documentation. 114 + 115 + 116 + ### Getting Started 117 + 118 + [The Only Video You Need to Get Started with Neovim](https://youtu.be/m8C0Cq9Uv9o) 119 + 120 + ### FAQ 121 + 122 + * What should I do if I already have a pre-existing Neovim configuration? 123 + * You should back it up and then delete all associated files. 124 + * This includes your existing init.lua and the Neovim files in `~/.local` 125 + which can be deleted with `rm -rf ~/.local/share/nvim/` 126 + * Can I keep my existing configuration in parallel to kickstart? 127 + * Yes! You can use [NVIM_APPNAME](https://neovim.io/doc/user/starting.html#%24NVIM_APPNAME)`=nvim-NAME` 128 + to maintain multiple configurations. For example, you can install the kickstart 129 + configuration in `~/.config/nvim-kickstart` and create an alias: 130 + ``` 131 + alias nvim-kickstart='NVIM_APPNAME="nvim-kickstart" nvim' 132 + ``` 133 + When you run Neovim using `nvim-kickstart` alias it will use the alternative 134 + config directory and the matching local directory 135 + `~/.local/share/nvim-kickstart`. You can apply this approach to any Neovim 136 + distribution that you would like to try out. 137 + * What if I want to "uninstall" this configuration: 138 + * See [lazy.nvim uninstall](https://lazy.folke.io/usage#-uninstalling) information 139 + * Why is the kickstart `init.lua` a single file? Wouldn't it make sense to split it into multiple files? 140 + * The main purpose of kickstart is to serve as a teaching tool and a reference 141 + configuration that someone can easily use to `git clone` as a basis for their own. 142 + As you progress in learning Neovim and Lua, you might consider splitting `init.lua` 143 + into smaller parts. A fork of kickstart that does this while maintaining the 144 + same functionality is available here: 145 + * [kickstart-modular.nvim](https://github.com/dam9000/kickstart-modular.nvim) 146 + * Discussions on this topic can be found here: 147 + * [Restructure the configuration](https://github.com/nvim-lua/kickstart.nvim/issues/218) 148 + * [Reorganize init.lua into a multi-file setup](https://github.com/nvim-lua/kickstart.nvim/pull/473) 149 + 150 + ### Install Recipes 151 + 152 + Below you can find OS specific install instructions for Neovim and dependencies. 153 + 154 + After installing all the dependencies continue with the [Install Kickstart](#Install-Kickstart) step. 155 + 156 + #### Windows Installation 157 + 158 + <details><summary>Windows with Microsoft C++ Build Tools and CMake</summary> 159 + Installation may require installing build tools and updating the run command for `telescope-fzf-native` 160 + 161 + See `telescope-fzf-native` documentation for [more details](https://github.com/nvim-telescope/telescope-fzf-native.nvim#installation) 162 + 163 + This requires: 164 + 165 + - Install CMake and the Microsoft C++ Build Tools on Windows 166 + 167 + ```lua 168 + {'nvim-telescope/telescope-fzf-native.nvim', build = 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' } 169 + ``` 170 + </details> 171 + <details><summary>Windows with gcc/make using chocolatey</summary> 172 + Alternatively, one can install gcc and make which don't require changing the config, 173 + the easiest way is to use choco: 174 + 175 + 1. install [chocolatey](https://chocolatey.org/install) 176 + either follow the instructions on the page or use winget, 177 + run in cmd as **admin**: 178 + ``` 179 + winget install --accept-source-agreements chocolatey.chocolatey 180 + ``` 181 + 182 + 2. install all requirements using choco, exit the previous cmd and 183 + open a new one so that choco path is set, and run in cmd as **admin**: 184 + ``` 185 + choco install -y neovim git ripgrep wget fd unzip gzip mingw make 186 + ``` 187 + </details> 188 + <details><summary>WSL (Windows Subsystem for Linux)</summary> 189 + 190 + ``` 191 + wsl --install 192 + wsl 193 + sudo add-apt-repository ppa:neovim-ppa/unstable -y 194 + sudo apt update 195 + sudo apt install make gcc ripgrep unzip git xclip neovim 196 + ``` 197 + </details> 198 + 199 + #### Linux Install 200 + <details><summary>Ubuntu Install Steps</summary> 201 + 202 + ``` 203 + sudo add-apt-repository ppa:neovim-ppa/unstable -y 204 + sudo apt update 205 + sudo apt install make gcc ripgrep unzip git xclip neovim 206 + ``` 207 + </details> 208 + <details><summary>Debian Install Steps</summary> 209 + 210 + ``` 211 + sudo apt update 212 + sudo apt install make gcc ripgrep unzip git xclip curl 213 + 214 + # Now we install nvim 215 + curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim-linux64.tar.gz 216 + sudo rm -rf /opt/nvim-linux64 217 + sudo mkdir -p /opt/nvim-linux64 218 + sudo chmod a+rX /opt/nvim-linux64 219 + sudo tar -C /opt -xzf nvim-linux64.tar.gz 220 + 221 + # make it available in /usr/local/bin, distro installs to /usr/bin 222 + sudo ln -sf /opt/nvim-linux64/bin/nvim /usr/local/bin/ 223 + ``` 224 + </details> 225 + <details><summary>Fedora Install Steps</summary> 226 + 227 + ``` 228 + sudo dnf install -y gcc make git ripgrep fd-find unzip neovim 229 + ``` 230 + </details> 231 + 232 + <details><summary>Arch Install Steps</summary> 233 + 234 + ``` 235 + sudo pacman -S --noconfirm --needed gcc make git ripgrep fd unzip neovim 236 + ``` 237 + </details> 238 +
+24
nvim/doc/kickstart.txt
··· 1 + ================================================================================ 2 + INTRODUCTION *kickstart.nvim* 3 + 4 + Kickstart.nvim is a project to help you get started on your neovim journey. 5 + 6 + *kickstart-is-not* 7 + It is not: 8 + - Complete framework for every plugin under the sun 9 + - Place to add every plugin that could ever be useful 10 + 11 + *kickstart-is* 12 + It is: 13 + - Somewhere that has a good start for the most common "IDE" type features: 14 + - autocompletion 15 + - goto-definition 16 + - find references 17 + - fuzzy finding 18 + - and hinting at what more can be done :) 19 + - A place to _kickstart_ your journey. 20 + - You should fork this project and use/modify it so that it matches your 21 + style and preferences. If you don't want to do that, there are probably 22 + other projects that would fit much better for you (and that's great!)! 23 + 24 + vim:tw=78:ts=8:ft=help:norl:
+1050
nvim/init.lua
··· 1 + -- Set <space> as the leader key 2 + -- See `:help mapleader` 3 + -- NOTE: Must happen before plugins are loaded (otherwise wrong leader will be used) 4 + vim.g.mapleader = " " 5 + vim.g.maplocalleader = " " 6 + 7 + -- Set to true if you have a Nerd Font installed and selected in the terminal 8 + vim.g.have_nerd_font = true 9 + 10 + -- [[ Setting options ]] 11 + -- See `:help vim.opt` 12 + -- NOTE: You can change these options as you wish! 13 + -- For more options, you can see `:help option-list` 14 + 15 + -- Make line numbers default 16 + vim.opt.number = true 17 + -- You can also add relative line numbers, to help with jumping. 18 + -- Experiment for yourself to see if you like it! 19 + vim.opt.relativenumber = true 20 + 21 + vim.opt.tabstop = 4 22 + vim.opt.shiftwidth = 4 23 + 24 + -- Enable mouse mode, can be useful for resizing splits for example! 25 + vim.opt.mouse = "a" 26 + 27 + -- Don't show the mode, since it's already in the status line 28 + vim.opt.showmode = false 29 + 30 + -- Sync clipboard between OS and Neovim. 31 + -- Schedule the setting after `UiEnter` because it can increase startup-time. 32 + -- Remove this option if you want your OS clipboard to remain independent. 33 + -- See `:help 'clipboard'` 34 + vim.schedule(function() 35 + vim.opt.clipboard = "unnamedplus" 36 + end) 37 + 38 + -- Enable break indent 39 + vim.opt.breakindent = true 40 + 41 + -- Save undo history 42 + vim.opt.undofile = true 43 + 44 + -- Case-insensitive searching UNLESS \C or one or more capital letters in the search term 45 + vim.opt.ignorecase = true 46 + vim.opt.smartcase = true 47 + 48 + -- Keep signcolumn on by default 49 + vim.opt.signcolumn = "yes" 50 + 51 + -- Decrease update time 52 + vim.opt.updatetime = 250 53 + 54 + -- Decrease mapped sequence wait time 55 + vim.opt.timeoutlen = 300 56 + 57 + -- Configure how new splits should be opened 58 + vim.opt.splitright = true 59 + vim.opt.splitbelow = true 60 + 61 + -- Sets how neovim will display certain whitespace characters in the editor. 62 + -- See `:help 'list'` 63 + -- and `:help 'listchars'` 64 + vim.opt.list = true 65 + vim.opt.listchars = { tab = "» ", trail = "·", nbsp = "␣" } 66 + 67 + -- Preview substitutions live, as you type! 68 + vim.opt.inccommand = "split" 69 + 70 + -- Show which line your cursor is on 71 + vim.opt.cursorline = true 72 + 73 + -- Minimal number of screen lines to keep above and below the cursor. 74 + vim.opt.scrolloff = 10 75 + 76 + -- [[ Basic Keymaps ]] 77 + -- See `:help vim.keymap.set()` 78 + 79 + -- Clear highlights on search when pressing <Esc> in normal mode 80 + -- See `:help hlsearch` 81 + vim.keymap.set("n", "<Esc>", "<cmd>nohlsearch<CR>") 82 + 83 + -- Exit terminal mode in the builtin terminal with a shortcut that is a bit easier 84 + -- for people to discover. Otherwise, you normally need to press <C-\><C-n>, which 85 + -- is not what someone will guess without a bit more experience. 86 + -- 87 + -- NOTE: This won't work in all terminal emulators/tmux/etc. Try your own mapping 88 + -- or just use <C-\><C-n> to exit terminal mode 89 + vim.keymap.set("t", "<Esc><Esc>", "<C-\\><C-n>", { desc = "Exit terminal mode" }) 90 + 91 + -- MY KEYMAPS!!! 92 + vim.keymap.set("i", "<S-CR>", "<Esc>o", { noremap = true, silent = true }) 93 + -- vim.keymap.set("i", "<Tab>", function() 94 + -- local col = vim.fn.col(".") -- Get the current column 95 + -- local line = vim.fn.getline(".") -- Get the current line 96 + -- 97 + -- -- Check if the current character is a closing quote 98 + -- local char = line:sub(col, col) 99 + -- if char == '"' or char == "'" or char == "`" then 100 + -- return "<Right>" 101 + -- end 102 + -- end, { expr = true, noremap = true }) 103 + 104 + -- TIP: Disable arrow keys in normal mode 105 + -- vim.keymap.set('n', '<left>', '<cmd>echo "Use h to move!!"<CR>') 106 + -- vim.keymap.set('n', '<right>', '<cmd>echo "Use l to move!!"<CR>') 107 + -- vim.keymap.set('n', '<up>', '<cmd>echo "Use k to move!!"<CR>') 108 + -- vim.keymap.set('n', '<down>', '<cmd>echo "Use j to move!!"<CR>') 109 + 110 + -- Keybinds to make split navigation easier. 111 + -- Use CTRL+<hjkl> to switch between windows 112 + -- 113 + -- See `:help wincmd` for a list of all window commands 114 + vim.keymap.set("n", "<C-h>", "<C-w><C-h>", { desc = "Move focus to the left window" }) 115 + vim.keymap.set("n", "<C-l>", "<C-w><C-l>", { desc = "Move focus to the right window" }) 116 + vim.keymap.set("n", "<C-j>", "<C-w><C-j>", { desc = "Move focus to the lower window" }) 117 + vim.keymap.set("n", "<C-k>", "<C-w><C-k>", { desc = "Move focus to the upper window" }) 118 + 119 + -- vim.experimental.check_rtp_message = false 120 + 121 + vim.g.snacks_animate = false 122 + ---@type table<number, {token:lsp.ProgressToken, msg:string, done:boolean}[]> 123 + local progress = vim.defaulttable() 124 + vim.api.nvim_create_autocmd("LspProgress", { 125 + ---@param ev {data: {client_id: integer, params: lsp.ProgressParams}} 126 + callback = function(ev) 127 + local client = vim.lsp.get_client_by_id(ev.data.client_id) 128 + local value = ev.data.params.value --[[@as {percentage?: number, title?: string, message?: string, kind: "begin" | "report" | "end"}]] 129 + if not client or type(value) ~= "table" then 130 + return 131 + end 132 + local p = progress[client.id] 133 + for i = 1, #p + 1 do 134 + if i == #p + 1 or p[i].token == ev.data.params.token then 135 + p[i] = { 136 + token = ev.data.params.token, 137 + msg = ("[%3d%%] %s%s"):format( 138 + value.kind == "end" and 100 or value.percentage or 100, 139 + value.title or "", 140 + value.message and (" **%s**"):format(value.message) or "" 141 + ), 142 + done = value.kind == "end", 143 + } 144 + break 145 + end 146 + end 147 + local msg = {} ---@type string[] 148 + progress[client.id] = vim.tbl_filter(function(v) 149 + return table.insert(msg, v.msg) or not v.done 150 + end, p) 151 + local spinner = { "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏" } 152 + vim.notify(table.concat(msg, "\n"), "info", { 153 + id = "lsp_progress", 154 + title = client.name, 155 + opts = function(notif) 156 + notif.icon = #progress[client.id] == 0 and " " 157 + or spinner[math.floor(vim.uv.hrtime() / (1e6 * 80)) % #spinner + 1] 158 + end, 159 + }) 160 + end, 161 + }) 162 + 163 + -- [[ Basic Autocommands ]] 164 + -- See `:help lua-guide-autocommands` 165 + 166 + -- Highlight when yanking (copying) text 167 + -- Try it with `yap` in normal mode 168 + -- See `:help vim.highlight.on_yank()` 169 + vim.api.nvim_create_autocmd("TextYankPost", { 170 + desc = "Highlight when yanking (copying) text", 171 + group = vim.api.nvim_create_augroup("kickstart-highlight-yank", { clear = true }), 172 + callback = function() 173 + vim.highlight.on_yank() 174 + end, 175 + }) 176 + 177 + -- [[ Install `lazy.nvim` plugin manager ]] 178 + -- See `:help lazy.nvim.txt` or https://github.com/folke/lazy.nvim for more info 179 + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" 180 + if not (vim.uv or vim.loop).fs_stat(lazypath) then 181 + local lazyrepo = "https://github.com/folke/lazy.nvim.git" 182 + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) 183 + if vim.v.shell_error ~= 0 then 184 + error("Error cloning lazy.nvim:\n" .. out) 185 + end 186 + end 187 + vim.opt.rtp:prepend(lazypath) 188 + 189 + -- [[ Configure and install plugins ]] 190 + -- 191 + -- To check the current status of your plugins, run 192 + -- :Lazy 193 + -- 194 + -- You can press `?` in this menu for help. Use `:q` to close the window 195 + -- 196 + -- To update plugins you can run 197 + -- :Lazy update 198 + -- 199 + -- NOTE: Here is where you install your plugins. 200 + require("lazy").setup({ 201 + -- NOTE: Plugins can be added with a link (or for a github repo: 'owner/repo' link). 202 + { "NMAC427/guess-indent.nvim", opts = {} }, -- Detect tabstop and shiftwidth automatically 203 + 204 + -- NOTE: Plugins can also be added by using a table, 205 + -- with the first argument being the link and the following 206 + -- keys can be used to configure plugin behavior/loading/etc. 207 + -- 208 + -- Use `opts = {}` to force a plugin to be loaded. 209 + -- 210 + 211 + -- Here is a more advanced example where we pass configuration 212 + -- options to `gitsigns.nvim`. This is equivalent to the following Lua: 213 + -- require('gitsigns').setup({ ... }) 214 + -- 215 + -- See `:help gitsigns` to understand what the configuration keys do 216 + { -- Adds git related signs to the gutter, as well as utilities for managing changes 217 + "lewis6991/gitsigns.nvim", 218 + opts = { 219 + vim.api.nvim_set_hl(0, "GitSignsCurrentLineBlame", { fg = "#8f8f8f" }), 220 + current_line_blame = true, 221 + current_line_blame_opts = { 222 + delay = 0, 223 + virt_text_pos = "right_align", 224 + }, 225 + signs = { 226 + add = { text = "+" }, 227 + change = { text = "~" }, 228 + delete = { text = "_" }, 229 + topdelete = { text = "‾" }, 230 + changedelete = { text = "~" }, 231 + }, 232 + }, 233 + }, 234 + 235 + -- NOTE: Plugins can also be configured to run Lua code when they are loaded. 236 + -- 237 + -- This is often very useful to both group configuration, as well as handle 238 + -- lazy loading plugins that don't need to be loaded immediately at startup. 239 + -- 240 + -- For example, in the following configuration, we use: 241 + -- event = 'VimEnter' 242 + -- 243 + -- which loads which-key before all the UI elements are loaded. Events can be 244 + -- normal autocommands events (`:help autocmd-events`). 245 + -- 246 + -- Then, because we use the `opts` key (recommended), the configuration runs 247 + -- after the plugin has been loaded as `require(MODULE).setup(opts)`. 248 + 249 + { -- Useful plugin to show you pending keybinds. 250 + "folke/which-key.nvim", 251 + event = "VimEnter", -- Sets the loading event to 'VimEnter' 252 + opts = { 253 + -- delay between pressing a key and opening which-key (milliseconds) 254 + -- this setting is independent of vim.opt.timeoutlen 255 + delay = 0, 256 + icons = { 257 + -- set icon mappings to true if you have a Nerd Font 258 + mappings = vim.g.have_nerd_font, 259 + -- If you are using a Nerd Font: set icons.keys to an empty table which will use the 260 + -- default which-key.nvim defined Nerd Font icons, otherwise define a string table 261 + keys = vim.g.have_nerd_font and {} or { 262 + Up = "<Up> ", 263 + Down = "<Down> ", 264 + Left = "<Left> ", 265 + Right = "<Right> ", 266 + C = "<C-…> ", 267 + M = "<M-…> ", 268 + D = "<D-…> ", 269 + S = "<S-…> ", 270 + CR = "<CR> ", 271 + Esc = "<Esc> ", 272 + ScrollWheelDown = "<ScrollWheelDown> ", 273 + ScrollWheelUp = "<ScrollWheelUp> ", 274 + NL = "<NL> ", 275 + BS = "<BS> ", 276 + Space = "<Space> ", 277 + Tab = "<Tab> ", 278 + F1 = "<F1>", 279 + F2 = "<F2>", 280 + F3 = "<F3>", 281 + F4 = "<F4>", 282 + F5 = "<F5>", 283 + F6 = "<F6>", 284 + F7 = "<F7>", 285 + F8 = "<F8>", 286 + F9 = "<F9>", 287 + F10 = "<F10>", 288 + F11 = "<F11>", 289 + F12 = "<F12>", 290 + }, 291 + }, 292 + }, 293 + }, 294 + 295 + -- NOTE: Plugins can specify dependencies. 296 + -- 297 + -- The dependencies are proper plugin specifications as well - anything 298 + -- you do for a plugin at the top level, you can do for a dependency. 299 + -- 300 + -- Use the `dependencies` key to specify the dependencies of a particular plugin 301 + 302 + -- LSP Plugins 303 + { 304 + -- `lazydev` configures Lua LSP for your Neovim config, runtime and plugins 305 + -- used for completion, annotations and signatures of Neovim apis 306 + "folke/lazydev.nvim", 307 + ft = "lua", 308 + opts = { 309 + library = { 310 + -- Load luvit types when the `vim.uv` word is found 311 + { path = "${3rd}/luv/library", words = { "vim%.uv" } }, 312 + }, 313 + }, 314 + }, 315 + { 316 + -- Main LSP Configuration 317 + "neovim/nvim-lspconfig", 318 + dependencies = { 319 + -- Automatically install LSPs and related tools to stdpath for Neovim 320 + -- Mason must be loaded before its dependents so we need to set it up here. 321 + -- NOTE: `opts = {}` is the same as calling `require('mason').setup({})` 322 + { "mason-org/mason.nvim", opts = {} }, 323 + "mason-org/mason-lspconfig.nvim", 324 + "WhoIsSethDaniel/mason-tool-installer.nvim", 325 + }, 326 + config = function() 327 + -- Brief aside: **What is LSP?** 328 + -- 329 + -- LSP is an initialism you've probably heard, but might not understand what it is. 330 + -- 331 + -- LSP stands for Language Server Protocol. It's a protocol that helps editors 332 + -- and language tooling communicate in a standardized fashion. 333 + -- 334 + -- In general, you have a "server" which is some tool built to understand a particular 335 + -- language (such as `gopls`, `lua_ls`, `rust_analyzer`, etc.). These Language Servers 336 + -- (sometimes called LSP servers, but that's kind of like ATM Machine) are standalone 337 + -- processes that communicate with some "client" - in this case, Neovim! 338 + -- 339 + -- LSP provides Neovim with features like: 340 + -- - Go to definition 341 + -- - Find references 342 + -- - Autocompletion 343 + -- - Symbol Search 344 + -- - and more! 345 + -- 346 + -- Thus, Language Servers are external tools that must be installed separately from 347 + -- Neovim. This is where `mason` and related plugins come into play. 348 + -- 349 + -- If you're wondering about lsp vs treesitter, you can check out the wonderfully 350 + -- and elegantly composed help section, `:help lsp-vs-treesitter` 351 + 352 + -- This function gets run when an LSP attaches to a particular buffer. 353 + -- That is to say, every time a new file is opened that is associated with 354 + -- an lsp (for example, opening `main.rs` is associated with `rust_analyzer`) this 355 + -- function will be executed to configure the current buffer 356 + vim.api.nvim_create_autocmd("LspAttach", { 357 + group = vim.api.nvim_create_augroup("kickstart-lsp-attach", { clear = true }), 358 + callback = function(event) 359 + -- NOTE: Remember that Lua is a real programming language, and as such it is possible 360 + -- to define small helper and utility functions so you don't have to repeat yourself. 361 + -- 362 + -- In this case, we create a function that lets us more easily define mappings specific 363 + -- for LSP related items. It sets the mode, buffer and description for us each time. 364 + local map = function(keys, func, desc, mode) 365 + mode = mode or "n" 366 + vim.keymap.set(mode, keys, func, { buffer = event.buf, desc = "LSP: " .. desc }) 367 + end 368 + 369 + -- Rename the variable under your cursor. 370 + -- Most Language Servers support renaming across files, etc. 371 + map("<leader>r", vim.lsp.buf.rename, "[R]ename") 372 + 373 + -- Execute a code action, usually your cursor needs to be on top of an error 374 + -- or a suggestion from your LSP for this to activate. 375 + map("<leader>C", vim.lsp.buf.code_action, "[C]ode Action", { "n", "x" }) 376 + 377 + -- The following two autocommands are used to highlight references of the 378 + -- word under your cursor when your cursor rests there for a little while. 379 + -- See `:help CursorHold` for information about when this is executed 380 + -- 381 + -- When you move your cursor, the highlights will be cleared (the second autocommand). 382 + local client = vim.lsp.get_client_by_id(event.data.client_id) 383 + if client and client:supports_method(vim.lsp.protocol.Methods.textDocument_documentHighlight) then 384 + local highlight_augroup = 385 + vim.api.nvim_create_augroup("kickstart-lsp-highlight", { clear = false }) 386 + vim.api.nvim_create_autocmd({ "CursorHold", "CursorHoldI" }, { 387 + buffer = event.buf, 388 + group = highlight_augroup, 389 + callback = vim.lsp.buf.document_highlight, 390 + }) 391 + 392 + vim.api.nvim_create_autocmd({ "CursorMoved", "CursorMovedI" }, { 393 + buffer = event.buf, 394 + group = highlight_augroup, 395 + callback = vim.lsp.buf.clear_references, 396 + }) 397 + 398 + vim.api.nvim_create_autocmd("LspDetach", { 399 + group = vim.api.nvim_create_augroup("kickstart-lsp-detach", { clear = true }), 400 + callback = function(event2) 401 + vim.lsp.buf.clear_references() 402 + vim.api.nvim_clear_autocmds({ group = "kickstart-lsp-highlight", buffer = event2.buf }) 403 + end, 404 + }) 405 + end 406 + 407 + -- The following code creates a keymap to toggle inlay hints in your 408 + -- code, if the language server you are using supports them 409 + -- 410 + -- This may be unwanted, since they displace some of your code 411 + if client and client:supports_method(vim.lsp.protocol.Methods.textDocument_inlayHint) then 412 + map("<leader>th", function() 413 + vim.lsp.inlay_hint.enable(not vim.lsp.inlay_hint.is_enabled({ bufnr = event.buf })) 414 + end, "[T]oggle Inlay [H]ints") 415 + end 416 + end, 417 + }) 418 + 419 + -- Change diagnostic symbols in the sign column (gutter) 420 + if vim.g.have_nerd_font then 421 + local signs = { ERROR = "", WARN = "", INFO = "", HINT = "" } 422 + local diagnostic_signs = {} 423 + for type, icon in pairs(signs) do 424 + diagnostic_signs[vim.diagnostic.severity[type]] = icon 425 + end 426 + vim.diagnostic.config({ signs = { text = diagnostic_signs } }) 427 + end 428 + 429 + local capabilities = vim.lsp.protocol.make_client_capabilities() 430 + 431 + local function get_python_path(workspace) 432 + -- Check for uv first 433 + local uv_python = 434 + vim.fn.system("cd " .. workspace .. " && uv run which python 2>/dev/null"):gsub("\n", "") 435 + if vim.v.shell_error == 0 and uv_python ~= "" then 436 + return uv_python 437 + end 438 + 439 + -- Fallback to standard virtual environments 440 + local venv_paths = { 441 + workspace .. "/.venv/bin/python", 442 + workspace .. "/venv/bin/python", 443 + workspace .. "/.virtualenv/bin/python", 444 + } 445 + 446 + for _, path in ipairs(venv_paths) do 447 + if vim.fn.filereadable(path) == 1 then 448 + return path 449 + end 450 + end 451 + 452 + -- Final fallback to system python 453 + return vim.fn.exepath("python3") or vim.fn.exepath("python") or "python" 454 + end 455 + 456 + -- Enable the following language servers 457 + -- Feel free to add/remove any LSPs that you want here. They will automatically be installed. 458 + -- 459 + -- Add any additional override configuration in the following tables. Available keys are: 460 + -- - cmd (table): Override the default command used to start the server 461 + -- - filetypes (table): Override the default list of associated filetypes for the server 462 + -- - capabilities (table): Override fields in capabilities. Can be used to disable certain LSP features. 463 + -- - settings (table): Override the default settings passed when initializing the server. 464 + -- For example, to see the options for `lua_ls`, you could go to: https://luals.github.io/wiki/settings/ 465 + local servers = { 466 + bashls = {}, 467 + docker_compose_language_service = {}, 468 + -- gopls = {}, 469 + marksman = {}, 470 + vtsls = {}, 471 + tailwindcss = {}, 472 + lua_ls = { 473 + -- cmd = { ... }, 474 + -- filetypes = { ... }, 475 + -- capabilities = {}, 476 + settings = { 477 + Lua = { 478 + completion = { 479 + callSnippet = "Replace", 480 + }, 481 + -- You can toggle below to ignore Lua_LS's noisy `missing-fields` warnings 482 + diagnostics = { disable = { "missing-fields" } }, 483 + }, 484 + }, 485 + }, 486 + ruff = { 487 + init_options = { 488 + settings = { 489 + configurationPreference = "filesystemFirst", 490 + fixAll = true, 491 + organizeImports = true, 492 + workspaceSettings = { 493 + lineLength = 120, 494 + targetVersion = "py311", 495 + }, 496 + }, 497 + }, 498 + on_attach = function(client, bufnr) 499 + client.server_capabilities.hoverProvider = false 500 + 501 + vim.api.nvim_create_autocmd("BufWritePre", { 502 + buffer = bufnr, 503 + callback = function() 504 + vim.lsp.buf.format({ async = false }) 505 + end, 506 + }) 507 + end, 508 + }, 509 + pyright = { 510 + before_init = function(_, config) 511 + config.settings.python = vim.tbl_deep_extend("force", config.settings.python or {}, { 512 + pythonPath = get_python_path(config.root_dir), 513 + }) 514 + end, 515 + settings = { 516 + python = { 517 + analysis = { 518 + typeCheckingMode = "strict", 519 + diagnosticMode = "workspace", 520 + useLibraryCodeForTypes = true, 521 + autoSearchPaths = true, 522 + autoImportCompletions = true, 523 + diagnosticSeverityOverrides = { 524 + reportMissingTypeStubs = "none", 525 + reportGeneralTypeIssues = "warning", 526 + reportOptionalMemberAccess = "none", 527 + }, 528 + stubPath = "typings", 529 + ignore = { "**/node_modules", "**/__pycache__", "**/venv", "**/.venv" }, 530 + }, 531 + linting = { 532 + enabled = false, 533 + }, 534 + }, 535 + }, 536 + on_attach = function(client, bufnr) 537 + -- Disable formatting capabilities for Pyright (let ruff handle it) 538 + client.server_capabilities.documentFormattingProvider = false 539 + client.server_capabilities.documentRangeFormattingProvider = false 540 + end, 541 + }, 542 + } 543 + 544 + for server, config in pairs(servers) do 545 + vim.lsp.config(server, config) 546 + end 547 + 548 + -- Ensure the servers and tools above are installed 549 + -- 550 + -- To check the current status of installed tools and/or manually install 551 + -- other tools, you can run 552 + -- :Mason 553 + -- 554 + -- You can press `g?` for help in this menu. 555 + -- 556 + -- `mason` had to be setup earlier: to configure its options see the 557 + -- `dependencies` table for `nvim-lspconfig` above. 558 + -- 559 + -- You can add other tools here that you want Mason to install 560 + -- for you, so that they are available from within Neovim. 561 + local ensure_installed = vim.tbl_keys(servers or {}) 562 + vim.list_extend(ensure_installed, { 563 + "stylua", -- Used to format Lua code 564 + "eslint_d", 565 + "hadolint", 566 + "beautysh", 567 + "goimports", 568 + -- "golines", 569 + "gomodifytags", 570 + "prettier", 571 + "prettierd", 572 + "reorder-python-imports", 573 + "htmlhint", 574 + "pyright", 575 + "ruff", 576 + }) 577 + require("mason-tool-installer").setup({ ensure_installed = ensure_installed }) 578 + 579 + require("mason-lspconfig").setup({ 580 + ensure_installed = {}, 581 + automatic_enable = true, 582 + automatic_installation = false, 583 + handlers = { 584 + function(server_name) 585 + local server = servers[server_name] or {} 586 + -- This handles overriding only values explicitly passed 587 + -- by the server configuration above. Useful when disabling 588 + -- certain features of an LSP (for example, turning off formatting for ts_ls) 589 + server.capabilities = vim.tbl_deep_extend("force", {}, capabilities, server.capabilities or {}) 590 + require("lspconfig")[server_name].setup(server) 591 + end, 592 + }, 593 + }) 594 + end, 595 + }, 596 + 597 + { -- Autoformat 598 + "stevearc/conform.nvim", 599 + event = { "BufWritePre" }, 600 + cmd = { "ConformInfo" }, 601 + keys = { 602 + { 603 + "<leader>F", 604 + function() 605 + require("conform").format({ async = true, lsp_format = "fallback" }) 606 + end, 607 + mode = "", 608 + desc = "[F]ormat buffer", 609 + }, 610 + }, 611 + opts = { 612 + notify_on_error = false, 613 + format_on_save = function(bufnr) 614 + -- Disable "format_on_save lsp_fallback" for languages that don't 615 + -- have a well standardized coding style. You can add additional 616 + -- languages here or re-enable it for the disabled ones. 617 + local disable_filetypes = { c = true, cpp = true } 618 + local lsp_format_opt 619 + if disable_filetypes[vim.bo[bufnr].filetype] then 620 + lsp_format_opt = "never" 621 + else 622 + lsp_format_opt = "fallback" 623 + end 624 + return { 625 + timeout_ms = 500, 626 + lsp_format = lsp_format_opt, 627 + } 628 + end, 629 + formatters_by_ft = { 630 + lua = { "stylua" }, 631 + -- Conform can also run multiple formatters sequentially 632 + -- python = { "isort", "black" }, 633 + -- 634 + -- You can use 'stop_after_first' to run the first available formatter from the list 635 + javascript = { "prettierd" }, 636 + javascriptreact = { "prettierd" }, 637 + json = { "prettierd" }, 638 + jsonc = { "prettierd" }, 639 + css = { "prettierd" }, 640 + html = { "prettierd" }, 641 + typescript = { "prettierd" }, 642 + typescriptreact = { "prettierd" }, 643 + go = { "goimports" }, 644 + }, 645 + }, 646 + }, 647 + 648 + { 649 + "ellisonleao/gruvbox.nvim", 650 + priority = 1000, 651 + config = true, 652 + opts = { 653 + transparent_mode = true, 654 + palette_overrides = { 655 + dark2 = "#665d58", 656 + }, 657 + }, 658 + init = function() 659 + vim.cmd.colorscheme("gruvbox") 660 + end, 661 + }, 662 + 663 + -- Highlight todo, notes, etc in comments 664 + { 665 + "folke/todo-comments.nvim", 666 + event = "VimEnter", 667 + dependencies = { "nvim-lua/plenary.nvim" }, 668 + opts = { signs = false }, 669 + }, 670 + 671 + { 672 + "pwntester/octo.nvim", 673 + dependencies = { "nvim-lua/plenary.nvim", "folke/snacks.nvim", "nvim-tree/nvim-web-devicons" }, 674 + opts = { 675 + picker = "snacks", 676 + default_remote = { "origin" }, 677 + default_merge_method = "commit", 678 + default_delete_branch = false, 679 + issues = { 680 + order_by = { 681 + field = "CREATED_AT", 682 + direction = "DESC", 683 + }, 684 + }, 685 + reviews = { 686 + auto_show_threads = true, 687 + focues = "right", 688 + }, 689 + pull_requests = { 690 + order_by = { 691 + field = "UPDATED_AT", 692 + direction = "DESC", 693 + }, 694 + always_select_remote_on_create = false, 695 + use_branch_name_as_title = false, 696 + }, 697 + }, 698 + }, 699 + 700 + { -- Collection of various small independent plugins/modules 701 + "echasnovski/mini.nvim", 702 + config = function() 703 + -- Better Around/Inside textobjects 704 + -- 705 + -- Examples: 706 + -- - va) - [V]isually select [A]round [)]paren 707 + -- - yinq - [Y]ank [I]nside [N]ext [Q]uote 708 + -- - ci' - [C]hange [I]nside [']quote 709 + require("mini.ai").setup({ n_lines = 500 }) 710 + 711 + -- Add/delete/replace surroundings (brackets, quotes, etc.) 712 + -- 713 + -- - saiw) - [S]urround [A]dd [I]nner [W]ord [)]Paren 714 + -- - sd' - [S]urround [D]elete [']quotes 715 + -- - sr)' - [S]urround [R]eplace [)] ['] 716 + require("mini.surround").setup() 717 + 718 + -- Simple and easy statusline. 719 + -- You could remove this setup call if you don't like it, 720 + -- and try some other statusline plugin 721 + local statusline = require("mini.statusline") 722 + -- Status line content configuration 723 + local content = function() 724 + local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 }) 725 + local git = MiniStatusline.section_git({ trunc_width = 40 }) 726 + local diff = MiniStatusline.section_diff({ trunc_width = 75 }) 727 + local diagnostics = statusline.section_diagnostics({ 728 + trunc_width = 75, 729 + signs = { 730 + ERROR = "󰅚 ", 731 + WARN = "󰀪 ", 732 + INFO = "󰋽 ", 733 + HINT = "󰌶 ", 734 + }, 735 + }) 736 + local lsp = MiniStatusline.section_lsp({ trunc_width = 75 }) 737 + local filename = MiniStatusline.section_filename({ trunc_width = 140 }) 738 + local fileinfo = MiniStatusline.section_fileinfo({ trunc_width = 120 }) 739 + local location = MiniStatusline.section_location({ trunc_width = 75 }) 740 + local search = MiniStatusline.section_searchcount({ trunc_width = 75 }) 741 + 742 + return MiniStatusline.combine_groups({ 743 + { hl = mode_hl, strings = { mode } }, 744 + { hl = "MiniStatuslineDevinfo", strings = { git, diff, diagnostics, lsp } }, 745 + "%<", -- Mark general truncate point 746 + { hl = "MiniStatuslineFilename", strings = { filename } }, 747 + "%=", -- End left alignment 748 + { hl = "MiniStatuslineFileinfo", strings = { fileinfo } }, 749 + { hl = mode_hl, strings = { search, location } }, 750 + }) 751 + end 752 + -- set use_icons to true if you have a Nerd Font 753 + statusline.setup({ use_icons = vim.g.have_nerd_font, content = { active = content } }) 754 + 755 + -- You can configure sections in the statusline by overriding their 756 + -- default behavior. For example, here we set the section for 757 + -- cursor location to LINE:COLUMN 758 + ---@diagnostic disable-next-line: duplicate-set-field 759 + statusline.section_location = function() 760 + return "%2l:%-2v" 761 + end 762 + 763 + -- ... and there is more! 764 + -- Check out: https://github.com/echasnovski/mini.nvim 765 + end, 766 + }, 767 + { -- Highlight, edit, and navigate code 768 + "nvim-treesitter/nvim-treesitter", 769 + build = ":TSUpdate", 770 + main = "nvim-treesitter.configs", -- Sets main module to use for opts 771 + -- [[ Configure Treesitter ]] See `:help nvim-treesitter` 772 + opts = { 773 + ensure_installed = { 774 + "bash", 775 + "c", 776 + "diff", 777 + "html", 778 + "lua", 779 + "luadoc", 780 + "markdown", 781 + "markdown_inline", 782 + "regex", 783 + "query", 784 + "vim", 785 + "vimdoc", 786 + }, 787 + -- Autoinstall languages that are not installed 788 + auto_install = true, 789 + highlight = { 790 + enable = true, 791 + -- Some languages depend on vim's regex highlighting system (such as Ruby) for indent rules. 792 + -- If you are experiencing weird indenting issues, add the language to 793 + -- the list of additional_vim_regex_highlighting and disabled languages for indent. 794 + additional_vim_regex_highlighting = { "ruby" }, 795 + }, 796 + indent = { enable = true, disable = { "ruby" } }, 797 + }, 798 + -- There are additional nvim-treesitter modules that you can use to interact 799 + -- with nvim-treesitter. You should go explore a few and see what interests you: 800 + -- 801 + -- - Incremental selection: Included, see `:help nvim-treesitter-incremental-selection-mod` 802 + -- - Show your current context: https://github.com/nvim-treesitter/nvim-treesitter-context 803 + -- - Treesitter + textobjects: https://github.com/nvim-treesitter/nvim-treesitter-textobjects 804 + }, 805 + 806 + -- The following comments only work if you have downloaded the kickstart repo, not just copy pasted the 807 + -- init.lua. If you want these files, they are in the repository, so you can just download them and 808 + -- place them in the correct locations. 809 + 810 + -- NOTE: Next step on your Neovim journey: Add/Configure additional plugins for Kickstart 811 + -- 812 + -- Here are some example plugins that I've included in the Kickstart repository. 813 + -- Uncomment any of the lines below to enable them (you will need to restart nvim). 814 + -- 815 + -- require 'kickstart.plugins.debug', 816 + -- require("kickstart.plugins.indent_line"), 817 + require("kickstart.plugins.lint"), 818 + require("kickstart.plugins.autopairs"), 819 + -- require("kickstart.plugins.neo-tree"), 820 + require("kickstart.plugins.gitsigns"), -- adds gitsigns recommend keymaps 821 + 822 + { 823 + "saghen/blink.cmp", 824 + version = "*", 825 + ---@module 'blink.cmp' 826 + ---@type blink.cmp.Config 827 + opts = { 828 + keymap = { preset = "enter" }, 829 + appearance = { 830 + use_nvim_cmp_as_default = true, 831 + nerd_font_variant = "mono", 832 + }, 833 + sources = { 834 + default = { "lsp", "path" }, 835 + }, 836 + fuzzy = { implementation = "prefer_rust_with_warning" }, 837 + completion = { 838 + documentation = { 839 + auto_show = true, 840 + }, 841 + }, 842 + }, 843 + opts_extend = { "sources.default" }, 844 + }, 845 + 846 + { 847 + "ray-x/lsp_signature.nvim", 848 + config = function() 849 + require("lsp_signature").setup({}) 850 + end, 851 + }, 852 + 853 + { 854 + "rachartier/tiny-inline-diagnostic.nvim", 855 + event = "VeryLazy", -- Or `LspAttach` 856 + priority = 1000, -- needs to be loaded in first 857 + config = function() 858 + require("tiny-inline-diagnostic").setup({ 859 + options = { 860 + multilines = { 861 + enabled = true, 862 + always_show = true, 863 + }, 864 + }, 865 + }) 866 + vim.diagnostic.config({ virtual_text = false }) -- Only if needed in your configuration, if you already have native LSP diagnostics 867 + end, 868 + }, 869 + 870 + { 871 + "OXY2DEV/markview.nvim", 872 + lazy = false, 873 + priority = 49, 874 + }, 875 + 876 + { 877 + "sindrets/diffview.nvim", 878 + dependencies = { "nvim-tree/nvim-web-devicons" }, 879 + config = function() 880 + local diffview = require("diffview") 881 + vim.keymap.set("n", "<leader>gd", diffview.open, { desc = "[G]it [D]iff" }) 882 + vim.keymap.set("n", "<leader>gh", diffview.file_history, { desc = "[G]it [H]istory" }) 883 + vim.keymap.set("n", "<leader>gc", diffview.close, { desc = "[G]it [C]lose" }) 884 + end, 885 + }, 886 + 887 + { 888 + "zgs225/gomodifytags.nvim", 889 + cmd = { "GoAddTags", "GoRemoveTags", "GoInstallModifyTagsBin" }, 890 + dependencies = { 891 + "nvim-treesitter/nvim-treesitter", 892 + }, 893 + config = function() 894 + require("gomodifytags").setup({}) -- Optional: You can add any specific configuration here if needed. 895 + end, 896 + }, 897 + 898 + { "akinsho/bufferline.nvim", version = "*", dependencies = "nvim-tree/nvim-web-devicons", opts = {} }, 899 + 900 + { "windwp/nvim-ts-autotag", lazy = false, opts = {} }, 901 + 902 + { 903 + "folke/snacks.nvim", 904 + priority = 1000, 905 + lazy = false, 906 + ---@module "snacks" 907 + ---@type snacks.Config 908 + opts = { 909 + bigfile = { enabled = true }, 910 + dashboard = { 911 + enabled = true, 912 + sections = { 913 + { section = "header" }, 914 + { section = "keys", gap = 1, padding = 1 }, 915 + { section = "startup" }, 916 + { 917 + section = "terminal", 918 + cmd = "pokemon-colorscripts -r --no-title; sleep .1", 919 + random = 10, 920 + pane = 2, 921 + indent = 4, 922 + height = 30, 923 + }, 924 + }, 925 + }, 926 + explorer = { enabled = true }, 927 + indent = { enabled = true }, 928 + input = { enabled = true }, 929 + notifier = { 930 + enabled = true, 931 + timeout = 5000, 932 + }, 933 + picker = { enabled = true }, 934 + quickfile = { enabled = true }, 935 + scope = { enabled = true }, 936 + statuscolumn = { enabled = true }, 937 + words = { enabled = true }, 938 + }, 939 + -- stylua: ignore 940 + keys = { 941 + -- Top Pickers & Explorer 942 + { "<leader>fd", function() Snacks.picker.smart() end, desc = "Smart Find Files" }, 943 + { "<leader>,", function() Snacks.picker.buffers() end, desc = "Buffers" }, 944 + { "<leader>/", function() Snacks.picker.grep({need_search = false, live = false}) end, desc = "Grep" }, 945 + { "<leader>e", function() Snacks.explorer() end, desc = "File Explorer" }, 946 + { "\\", function() Snacks.explorer() end, desc = "File Explorer" }, 947 + -- find 948 + { "<leader><space>", function() Snacks.picker.buffers() end, desc = "Buffers" }, 949 + { "<leader>ff", function() Snacks.picker.files() end, desc = "Find Files" }, 950 + { "<leader>fp", function() Snacks.picker.projects() end, desc = "Projects" }, 951 + -- git 952 + { "<leader>gb", function() Snacks.picker.git_branches() end, desc = "Git Branches" }, 953 + { "<leader>gl", function() Snacks.picker.git_log() end, desc = "Git Log" }, 954 + { "<leader>gL", function() Snacks.picker.git_log_line() end, desc = "Git Log Line" }, 955 + { "<leader>gS", function() Snacks.picker.git_stash() end, desc = "Git Stash" }, 956 + -- { "<leader>gd", function() Snacks.picker.git_diff() end, desc = "Git Diff (Hunks)" }, 957 + { "<leader>gf", function() Snacks.picker.git_log_file() end, desc = "Git Log File" }, 958 + -- Grep 959 + { "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" }, 960 + { "<leader>sB", function() Snacks.picker.grep_buffers() end, desc = "Grep Open Buffers" }, 961 + { "<leader>sg", function() Snacks.picker.grep({need_search = false, live = false}) end, desc = "Grep" }, 962 + { "<leader>sw", function() Snacks.picker.grep_word() end, desc = "Visual selection or word", mode = { "n", "x" } }, 963 + -- search 964 + { "<leader>s/", function() Snacks.picker.search_history() end, desc = "Search History" }, 965 + { "<leader>sa", function() Snacks.picker.autocmds() end, desc = "Autocmds" }, 966 + { "<leader>sb", function() Snacks.picker.lines() end, desc = "Buffer Lines" }, 967 + { "<leader>sC", function() Snacks.picker.commands() end, desc = "Commands" }, 968 + { "<leader>sd", function() Snacks.picker.diagnostics() end, desc = "Diagnostics" }, 969 + { "<leader>sD", function() Snacks.picker.diagnostics_buffer() end, desc = "Buffer Diagnostics" }, 970 + { "<leader>sh", function() Snacks.picker.help() end, desc = "Help Pages" }, 971 + { "<leader>sH", function() Snacks.picker.highlights() end, desc = "Highlights" }, 972 + { "<leader>su", function() Snacks.picker.undo() end, desc = "Undo History" }, 973 + -- LSP 974 + { "gd", function() Snacks.picker.lsp_definitions() end, desc = "Goto Definition" }, 975 + { "gD", function() Snacks.picker.lsp_declarations() end, desc = "Goto Declaration" }, 976 + { "gr", function() Snacks.picker.lsp_references() end, nowait = true, desc = "References" }, 977 + { "gI", function() Snacks.picker.lsp_implementations() end, desc = "Goto Implementation" }, 978 + { "gy", function() Snacks.picker.lsp_type_definitions() end, desc = "Goto T[y]pe Definition" }, 979 + { "<leader>ss", function() Snacks.picker.lsp_symbols() end, desc = "LSP Symbols" }, 980 + { "<leader>sS", function() Snacks.picker.lsp_workspace_symbols() end, desc = "LSP Workspace Symbols" }, 981 + -- Other 982 + { "<leader>gB", function() Snacks.gitbrowse() end, desc = "Git Browse", mode = { "n", "v" } }, 983 + { "<c-/>", function() Snacks.terminal() end, desc = "Toggle Terminal" }, 984 + { "]]", function() Snacks.words.jump(vim.v.count1) end, desc = "Next Reference", mode = { "n", "t" } }, 985 + { "[[", function() Snacks.words.jump(-vim.v.count1) end, desc = "Prev Reference", mode = { "n", "t" } }, 986 + }, 987 + }, 988 + 989 + -- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` 990 + -- This is the easiest way to modularize your config. 991 + -- 992 + -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. 993 + -- { import = 'custom.plugins' }, 994 + }, { 995 + ui = { 996 + -- If you are using a Nerd Font: set icons to an empty table which will use the 997 + -- default lazy.nvim defined Nerd Font icons, otherwise define a unicode icons table 998 + icons = vim.g.have_nerd_font and {} or { 999 + cmd = "⌘", 1000 + config = "🛠", 1001 + event = "📅", 1002 + ft = "📂", 1003 + init = "⚙", 1004 + keys = "🗝", 1005 + plugin = "🔌", 1006 + runtime = "💻", 1007 + require = "🌙", 1008 + source = "📄", 1009 + start = "🚀", 1010 + task = "📌", 1011 + lazy = "💤 ", 1012 + }, 1013 + }, 1014 + }) 1015 + 1016 + vim.api.nvim_create_autocmd({ "BufEnter", "BufRead", "BufNewFile" }, { 1017 + pattern = "*.py", 1018 + callback = function() 1019 + local root_dir = vim.fn.getcwd() 1020 + 1021 + local uv_python = vim.fn.system("cd " .. root_dir .. " && uv run which python 2>/dev/null"):gsub("\n", "") 1022 + 1023 + if vim.v.shell_error == 0 and uv_python ~= "" then 1024 + local venv_path = uv_python:match("(.*/%.venv)") 1025 + if venv_path then 1026 + vim.env.VIRTUAL_ENV = venv_path 1027 + vim.env.PATH = venv_path .. "/bin:" .. vim.env.PATH 1028 + vim.g.python3_host_prog = uv_python 1029 + end 1030 + else 1031 + local venv_paths = { 1032 + root_dir .. "/.venv", 1033 + root_dir .. "/venv", 1034 + root_dir .. "/.virtualenv", 1035 + } 1036 + 1037 + for _, venv in ipairs(venv_paths) do 1038 + if vim.fn.isdirectory(venv) == 1 then 1039 + vim.env.VIRTUAL_ENV = venv 1040 + vim.env.PATH = venv .. "/bin:" .. vim.env.PATH 1041 + vim.g.python3_host_prog = venv .. "/bin/python" 1042 + break 1043 + end 1044 + end 1045 + end 1046 + end, 1047 + }) 1048 + 1049 + -- The line beneath this is called `modeline`. See `:help modeline` 1050 + -- vim: ts=2 sts=2 sw=2 et
+30
nvim/lazy-lock.json
··· 1 + { 2 + "blink.cmp": { "branch": "main", "commit": "327fff91fe6af358e990be7be1ec8b78037d2138" }, 3 + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, 4 + "conform.nvim": { "branch": "master", "commit": "b4aab989db276993ea5dcb78872be494ce546521" }, 5 + "diffview.nvim": { "branch": "main", "commit": "4516612fe98ff56ae0415a259ff6361a89419b0a" }, 6 + "gitsigns.nvim": { "branch": "main", "commit": "f780609807eca1f783a36a8a31c30a48fbe150c5" }, 7 + "gomodifytags.nvim": { "branch": "main", "commit": "60a9fa7c4a57a5965a3ddb4f5a53728edb38e942" }, 8 + "gruvbox.nvim": { "branch": "main", "commit": "5e0a460d8e0f7f669c158dedd5f9ae2bcac31437" }, 9 + "guess-indent.nvim": { "branch": "main", "commit": "84a4987ff36798c2fc1169cbaff67960aed9776f" }, 10 + "lazy.nvim": { "branch": "main", "commit": "6c3bda4aca61a13a9c63f1c1d1b16b9d3be90d7a" }, 11 + "lazydev.nvim": { "branch": "main", "commit": "258d2a5ef4a3e3d6d9ba9da72c9725c53e9afcbd" }, 12 + "lsp_signature.nvim": { "branch": "master", "commit": "2b30d8582126a12a493b737e9761969eb869a05b" }, 13 + "markview.nvim": { "branch": "main", "commit": "e6b0f5aee8105adab6077509c46459812db4cffa" }, 14 + "mason-lspconfig.nvim": { "branch": "main", "commit": "7f9a39fcd2ac6e979001f857727d606888f5909c" }, 15 + "mason-tool-installer.nvim": { "branch": "main", "commit": "517ef5994ef9d6b738322664d5fdd948f0fdeb46" }, 16 + "mason.nvim": { "branch": "main", "commit": "7dc4facca9702f95353d5a1f87daf23d78e31c2a" }, 17 + "mini.nvim": { "branch": "main", "commit": "80a11490e44a7fe8c911a3b4a827c56df3894058" }, 18 + "nvim-autopairs": { "branch": "master", "commit": "23320e75953ac82e559c610bec5a90d9c6dfa743" }, 19 + "nvim-lint": { "branch": "master", "commit": "0864f81c681e15d9bdc1156fe3a17bd07db5a3ed" }, 20 + "nvim-lspconfig": { "branch": "master", "commit": "1f7fbc34e6420476142b5cc85e9bee52717540fb" }, 21 + "nvim-treesitter": { "branch": "master", "commit": "42fc28ba918343ebfd5565147a42a26580579482" }, 22 + "nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" }, 23 + "nvim-web-devicons": { "branch": "master", "commit": "6e51ca170563330e063720449c21f43e27ca0bc1" }, 24 + "octo.nvim": { "branch": "master", "commit": "6dabe62fb6678804ad38fb0f060854a5d1d4a7ef" }, 25 + "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, 26 + "snacks.nvim": { "branch": "main", "commit": "d67a47739dfc652cfcf66c59e929c704a854b37a" }, 27 + "tiny-inline-diagnostic.nvim": { "branch": "main", "commit": "f64efd33a51ea89bdb847fb3aaf716e96b83ba1a" }, 28 + "todo-comments.nvim": { "branch": "main", "commit": "304a8d204ee787d2544d8bc23cd38d2f929e7cc5" }, 29 + "which-key.nvim": { "branch": "main", "commit": "370ec46f710e058c9c1646273e6b225acf47cbed" } 30 + }
+5
nvim/lua/custom/plugins/init.lua
··· 1 + -- You can add your own plugins here or in other files in this directory! 2 + -- I promise not to create any merge conflicts in this directory :) 3 + -- 4 + -- See the kickstart.nvim README for more information 5 + return {}
+52
nvim/lua/kickstart/health.lua
··· 1 + --[[ 2 + -- 3 + -- This file is not required for your own configuration, 4 + -- but helps people determine if their system is setup correctly. 5 + -- 6 + --]] 7 + 8 + local check_version = function() 9 + local verstr = tostring(vim.version()) 10 + if not vim.version.ge then 11 + vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) 12 + return 13 + end 14 + 15 + if vim.version.ge(vim.version(), '0.10-dev') then 16 + vim.health.ok(string.format("Neovim version is: '%s'", verstr)) 17 + else 18 + vim.health.error(string.format("Neovim out of date: '%s'. Upgrade to latest stable or nightly", verstr)) 19 + end 20 + end 21 + 22 + local check_external_reqs = function() 23 + -- Basic utils: `git`, `make`, `unzip` 24 + for _, exe in ipairs { 'git', 'make', 'unzip', 'rg' } do 25 + local is_executable = vim.fn.executable(exe) == 1 26 + if is_executable then 27 + vim.health.ok(string.format("Found executable: '%s'", exe)) 28 + else 29 + vim.health.warn(string.format("Could not find executable: '%s'", exe)) 30 + end 31 + end 32 + 33 + return true 34 + end 35 + 36 + return { 37 + check = function() 38 + vim.health.start 'kickstart.nvim' 39 + 40 + vim.health.info [[NOTE: Not every warning is a 'must-fix' in `:checkhealth` 41 + 42 + Fix only warnings for plugins and languages you intend to use. 43 + Mason will give warnings for languages that are not installed. 44 + You do not need to install, unless you want to use those languages!]] 45 + 46 + local uv = vim.uv or vim.loop 47 + vim.health.info('System Information: ' .. vim.inspect(uv.os_uname())) 48 + 49 + check_version() 50 + check_external_reqs() 51 + end, 52 + }
+8
nvim/lua/kickstart/plugins/autopairs.lua
··· 1 + -- autopairs 2 + -- https://github.com/windwp/nvim-autopairs 3 + 4 + return { 5 + "windwp/nvim-autopairs", 6 + event = "InsertEnter", 7 + config = true, 8 + }
+148
nvim/lua/kickstart/plugins/debug.lua
··· 1 + -- debug.lua 2 + -- 3 + -- Shows how to use the DAP plugin to debug your code. 4 + -- 5 + -- Primarily focused on configuring the debugger for Go, but can 6 + -- be extended to other languages as well. That's why it's called 7 + -- kickstart.nvim and not kitchen-sink.nvim ;) 8 + 9 + return { 10 + -- NOTE: Yes, you can install new plugins here! 11 + 'mfussenegger/nvim-dap', 12 + -- NOTE: And you can specify dependencies as well 13 + dependencies = { 14 + -- Creates a beautiful debugger UI 15 + 'rcarriga/nvim-dap-ui', 16 + 17 + -- Required dependency for nvim-dap-ui 18 + 'nvim-neotest/nvim-nio', 19 + 20 + -- Installs the debug adapters for you 21 + 'williamboman/mason.nvim', 22 + 'jay-babu/mason-nvim-dap.nvim', 23 + 24 + -- Add your own debuggers here 25 + 'leoluz/nvim-dap-go', 26 + }, 27 + keys = { 28 + -- Basic debugging keymaps, feel free to change to your liking! 29 + { 30 + '<F5>', 31 + function() 32 + require('dap').continue() 33 + end, 34 + desc = 'Debug: Start/Continue', 35 + }, 36 + { 37 + '<F1>', 38 + function() 39 + require('dap').step_into() 40 + end, 41 + desc = 'Debug: Step Into', 42 + }, 43 + { 44 + '<F2>', 45 + function() 46 + require('dap').step_over() 47 + end, 48 + desc = 'Debug: Step Over', 49 + }, 50 + { 51 + '<F3>', 52 + function() 53 + require('dap').step_out() 54 + end, 55 + desc = 'Debug: Step Out', 56 + }, 57 + { 58 + '<leader>b', 59 + function() 60 + require('dap').toggle_breakpoint() 61 + end, 62 + desc = 'Debug: Toggle Breakpoint', 63 + }, 64 + { 65 + '<leader>B', 66 + function() 67 + require('dap').set_breakpoint(vim.fn.input 'Breakpoint condition: ') 68 + end, 69 + desc = 'Debug: Set Breakpoint', 70 + }, 71 + -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception. 72 + { 73 + '<F7>', 74 + function() 75 + require('dapui').toggle() 76 + end, 77 + desc = 'Debug: See last session result.', 78 + }, 79 + }, 80 + config = function() 81 + local dap = require 'dap' 82 + local dapui = require 'dapui' 83 + 84 + require('mason-nvim-dap').setup { 85 + -- Makes a best effort to setup the various debuggers with 86 + -- reasonable debug configurations 87 + automatic_installation = true, 88 + 89 + -- You can provide additional configuration to the handlers, 90 + -- see mason-nvim-dap README for more information 91 + handlers = {}, 92 + 93 + -- You'll need to check that you have the required things installed 94 + -- online, please don't ask me how to install them :) 95 + ensure_installed = { 96 + -- Update this to ensure that you have the debuggers for the langs you want 97 + 'delve', 98 + }, 99 + } 100 + 101 + -- Dap UI setup 102 + -- For more information, see |:help nvim-dap-ui| 103 + dapui.setup { 104 + -- Set icons to characters that are more likely to work in every terminal. 105 + -- Feel free to remove or use ones that you like more! :) 106 + -- Don't feel like these are good choices. 107 + icons = { expanded = '▾', collapsed = '▸', current_frame = '*' }, 108 + controls = { 109 + icons = { 110 + pause = '⏸', 111 + play = '▶', 112 + step_into = '⏎', 113 + step_over = '⏭', 114 + step_out = '⏮', 115 + step_back = 'b', 116 + run_last = '▶▶', 117 + terminate = '⏹', 118 + disconnect = '⏏', 119 + }, 120 + }, 121 + } 122 + 123 + -- Change breakpoint icons 124 + -- vim.api.nvim_set_hl(0, 'DapBreak', { fg = '#e51400' }) 125 + -- vim.api.nvim_set_hl(0, 'DapStop', { fg = '#ffcc00' }) 126 + -- local breakpoint_icons = vim.g.have_nerd_font 127 + -- and { Breakpoint = '', BreakpointCondition = '', BreakpointRejected = '', LogPoint = '', Stopped = '' } 128 + -- or { Breakpoint = '●', BreakpointCondition = '⊜', BreakpointRejected = '⊘', LogPoint = '◆', Stopped = '⭔' } 129 + -- for type, icon in pairs(breakpoint_icons) do 130 + -- local tp = 'Dap' .. type 131 + -- local hl = (type == 'Stopped') and 'DapStop' or 'DapBreak' 132 + -- vim.fn.sign_define(tp, { text = icon, texthl = hl, numhl = hl }) 133 + -- end 134 + 135 + dap.listeners.after.event_initialized['dapui_config'] = dapui.open 136 + dap.listeners.before.event_terminated['dapui_config'] = dapui.close 137 + dap.listeners.before.event_exited['dapui_config'] = dapui.close 138 + 139 + -- Install golang specific config 140 + require('dap-go').setup { 141 + delve = { 142 + -- On Windows delve must be run attached or it crashes. 143 + -- See https://github.com/leoluz/nvim-dap-go/blob/main/README.md#configuring 144 + detached = vim.fn.has 'win32' == 0, 145 + }, 146 + } 147 + end, 148 + }
+61
nvim/lua/kickstart/plugins/gitsigns.lua
··· 1 + -- Adds git related signs to the gutter, as well as utilities for managing changes 2 + -- NOTE: gitsigns is already included in init.lua but contains only the base 3 + -- config. This will add also the recommended keymaps. 4 + 5 + return { 6 + { 7 + "lewis6991/gitsigns.nvim", 8 + opts = { 9 + on_attach = function(bufnr) 10 + local gitsigns = require("gitsigns") 11 + 12 + local function map(mode, l, r, opts) 13 + opts = opts or {} 14 + opts.buffer = bufnr 15 + vim.keymap.set(mode, l, r, opts) 16 + end 17 + 18 + -- Navigation 19 + map("n", "]c", function() 20 + if vim.wo.diff then 21 + vim.cmd.normal({ "]c", bang = true }) 22 + else 23 + gitsigns.nav_hunk("next") 24 + end 25 + end, { desc = "Jump to next git [c]hange" }) 26 + 27 + map("n", "[c", function() 28 + if vim.wo.diff then 29 + vim.cmd.normal({ "[c", bang = true }) 30 + else 31 + gitsigns.nav_hunk("prev") 32 + end 33 + end, { desc = "Jump to previous git [c]hange" }) 34 + 35 + -- Actions 36 + -- visual mode 37 + map("v", "<leader>hs", function() 38 + gitsigns.stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) 39 + end, { desc = "git [s]tage hunk" }) 40 + map("v", "<leader>hr", function() 41 + gitsigns.reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) 42 + end, { desc = "git [r]eset hunk" }) 43 + -- normal mode 44 + map("n", "<leader>hs", gitsigns.stage_hunk, { desc = "git [s]tage hunk" }) 45 + map("n", "<leader>hr", gitsigns.reset_hunk, { desc = "git [r]eset hunk" }) 46 + map("n", "<leader>hS", gitsigns.stage_buffer, { desc = "git [S]tage buffer" }) 47 + map("n", "<leader>hu", gitsigns.stage_hunk, { desc = "git [u]ndo stage hunk" }) 48 + map("n", "<leader>hR", gitsigns.reset_buffer, { desc = "git [R]eset buffer" }) 49 + map("n", "<leader>hp", gitsigns.preview_hunk, { desc = "git [p]review hunk" }) 50 + map("n", "<leader>hb", gitsigns.blame_line, { desc = "git [b]lame line" }) 51 + map("n", "<leader>hd", gitsigns.diffthis, { desc = "git [d]iff against index" }) 52 + map("n", "<leader>hD", function() 53 + gitsigns.diffthis("@") 54 + end, { desc = "git [D]iff against last commit" }) 55 + -- Toggles 56 + map("n", "<leader>tb", gitsigns.toggle_current_line_blame, { desc = "[T]oggle git show [b]lame line" }) 57 + map("n", "<leader>tD", gitsigns.preview_hunk_inline, { desc = "[T]oggle git show [D]eleted" }) 58 + end, 59 + }, 60 + }, 61 + }
+9
nvim/lua/kickstart/plugins/indent_line.lua
··· 1 + return { 2 + { -- Add indentation guides even on blank lines 3 + 'lukas-reineke/indent-blankline.nvim', 4 + -- Enable `lukas-reineke/indent-blankline.nvim` 5 + -- See `:help ibl` 6 + main = 'ibl', 7 + opts = {}, 8 + }, 9 + }
+56
nvim/lua/kickstart/plugins/lint.lua
··· 1 + return { 2 + 3 + { -- Linting 4 + "mfussenegger/nvim-lint", 5 + event = { "BufReadPre", "BufNewFile" }, 6 + config = function() 7 + local lint = require("lint") 8 + lint.linters_by_ft = { 9 + html = { "htmlhint" }, 10 + dockerfile = { "hadolint" }, 11 + } 12 + 13 + -- However, note that this will enable a set of default linters, 14 + -- which will cause errors unless these tools are available: 15 + -- { 16 + -- clojure = { "clj-kondo" }, 17 + -- dockerfile = { "hadolint" }, 18 + -- inko = { "inko" }, 19 + -- janet = { "janet" }, 20 + -- json = { "jsonlint" }, 21 + -- markdown = { "vale" }, 22 + -- rst = { "vale" }, 23 + -- ruby = { "ruby" }, 24 + -- terraform = { "tflint" }, 25 + -- text = { "vale" } 26 + -- } 27 + -- 28 + -- You can disable the default linters by setting their filetypes to nil: 29 + -- lint.linters_by_ft['clojure'] = nil 30 + -- lint.linters_by_ft['dockerfile'] = nil 31 + -- lint.linters_by_ft['inko'] = nil 32 + -- lint.linters_by_ft['janet'] = nil 33 + -- lint.linters_by_ft['json'] = nil 34 + -- lint.linters_by_ft['markdown'] = nil 35 + -- lint.linters_by_ft['rst'] = nil 36 + -- lint.linters_by_ft['ruby'] = nil 37 + -- lint.linters_by_ft['terraform'] = nil 38 + -- lint.linters_by_ft['text'] = nil 39 + 40 + -- Create autocommand which carries out the actual linting 41 + -- on the specified events. 42 + local lint_augroup = vim.api.nvim_create_augroup("lint", { clear = true }) 43 + vim.api.nvim_create_autocmd({ "BufEnter", "BufWritePost", "InsertLeave" }, { 44 + group = lint_augroup, 45 + callback = function() 46 + -- Only run the linter in buffers that you can modify in order to 47 + -- avoid superfluous noise, notably within the handy LSP pop-ups that 48 + -- describe the hovered symbol using Markdown. 49 + if vim.opt_local.modifiable:get() then 50 + lint.try_lint() 51 + end 52 + end, 53 + }) 54 + end, 55 + }, 56 + }
+25
nvim/lua/kickstart/plugins/neo-tree.lua
··· 1 + -- Neo-tree is a Neovim plugin to browse the file system 2 + -- https://github.com/nvim-neo-tree/neo-tree.nvim 3 + 4 + return { 5 + 'nvim-neo-tree/neo-tree.nvim', 6 + version = '*', 7 + dependencies = { 8 + 'nvim-lua/plenary.nvim', 9 + 'nvim-tree/nvim-web-devicons', -- not strictly required, but recommended 10 + 'MunifTanjim/nui.nvim', 11 + }, 12 + cmd = 'Neotree', 13 + keys = { 14 + { '\\', ':Neotree reveal<CR>', desc = 'NeoTree reveal', silent = true }, 15 + }, 16 + opts = { 17 + filesystem = { 18 + window = { 19 + mappings = { 20 + ['\\'] = 'close_window', 21 + }, 22 + }, 23 + }, 24 + }, 25 + }