└── README.md /README.md: -------------------------------------------------------------------------------- 1 | # :warning: Moved to [here](https://github.com/Bekaboo/dot/tree/master/.config/nvim) 2 | 3 | ## Neovim :: M Λ C R O 4 | 5 | [**Neovim :: M Λ C R O**](https://github.com/Bekaboo/nvim) is a collection of Neovim configuration files inspired 6 | by [Emacs / N Λ N O](https://github.com/rougier/nano-emacs). 7 | 8 | The goal of macro-neovim is to provide a clean and elegant user interface 9 | while remaining practical for daily tasks, striking a balance between a 10 | streamlined design and effective functionality. See [showcases](#showcases) to 11 | get a glimpse of the basic usage and what this configuration looks like. 12 | 13 | This is a highly personalized and opinionated Neovim configuration, not a 14 | distribution. While it's not meant for direct use, you're welcome to fork, 15 | experiment, and adapt it to your liking. Feel free to use it as a starting 16 | point for your configuration or borrow elements you find useful. Issues and PRs 17 | are welcome. 18 | 19 | Currently only supports Linux (X11/Wayland/TTY). 20 | 21 |
22 |    23 | 24 |
25 | 26 | ## Table of Contents 27 | 28 | 29 | - [Features](#features) 30 | - [Requirements and Dependencies](#requirements-and-dependencies) 31 | - [Basic](#basic) 32 | - [Tree-sitter](#tree-sitter) 33 | - [LSP](#lsp) 34 | - [DAP](#dap) 35 | - [Formatter](#formatter) 36 | - [Installation](#installation) 37 | - [Troubleshooting](#troubleshooting) 38 | - [Uninstallation](#uninstallation) 39 | - [Config Structure](#config-structure) 40 | - [Tweaking this Configuration](#tweaking-this-configuration) 41 | - [Managing Plugins with Modules](#managing-plugins-with-modules) 42 | - [Installing Packages to an Existing Module](#installing-packages-to-an-existing-module) 43 | - [Installing Packages to a New Module](#installing-packages-to-a-new-module) 44 | - [General Settings and Options](#general-settings-and-options) 45 | - [Environment Variables](#environment-variables) 46 | - [Keymaps](#keymaps) 47 | - [Colorschemes](#colorschemes) 48 | - [Auto Commands](#auto-commands) 49 | - [LSP Server Configurations](#lsp-server-configurations) 50 | - [DAP Configurations](#dap-configurations) 51 | - [Snippets](#snippets) 52 | - [Enabling VSCode Integration](#enabling-vscode-integration) 53 | - [Appendix](#appendix) 54 | - [Showcases](#showcases) 55 | - [Default Modules and Plugins of Choice](#default-modules-and-plugins-of-choice) 56 | - [Third Party Plugins](#third-party-plugins) 57 | - [Builtin Plugins](#builtin-plugins) 58 | - [Startuptime](#startuptime) 59 | 60 | 61 | ## Features 62 | 63 | - Modular design 64 | - Install and manage packages in groups 65 | - Make it easy to use different set of configuration for different use 66 | cases 67 | - Clean and uncluttered UI, including customized versions of: 68 | - [winbar](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/winbar) 69 | - [statusline](https://github.com/Bekaboo/nvim/blob/master/lua/plugin/statusline.lua) 70 | - [statuscolumn](https://github.com/Bekaboo/nvim/blob/master/lua/plugin/statuscolumn.lua) 71 | - [colorschemes](https://github.com/Bekaboo/nvim/tree/master/colors) 72 | - [intro message](https://github.com/Bekaboo/nvim/blob/master/plugin/intro.lua) 73 | - [VSCode-Neovim](https://github.com/vscode-neovim/vscode-neovim) integration, makes you feel at home in VSCode when you 74 | occasionally need it 75 | - Massive [TeX math snippets](https://github.com/Bekaboo/nvim/blob/master/lua/snippets/shared/math.lua) 76 | - Jupyter Notebook integration: edit notebooks like markdown files, run code in 77 | cells with simple commands and shortcuts 78 | - [Fine-tuned plugins](https://github.com/Bekaboo/nvim/tree/master/lua/configs) with [custom patches](https://github.com/Bekaboo/nvim/tree/master/patches) 79 | - Optimization for large files, open any file larger than 100 MB and edit like 80 | butter 81 | - Fast startup around [~25 ms](#startuptime) 82 | 83 | ## Requirements and Dependencies 84 | 85 | ### Basic 86 | 87 | - [Neovim](https://github.com/neovim/neovim) 0.10, for exact version see [nvim-version.txt](https://github.com/Bekaboo/nvim/blob/master/nvim-version.txt) 88 | - [Git](https://git-scm.com/) 89 | - [GCC](https://gcc.gnu.org/) or [Clang](https://clang.llvm.org/) for building treesitter parsers and some libs 90 | - [Fd](https://github.com/sharkdp/fd), [Ripgrep](https://github.com/BurntSushi/ripgrep), and [Fzf](https://github.com/junegunn/fzf) for fuzzy search 91 | - [Pandoc](https://pandoc.org/), [custom scripts](https://github.com/Bekaboo/dot/tree/master/.scripts) and [TexLive](https://www.tug.org/texlive/) (for ArchLinux users, it is `texlive-core` and `texlive-extra`) for markdown → PDF conversion (`:MarkdownToPDF`) 92 | - [Node.js](https://nodejs.org/en) for installing dependencies for [markdown-preview.nvim](https://github.com/iamcco/markdown-preview.nvim) 93 | - [Pynvim](https://github.com/neovim/pynvim), [Jupyter Client](https://github.com/jupyter/jupyter_client), and [IPython Kernel](https://github.com/ipython/ipykernel) for Python support 94 | - [Jupytext](https://github.com/mwouts/jupytext) for editing Jupyter notebooks 95 | - A decent terminal emulator 96 | - A nerd font, e.g. [JetbrainsMono Nerd Font](https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/JetBrainsMono). 97 | This is optional as nerd icons are disabled by default, to enable it, set the 98 | environment variable `$NVIM_NF`, see [environment variables](#environment-variables) 99 | 100 | ### Tree-sitter 101 | 102 | Tree-sitter installation and configuration are handled by [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter). 103 | 104 | Requires a C compiler, e.g. [GCC](https://gcc.gnu.org/) or [Clang](https://clang.llvm.org/), for building parsers. 105 | 106 | To add or remove support for a language, install or uninstall the corresponding 107 | parser using `:TSInstall` or `:TSUninstall`. 108 | 109 | To make the change permanent, add or remove corresponding parsers in the 110 | `ensure_installed` field in the call to nvim-treesitter's `setup()` function, 111 | see [lua/configs/nvim-treesitter.lua](https://github.com/Bekaboo/nvim/blob/master/lua/configs/nvim-treesitter.lua). 112 | 113 | ### LSP 114 | 115 | For LSP support, install the following language servers manually using your 116 | favorite package manager: 117 | 118 | - Bash: [BashLS](https://github.com/bash-lsp/bash-language-server) 119 | 120 | Example for ArchLinux users: 121 | 122 | ```sh 123 | sudo pacman -S bash-language-server 124 | ``` 125 | 126 | - C/C++: [Clang](https://clang.llvm.org/) 127 | - Lua: [LuaLS](https://github.com/LuaLS/lua-language-server) 128 | - Python: one of 129 | - [Jedi Language Server](https://github.com/pappasam/jedi-language-server) 130 | - [Python LSP Server](https://github.com/python-lsp/python-lsp-server) 131 | - [Pyright](https://github.com/microsoft/pyright) 132 | - Rust: [Rust Analyzer](https://rust-analyzer.github.io/) 133 | - LaTeX: [TexLab](https://github.com/latex-lsp/texlab) 134 | - VimL: [VimLS](https://github.com/iamcco/vim-language-server) 135 | - Markdown: [Marksman](https://github.com/artempyanykh/marksman) 136 | - Go: [Gopls](https://github.com/golang/tools/tree/master/gopls) 137 | - Typescript: [Typescript Language Server](https://github.com/typescript-language-server/typescript-language-server) and [Biome](https://biomejs.dev/) 138 | - General-purpose language server: [EFM Language Server](https://github.com/mattn/efm-langserver) 139 | - Already configured for 140 | - [Black](https://github.com/psf/black) (formatter) 141 | - [Shfmt](https://github.com/mvdan/sh) (formatter) 142 | - [Fish-indent](https://fishshell.com/docs/current/cmds/fish_indent.html) (formatter) 143 | - [StyLua](https://github.com/JohnnyMorganz/StyLua) (formatter) 144 | - [Gofmt](https://pkg.go.dev/cmd/gofmt) (formatter) 145 | - [Golangcli-lint](https://github.com/golangci/golangci-lint) (linter) 146 | - [Prettier](https://prettier.io/) (formatter) 147 | - [Eslint](https://eslint.org/) (linter) 148 | - ... 149 | 150 | To add support for other languages, install corresponding language servers 151 | manually then add `lsp.lua` files under [after/ftplugin](https://github.com/Bekaboo/nvim/tree/master/after/ftplugin) to automatically launch 152 | them for different filetypes. 153 | 154 | Some examples of `lsp.lua` files: 155 | 156 | - [after/ftplugin/lua/lsp.lua](https://github.com/Bekaboo/nvim/blob/master/after/ftplugin/lua/lsp.lua) 157 | - [after/ftplugin/python/lsp.lua](https://github.com/Bekaboo/nvim/blob/master/after/ftplugin/python/lsp.lua) 158 | - [after/ftplugin/rust/lsp.lua](https://github.com/Bekaboo/nvim/blob/master/after/ftplugin/rust/lsp.lua) 159 | - [after/ftplugin/sh/lsp.lua](https://github.com/Bekaboo/nvim/blob/master/after/ftplugin/sh/lsp.lua) 160 | - [after/ftplugin/go/lsp.lua](https://github.com/Bekaboo/nvim/blob/master/after/ftplugin/go/lsp.lua) 161 | - [after/ftplugin/typescript/lsp.lua](https://github.com/Bekaboo/nvim/blob/master/after/ftplugin/typescript/lsp.lua) 162 | 163 | ### DAP 164 | 165 | Install the following debug adapters manually: 166 | 167 | - Bash: 168 | 169 | Go to [vscode-bash-debug release page](https://github.com/rogalmic/vscode-bash-debug/releases), 170 | download the latest release (`bash-debug-x.x.x.vsix`), extract 171 | (change the extension from `.vsix` to `.zip` then unzip it) the contents 172 | to a new directory `vscode-bash-debug/` and put it under stdpath `data` 173 | (see `:h stdpath`). 174 | 175 | Make sure `node` is executable. 176 | 177 | - C/C++: install [CodeLLDB](https://github.com/vadimcn/codelldb). 178 | 179 | Example for ArchLinux users: 180 | 181 | ```sh 182 | yay -S codelldb # Install from AUR 183 | ``` 184 | 185 | - Python: install [DebugPy](https://github.com/microsoft/debugpy) 186 | 187 | Example for ArchLinux users: 188 | 189 | ```sh 190 | sudo pacman -S python-debugpy 191 | ``` 192 | 193 | or 194 | 195 | ```sh 196 | pip install --local debugpy # Install to user's home directory 197 | ``` 198 | 199 | - Go: install [Delve](https://github.com/go-delve/delve) 200 | 201 | For more information on DAP installation, see [Debug Adapter Installation](https://github.com/mfussenegger/nvim-dap/wiki/Debug-Adapter-installation). 202 | 203 | ### Formatter 204 | 205 | - Bash: install [Shfmt](https://github.com/mvdan/sh)\* 206 | - C/C++: install [Clang](https://clang.llvm.org/) to use `clang-format` 207 | - Lua: install [StyLua](https://github.com/JohnnyMorganz/StyLua)\* 208 | - Rust: install [Rust](https://www.rust-lang.org/tools/install) to use `rustfmt` 209 | - Python: install [Black](https://github.com/psf/black)\* 210 | - LaTeX: install [texlive-core](http://tug.org/texlive/) to use `latexindent` 211 | 212 | \*Need [EFM Language Server](https://github.com/mattn/efm-langserver) to work with `vim.lsp.buf.format()` 213 | 214 | ## Installation 215 | 216 | 1. Make sure you have required dependencies installed. 217 | 2. Clone this repo to your config directory 218 | 219 | ```sh 220 | git clone https://github.com/Bekaboo/nvim ~/.config/nvim-macro 221 | ``` 222 | 223 | 4. Open neovim using 224 | 225 | ```sh 226 | NVIM_APPNAME=nvim-macro nvim 227 | ``` 228 | 229 | On first installation, neovim will prompt you to decide whether to install 230 | third-party plugins, press `y` to install, `n` to skip, `never` to skip and 231 | disable the prompt in the future (aka "do not ask again"). 232 | 233 | The suggestion is to use `n` to skip installing plugins on first launch, 234 | and see if everything works OK under a bare minimum setup. Depending on 235 | your needs, you can choose whether to install third-party plugins later 236 | using `y`/`yes` or `never` on the second launch. 237 | 238 | **Some notes about third-party plugins** 239 | 240 | Installing third-party plugins is known to cause issues in some cases, 241 | including: 242 | 243 | 1. Partially cloned plugins and missing dependencies due to slow network 244 | connection 245 | 2. Building failure especially for plugins like [telescope-fzf-native.nvim](https://github.com/nvim-telescope/telescope-fzf-native.nvim) 246 | and [markdown-preview.nvim](https://github.com/iamcco/markdown-preview.nvim) due to missing building dependencies or slow 247 | installation process 248 | 3. Treesitter plugins can easily cause issues if you are on a different 249 | nvim version, check [nvim-version.txt](https://github.com/Bekaboo/nvim/blob/master/nvim-version.txt) for the version of nvim targeted by 250 | this config 251 | 252 | To avoid these issues, 253 | 254 | 1. Ensure you have a fast network before installing third-party plugins 255 | 2. If the building process failed, go to corresponding project directory 256 | under `g:package_path` and manually run the build command from there. 257 | The build commands are declared in module specification files under 258 | [lua/modules](https://github.com/Bekaboo/nvim/tree/master/lua/modules) 259 | 3. Ensure you are on the same version of nvim as specified in 260 | [nvim-version.txt](https://github.com/Bekaboo/nvim/blob/master/nvim-version.txt) if you encounter any issue related to treesitter 261 | 262 | 5. After entering neovim, Run `:checkhealth` to check potential dependency 263 | issues. 264 | 6. Enjoy! 265 | 266 | ## Troubleshooting 267 | 268 | If you encounter any issue, please try the following steps: 269 | 270 | 1. Run `:Lazy restore` once to ensure that all packages are properly 271 | installed and **patched** 272 | 273 | 2. Run `:checkhealth` to check potential dependency issues 274 | 275 | 3. Check `:version` to make sure you are on the same (of above) version of 276 | neovim as specified in [nvim-version.txt](https://github.com/Bekaboo/nvim/blob/master/nvim-version.txt) 277 | 278 | 4. Try removing the following paths then restart Neovim: 279 | 280 | - `:echo stdpath('cache')` 281 | - `:echo stdpath('state')` 282 | - `:echo stdpath('data')` 283 | 284 | 5. If still not working, please open an issue and I will be happy to help 285 | 286 | ## Uninstallation 287 | 288 | You can uninstall this config completely by simply removing the following 289 | paths: 290 | 291 | - `:echo stdpath('config')` 292 | - `:echo stdpath('cache')` 293 | - `:echo stdpath('state')` 294 | - `:echo stdpath('data')` 295 | 296 | ## Config Structure 297 | 298 | ``` 299 | . 300 | ├── colors # colorschemes 301 | ├── plugin # custom plugins 302 | ├── ftplugin # custom filetype plugins 303 | ├── init.lua # entry of config 304 | ├── lua 305 | │ ├── core # files under this folder is required by 'init.lua' 306 | │ │ ├── autocmds.lua 307 | │ │ ├── general.lua # options and general settings 308 | │ │ ├── keymaps.lua 309 | │ │ └── modules.lua # bootstraps plugin manager and specifies which modules to include 310 | │ ├── modules # all plugin specifications and configs go here 311 | │ │ ├── lib.lua # plugin specifications in module 'lib' 312 | │ │ ├── completion.lua # plugin specifications in module 'completion' 313 | │ │ ├── debug.lua # plugin specifications in modules 'debug' 314 | │ │ ├── langs.lua # plugin specifications in module 'langs' 315 | │ │ ├── markup.lua # ... 316 | │ │ ├── llm.lua 317 | │ │ ├── tools.lua 318 | │ │ ├── treesitter.lua 319 | │ │ └── colorschemes.lua 320 | │ ├── configs # configs for each plugin 321 | │ ├── snippets # snippets 322 | │ ├── plugin # the actual implementation of custom plugins 323 | │ └── utils 324 | └── syntax # syntax files 325 | ``` 326 | 327 | ## Tweaking this Configuration 328 | 329 | ### Managing Plugins with Modules 330 | 331 | In order to enable or disable a module, one need to change the table in 332 | [lua/core/modules.lua](https://github.com/Bekaboo/nvim/blob/master/lua/core/modules.lua) passed to `enable_modules()`, for example 333 | 334 | ```lua 335 | enable_modules({ 336 | 'lib', 337 | 'treesitter', 338 | 'edit', 339 | -- ... 340 | }) 341 | ``` 342 | 343 | ### Installing Packages to an Existing Module 344 | 345 | To install plugin `foo` under module `bar`, just insert the corresponding 346 | specification to the big table `lua/modules/bar.lua` returns, for instance, 347 | 348 | `lua/modules/bar.lua`: 349 | 350 | ```lua 351 | return { 352 | -- ... 353 | { 354 | 'foo/foo', 355 | dependencies = 'foo_dep', 356 | }, 357 | } 358 | ``` 359 | 360 | ### Installing Packages to a New Module 361 | 362 | To install plugin `foo` under module `bar`, one should first 363 | create module `bar` under [lua/modules](https://github.com/Bekaboo/nvim/tree/master/lua/modules): 364 | 365 | ``` 366 | . 367 | └── lua 368 | └── modules 369 | └── bar.lua 370 | ``` 371 | 372 | a module should return a big table containing all specifications of plugins 373 | under that module, for instance: 374 | 375 | ```lua 376 | return { 377 | { 378 | 'goolord/alpha-nvim', 379 | cond = function() 380 | return vim.fn.argc() == 0 and 381 | vim.o.lines >= 36 and vim.o.columns >= 80 382 | end, 383 | dependencies = 'nvim-web-devicons', 384 | }, 385 | 386 | { 387 | 'romgrk/barbar.nvim', 388 | dependencies = 'nvim-web-devicons', 389 | config = function() require('bufferline').setup() end, 390 | }, 391 | } 392 | ``` 393 | 394 | After creating the new module `bar`, enable it in [lua/core/modules.lua](https://github.com/Bekaboo/nvim/blob/master/lua/core/modules.lua): 395 | 396 | ```lua 397 | enable_modules({ 398 | -- ... 399 | 'bar', 400 | -- ... 401 | }) 402 | ``` 403 | 404 | ### General Settings and Options 405 | 406 | See [lua/core/general.lua](https://github.com/Bekaboo/nvim/blob/master/lua/core/general.lua). 407 | 408 | ### Environment Variables 409 | 410 | - `$NVIM_NO3RD`: disable third-party plugins if set 411 | - `$NVIM_NF`: enable nerd font icons if set 412 | 413 | ### Keymaps 414 | 415 | See [lua/core/keymaps.lua](https://github.com/Bekaboo/nvim/blob/master/lua/core/keymaps.lua), or see [module config files](https://github.com/Bekaboo/nvim/tree/master/lua/configs) for 416 | corresponding plugin keymaps. 417 | 418 | ### Colorschemes 419 | 420 | `cockatoo`, `nano`, `macro`, and `sonokai` are three builtin custom 421 | colorschemes, with separate palettes for dark and light background. 422 | 423 | Neovim is configured to restore the previous background and colorscheme 424 | settings on startup, so there is no need to set them up in the config file 425 | explicitly. 426 | 427 | To disable the auto-restore feature, remove the plugin [plugin/colorscheme.lua](https://github.com/Bekaboo/nvim/tree/master/plugin/colorscheme.lua). 428 | 429 | To tweak this colorscheme, edit corresponding colorscheme files under [colors](https://github.com/Bekaboo/nvim/tree/master/colors). 430 | 431 | ### Auto Commands 432 | 433 | See [lua/core/autocmds.lua](https://github.com/Bekaboo/nvim/blob/master/lua/core/autocmds.lua). 434 | 435 | ### LSP Server Configurations 436 | 437 | See [lua/utils/lsp.lua](https://github.com/Bekaboo/nvim/tree/master/lua/utils/lsp.lua) and `lsp.lua` files under [after/ftplugin](https://github.com/Bekaboo/nvim/tree/master/after/ftplugin). 438 | 439 | ### DAP Configurations 440 | 441 | See [lua/configs/dap-configs](https://github.com/Bekaboo/nvim/tree/master/lua/configs/dap-configs), [lua/configs/nvim-dap.lua](https://github.com/Bekaboo/nvim/tree/master/lua/configs/nvim-dap.lua), and [lua/configs/nvim-dap-ui.lua](https://github.com/Bekaboo/nvim/tree/master/lua/configs/nvim-dap-ui.lua). 442 | 443 | ### Snippets 444 | 445 | This configuration use [LuaSnip](https://github.com/L3MON4D3/LuaSnip) as the snippet engine, 446 | custom snippets for different filetypes 447 | are defined under [lua/snippets](https://github.com/Bekaboo/nvim/tree/master/lua/snippets). 448 | 449 | ### Enabling VSCode Integration 450 | 451 | VSCode integration takes advantages of the modular design, allowing to use 452 | a different set of modules when Neovim is launched by VSCode, relevant code is 453 | in [autoload/plugin/vscode.vim](https://github.com/Bekaboo/nvim/blob/master/autoload/plugin/vscode.vim) and [lua/core/modules.lua](https://github.com/Bekaboo/nvim/blob/master/lua/core/modules.lua). 454 | 455 | To make VSCode integration work, please install [VSCode-Neovim](https://github.com/vscode-neovim/vscode-neovim) in VSCode 456 | and configure it correctly. 457 | 458 | After setting up VSCode-Neovim, re-enter VSCode, open a random file 459 | and it should work out of the box. 460 | 461 | ## Appendix 462 | 463 | ### Showcases 464 | 465 | - File manager using [oil.nvim](https://github.com/stevearc/oil.nvim) 466 | 467 | 468 | 469 | - DAP support powered by [nvim-dap](https://github.com/mfussenegger/nvim-dap) and [nvim-dap-ui](https://github.com/rcarriga/nvim-dap-ui) 470 | 471 | 472 | 473 | - Jupyter Notebook integration using [jupytext](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/jupytext.lua) and [molten-nvim](https://github.com/benlubas/molten-nvim) 474 | 475 | 476 | 477 | - Winbar with IDE-like drop-down menus using [dropbar.nvim](https://github.com/Bekaboo/dropbar.nvim) 478 | 479 | 480 | 481 | - LSP hover & completion thanks to Neovim builtin LSP client and [nvim-cmp](https://github.com/hrsh7th/nvim-cmp) 482 | 483 | 484 | 485 | 486 | 487 | - Git integration: [fugitive](https://github.com/tpope/vim-fugitive) and [gitsigns.nvim](https://github.com/tpope/vim-fugitive) 488 | 489 | 490 | 491 | 492 | 493 | ### Default Modules and Plugins of Choice 494 | 495 | #### Third Party Plugins 496 | 497 | Total # of plugins: 50 (package manager included). 498 | 499 | - **Lib** 500 | - [nvim-web-devicons](https://github.com/kyazdani42/nvim-web-devicons) 501 | - **Completion** 502 | - [nvim-cmp](https://github.com/hrsh7th/nvim-cmp) 503 | - [cmp-calc](https://github.com/hrsh7th/cmp-calc) 504 | - [cmp-cmdline](https://github.com/hrsh7th/cmp-cmdline) 505 | - [cmp-path](https://github.com/hrsh7th/cmp-path) 506 | - [cmp-nvim-lsp](https://github.com/hrsh7th/cmp-nvim-lsp) 507 | - [cmp-buffer](https://github.com/hrsh7th/cmp-buffer) 508 | - [cmp_luasnip](https://github.com/saadparwaiz1/cmp_luasnip) 509 | - [cmp-nvim-lsp-signature-help](https://github.com/hrsh7th/cmp-nvim-lsp-signature-help) 510 | - [cmp-dap](https://github.com/rcarriga/cmp-dap) 511 | - [LuaSnip](https://github.com/L3MON4D3/LuaSnip) 512 | - **LLM** 513 | - [codeium.vim](https://github.com/Exafunction/codeium.vim) 514 | - [codecompanion.nvim](https://github.com/olimorris/codecompanion.nvim) 515 | - **Markup** 516 | - [vimtex](https://github.com/lervag/vimtex) 517 | - [markdown-preview.nvim](https://github.com/iamcco/markdown-preview.nvim) 518 | - [vim-table-mode](https://github.com/dhruvasagar/vim-table-mode) 519 | - [otter.nvim](https://github.com/jmbuhr/otter.nvim) 520 | - [molten-nvim](https://github.com/benlubas/molten-nvim) 521 | - [headlines.nvim](https://github.com/lukas-reineke/headlines.nvim) 522 | - [img-clip.nvim](https://github.com/HakonHarnes/img-clip.nvim) 523 | - **Edit** 524 | - [nvim-surround](https://github.com/kylechui/nvim-surround) 525 | - [vim-sleuth](https://github.com/tpope/vim-sleuth) 526 | - [ultimate-autopairs.nvim](https://github.com/altermo/ultimate-autopair.nvim) 527 | - [vim-easy-align](https://github.com/junegunn/vim-easy-align) 528 | - **Tools** 529 | - [fzf-lua](https://github.com/ibhagwan/fzf-lua) 530 | - [flatten.nvim](https://github.com/willothy/flatten.nvim) 531 | - [gitsigns.nvim](https://github.com/lewis6991/gitsigns.nvim) 532 | - [plenary.nvim](https://github.com/nvim-lua/plenary.nvim) (dependency) 533 | - [git-conflict](https://github.com/akinsho/git-conflict.nvim) 534 | - [nvim-colorizer.lua](https://github.com/NvChad/nvim-colorizer.lua) 535 | - [vim-fugitive](https://github.com/tpope/vim-fugitive) 536 | - [vim-rhubarb](https://github.com/tpope/vim-rhubarb) (dependency) 537 | - [fugitive-gitlab.vim](https://github.com/shumphrey/fugitive-gitlab.vim) (dependency) 538 | - [oil.nvim](https://github.com/stevearc/oil.nvim) 539 | - **LSP** 540 | - [clangd_extensions.nvim](https://github.com/p00f/clangd_extensions.nvim) 541 | - **Treesitter** 542 | - [nvim-treesitter](https://github.com/nvim-treesitter/nvim-treesitter) 543 | - [nvim-treesitter-textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects) 544 | - [nvim-ts-context-commentstring](https://github.com/JoosepAlviste/nvim-ts-context-commentstring) 545 | - [nvim-treesitter-endwise](https://github.com/RRethy/nvim-treesitter-endwise) 546 | - [treesj](https://github.com/Wansmer/treesj) 547 | - [cellular-automaton.nvim](https://github.com/Eandrju/cellular-automaton.nvim) 548 | - **Debug** 549 | - [nvim-dap](https://github.com/mfussenegger/nvim-dap) 550 | - [nvim-dap-ui](https://github.com/rcarriga/nvim-dap-ui) 551 | - [nvim-nio](https://github.com/nvim-neotest/nvim-nio) (dependency) 552 | - [one-small-step-for-vimkind](https://github.com/jbyuki/one-small-step-for-vimkind) 553 | - **Colorschemes** 554 | - [everforest](https://github.com/sainnhe/everforest) 555 | - [gruvbox-material](https://github.com/sainnhe/gruvbox-material) 556 | 557 | #### Builtin Plugins 558 | 559 | - [colorcolumn](https://github.com/Bekaboo/nvim/tree/master/plugin/colorcolumn.lua) 560 | - Shows color column dynamically based on current line width 561 | - Released as [deadcolumn.nvim](https://github.com/Bekaboo/deadcolumn.nvim) 562 | - [colorscheme](https://github.com/Bekaboo/nvim/tree/master/plugin/colorscheme.lua) 563 | - Remembers and restores previous background and colorscheme settings 564 | - Syncs background and colorscheme settings among multiple Neovim instances 565 | if scripts [setbg](https://github.com/Bekaboo/dot/blob/master/.scripts/setbg) and [setcolor](https://github.com/Bekaboo/dot/blob/master/.scripts/setcolor) are in `$PATH` 566 | - [expandtab](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/expandtab.lua) 567 | - Always use spaces for alignment, even if `'expandtab'` is not set, see 568 | `:h 'tabstop'` point 5 569 | - [fcitx5](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/fcitx5.lua) 570 | - Switches and restores fcitx5 state in each buffer asynchronously 571 | - [jupytext](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/jupytext.lua) 572 | - Edits jupyter notebook like markdown files 573 | - Writes into jupyter notebook asynchronously, which gives a smoother 574 | experience than [jupytext.vim](https://github.com/goerz/jupytext) 575 | - [intro](https://github.com/Bekaboo/nvim/tree/master/plugin/intro.lua) 576 | - Shows a custom intro message on startup 577 | - [lsp](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/lsp.lua) 578 | - Sets up LSP and diagnostic options and commands on `LspAttach` or 579 | `DiagnosticChanged` 580 | - [readline](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/readline.lua) 581 | - Readline-like keybindings in insert and command mode 582 | - [statuscolumn](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/statuscolumn.lua) 583 | - Custom statuscolumn, with git signs on the right of line numbers 584 | - [statusline](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/statusline.lua) 585 | - Custom statusline inspired by [nano-emacs](https://github.com/rougier/nano-emacs) 586 | - [tabline](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/tabline.lua) 587 | - Simple tabline that shows the current working directory of each tab 588 | - Use `:[count]TabRename [name]` to rename tabs 589 | - [tabout](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/tabout.lua) 590 | - Tab out and in with `` and `` 591 | - [term](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/term.lua) 592 | - Some nice setup for terminal buffers 593 | - [tmux](https://github.com/Bekaboo/nvim/tree/master/lua/plugin/tmux.lua) 594 | - Integration with tmux, provides unified keymaps for navigation, resizing, 595 | and many other window operations 596 | - [vscode](https://github.com/Bekaboo/nvim/tree/master/autoload/plugin/vscode.vim) 597 | - Integration with [VSCode-Neovim](https://github.com/vscode-neovim/vscode-neovim) 598 | - [winbar](https://github.com/Bekaboo/nvim/blob/master/lua/plugin/winbar.lua) 599 | - A winbar with drop-down menus and multiple backends 600 | - Released as [dropbar.nvim](https://github.com/Bekaboo/dropbar.nvim) 601 | - [markdown-capitalized-title](https://github.com/Bekaboo/nvim/blob/master/after/ftplugin/markdown/capitalized-title.lua) 602 | - Automatically capitalize the first letter of each word in markdown titles 603 | - Use `:MarkdownSetCapTitle enable/disable` to enable or disable this 604 | feature 605 | 606 | ### Startuptime 607 | 608 | - Neovim Version: 609 | 610 | ``` 611 | NVIM v0.10.0-dev-2363+gb76a01055f 612 | Build type: Release 613 | LuaJIT 2.1.1702233742 614 | ``` 615 | 616 | - Config Commit: `5970178e` 617 | 618 | - System: Arch Linux 6.7.4-arch1-1 619 | 620 | - Machine: Dell XPS 13-7390 621 | 622 | - Startup time with `--clean`: 623 | 624 | ```sh 625 | hyperfine 'nvim --clean +q' 626 | ``` 627 | 628 | ``` 629 | Benchmark 1: nvim --clean +q 630 | Time (mean ± σ): 9.4 ms ± 1.9 ms [User: 6.3 ms, System: 3.2 ms] 631 | Range (min … max): 6.5 ms … 15.1 ms 185 runs 632 | ``` 633 | 634 | - Startup time with this config: 635 | 636 | ```sh 637 | hyperfine 'nvim +q' 638 | ``` 639 | 640 | ``` 641 | Benchmark 1: nvim +q 642 | Time (mean ± σ): 18.1 ms ± 1.3 ms [User: 13.6 ms, System: 4.5 ms] 643 | Range (min … max): 15.5 ms … 22.0 ms 127 runs 644 | ``` 645 | 646 |
647 | startuptime log 648 | 649 | ``` 650 | --- Startup times for process: Primary/TUI --- 651 | 652 | times in msec 653 | clock self+sourced self: sourced script 654 | clock elapsed: other lines 655 | 656 | 000.002 000.002: --- NVIM STARTING --- 657 | 000.168 000.166: event init 658 | 000.252 000.083: early init 659 | 000.305 000.053: locale set 660 | 000.352 000.047: init first window 661 | 000.615 000.263: inits 1 662 | 000.624 000.009: window checked 663 | 000.626 000.002: parsing arguments 664 | 001.130 000.063 000.063: require('vim.shared') 665 | 001.229 000.057 000.057: require('vim.inspect') 666 | 001.281 000.037 000.037: require('vim._options') 667 | 001.282 000.148 000.053: require('vim._editor') 668 | 001.284 000.258 000.048: require('vim._init_packages') 669 | 001.290 000.405: init lua interpreter 670 | 001.872 000.583: expanding arguments 671 | 001.908 000.036: inits 2 672 | 002.302 000.394: init highlight 673 | 002.306 000.003: --- NVIM STARTED --- 674 | 675 | --- Startup times for process: Embedded --- 676 | 677 | times in msec 678 | clock self+sourced self: sourced script 679 | clock elapsed: other lines 680 | 681 | 000.002 000.002: --- NVIM STARTING --- 682 | 000.165 000.163: event init 683 | 000.242 000.077: early init 684 | 000.295 000.053: locale set 685 | 000.336 000.041: init first window 686 | 000.568 000.232: inits 1 687 | 000.582 000.015: window checked 688 | 000.589 000.007: parsing arguments 689 | 001.084 000.038 000.038: require('vim.shared') 690 | 001.192 000.047 000.047: require('vim.inspect') 691 | 001.239 000.036 000.036: require('vim._options') 692 | 001.241 000.154 000.070: require('vim._editor') 693 | 001.242 000.261 000.069: require('vim._init_packages') 694 | 001.244 000.394: init lua interpreter 695 | 001.299 000.054: expanding arguments 696 | 001.316 000.017: inits 2 697 | 001.554 000.238: init highlight 698 | 001.555 000.001: waiting for UI 699 | 001.649 000.094: done waiting for UI 700 | 001.652 000.003: clear screen 701 | 001.688 000.006 000.006: require('vim.keymap') 702 | 001.947 000.293 000.287: require('vim._defaults') 703 | 001.950 000.005: init default mappings & autocommands 704 | 002.376 000.051 000.051: sourcing /usr/share/nvim/runtime/ftplugin.vim 705 | 002.433 000.025 000.025: sourcing /usr/share/nvim/runtime/indent.vim 706 | 002.499 000.010 000.010: sourcing /usr/share/nvim/archlinux.vim 707 | 002.502 000.030 000.020: sourcing /etc/xdg/nvim/sysinit.vim 708 | 003.043 000.041 000.041: require('vim.fs') 709 | 003.205 000.133 000.133: require('vim.uri') 710 | 003.222 000.243 000.069: require('vim.loader') 711 | 003.756 001.216 000.973: require('core.general') 712 | 005.768 002.008 002.008: require('core.keymaps') 713 | 006.053 000.282 000.282: require('core.autocmds') 714 | 006.262 000.089 000.089: require('utils') 715 | 006.343 000.078 000.078: require('utils.static') 716 | 006.695 000.221 000.221: require('utils.static.icons._icons') 717 | 006.699 000.353 000.133: require('utils.static.icons') 718 | 007.039 000.076 000.076: require('modules.lib') 719 | 007.189 000.065 000.065: require('modules.edit') 720 | 007.287 000.060 000.060: require('modules.debug') 721 | 007.355 000.064 000.064: require('modules.tools') 722 | 007.408 000.047 000.047: require('modules.markup') 723 | 007.455 000.042 000.042: require('modules.completion') 724 | 007.519 000.060 000.060: require('modules.treesitter') 725 | 007.559 000.036 000.036: require('modules.colorschemes') 726 | 008.221 000.658 000.658: require('lazy') 727 | 008.250 000.011 000.011: require('ffi') 728 | 008.336 000.081 000.081: require('lazy.stats') 729 | 008.450 000.094 000.094: require('lazy.core.util') 730 | 008.536 000.083 000.083: require('lazy.core.config') 731 | 008.680 000.062 000.062: require('lazy.core.handler') 732 | 008.798 000.115 000.115: require('lazy.core.plugin') 733 | 008.812 000.274 000.098: require('lazy.core.loader') 734 | 010.241 000.085 000.085: require('lazy.core.handler.cmd') 735 | 010.349 000.103 000.103: require('lazy.core.handler.event') 736 | 010.532 000.178 000.178: require('lazy.core.handler.keys') 737 | 010.698 000.160 000.160: require('lazy.core.handler.ft') 738 | 011.196 000.024 000.024: sourcing /home/zeng/.local/share/nvim/packages/vimtex/ftdetect/cls.vim 739 | 011.247 000.017 000.017: sourcing /home/zeng/.local/share/nvim/packages/vimtex/ftdetect/tex.vim 740 | 011.288 000.021 000.021: sourcing /home/zeng/.local/share/nvim/packages/vimtex/ftdetect/tikz.vim 741 | 012.812 000.190 000.190: sourcing /usr/share/nvim/runtime/filetype.lua 742 | 012.886 000.006 000.006: require('vim.F') 743 | 013.509 000.127 000.127: sourcing /home/zeng/.config/nvim/plugin/_load.lua 744 | 013.677 000.064 000.064: require('utils.hl') 745 | 013.762 000.226 000.162: sourcing /home/zeng/.config/nvim/plugin/colorcolumn.lua 746 | 013.915 000.041 000.041: require('utils.json') 747 | 013.991 000.073 000.073: require('utils.fs') 748 | 015.510 000.962 000.962: sourcing /home/zeng/.config/nvim/colors/macro.lua 749 | 015.701 001.914 000.838: sourcing /home/zeng/.config/nvim/plugin/colorscheme.lua 750 | 016.132 000.098 000.098: require('vim.highlight') 751 | 016.280 000.550 000.452: sourcing /home/zeng/.config/nvim/plugin/intro.lua 752 | 016.466 000.063 000.063: sourcing /usr/share/nvim/runtime/plugin/editorconfig.lua 753 | 016.531 000.018 000.018: sourcing /usr/share/nvim/runtime/plugin/gzip.vim 754 | 016.626 000.069 000.069: sourcing /usr/share/nvim/runtime/plugin/man.lua 755 | 016.672 000.013 000.013: sourcing /usr/share/nvim/runtime/plugin/matchit.vim 756 | 016.831 000.136 000.136: sourcing /usr/share/nvim/runtime/plugin/matchparen.vim 757 | 016.873 000.012 000.012: sourcing /usr/share/nvim/runtime/plugin/netrwPlugin.vim 758 | 016.954 000.060 000.060: sourcing /usr/share/nvim/runtime/plugin/nvim.lua 759 | 017.030 000.054 000.054: sourcing /usr/share/nvim/runtime/plugin/osc52.lua 760 | 017.061 000.008 000.008: sourcing /usr/share/nvim/runtime/plugin/rplugin.vim 761 | 017.135 000.052 000.052: sourcing /usr/share/nvim/runtime/plugin/shada.vim 762 | 017.190 000.016 000.016: sourcing /usr/share/nvim/runtime/plugin/spellfile.vim 763 | 017.226 000.010 000.010: sourcing /usr/share/nvim/runtime/plugin/tarPlugin.vim 764 | 017.256 000.008 000.008: sourcing /usr/share/nvim/runtime/plugin/tohtml.vim 765 | 017.284 000.006 000.006: sourcing /usr/share/nvim/runtime/plugin/tutor.vim 766 | 017.326 000.011 000.011: sourcing /usr/share/nvim/runtime/plugin/zipPlugin.vim 767 | 017.410 011.355 005.044: require('core.packages') 768 | 017.413 014.890 000.028: sourcing /home/zeng/.config/nvim/init.lua 769 | 017.419 000.473: sourcing vimrc file(s) 770 | 017.522 000.051 000.051: sourcing /usr/share/nvim/runtime/filetype.lua 771 | 017.665 000.056 000.056: sourcing /usr/share/nvim/runtime/syntax/synload.vim 772 | 017.767 000.209 000.153: sourcing /usr/share/nvim/runtime/syntax/syntax.vim 773 | 017.779 000.101: inits 3 774 | 017.959 000.129 000.129: require('plugin.statuscolumn') 775 | 018.237 000.329: opening buffers 776 | 018.258 000.020: BufEnter autocommands 777 | 018.259 000.002: editing files in windows 778 | 018.280 000.021: VimEnter autocommands 779 | 018.340 000.060: UIEnter autocommands 780 | 018.567 000.179 000.179: sourcing /usr/share/nvim/runtime/autoload/provider/clipboard.vim 781 | 018.573 000.053: before starting main loop 782 | 018.911 000.074 000.074: require('utils.stl') 783 | 019.334 000.379 000.379: require('plugin.statusline') 784 | 019.542 000.130 000.130: require('utils.git') 785 | 019.754 000.197 000.197: require('vim._system') 786 | 021.197 001.843: first screen update 787 | 021.201 000.004: --- NVIM STARTED --- 788 | ``` 789 | 790 |
791 | --------------------------------------------------------------------------------