└── 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 |
--------------------------------------------------------------------------------