# My Neovim configuration ## Motivation After doing my first steps with , I decided to roll my own, custom, "lightweight" Neovim configuration in order to better understand Neovim and its configuration/customization, package managers, plugins etc. and have "my own" config that only includes things I really need. More on the "why's" are explained [in my blog post](https://lugh.ch/neovim-lessons-learned.html). ## Installation 1. Install Neovim 0.10. or newer 1. Install the dependencies documented in `init.lua` 1. Clone this Git repository to 1. `~/.config/nvim` on macOS or Linux 1. `c:\Users\foobar\AppData\Local\nvim` when on Windows ### Finishing touches - Create a `$HOME/.ignore` file and add big, useless directories to it, so Telescope/ripgrep/fd can ignore those. My current list of files/directories is available in `lua/weeheavy/plugins/telescope-fzf-native.lua` - Install Mason LSP/linter/formatters from the table down below ## Speed It's not too important. Still, I try to balance increasing startup time with the usefullness of a plugin. Output from lazy.nvim profiling (`:Lazy profile`) on a MacBook Pro M2 Max, macOS 14 on Neovim 0.10.1. ### Start and open init.lua Around 10% of the plugins are lazy-loaded. ```bash Startuptime: 96.76ms Based on the actual CPU time of the Neovim process till UIEnter. This is more accurate than `nvim --startuptime`. LazyStart 13.3ms LazyDone 41.06ms (+27.76ms) UIEnter 96.76ms (+55.71ms) ``` ### Starting with an empty file Around 50% of the plugins are lazy-loaded. ```bash Startuptime: 49.82ms Based on the actual CPU time of the Neovim process till UIEnter. This is more accurate than `nvim --startuptime`. LazyStart 13.75ms LazyDone 40.39ms (+26.64ms) UIEnter 49.82ms (+9.43ms) ``` ## Plugins | Name | Purpose | URL | | ------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------- | | **lazy.nvim** | Package manager | | | **telescope.nvim** | Find, Filter, Preview, Pick | | | **telescope-fzf-native.nvim** | Fuzzy finder for Telescope | | | **nvim-treesitter** | Parser/syntax highlighting | | | **nvim-treesitter-context** | Shows current line context | | | **nvim-treesitter-textobjects** | ? | | | **oil.nvim** | file explorer, (bulk file creation/rename) | | | **tokyonight.nvim** | Theme with treesitter/lsp support | | | **lualine.nvim** | Status line | | | **gitsigns.nvim** | Git change indicator | | | **which-key.nvim** | Shows contextual key bindings | | | **vim-illuminate** | Highlight similar words (w/ LSP, Treesitter, regex) | | | **lsp-zero.nvim** | LSP for mere mortals | | | **nvim-lspconfig** | Component of lsp-zero.nvim | | | **cmp-nvim-lsp** | Dependency of lsp-zero.nvim | | | **conform.nvim** | Formatter configuration, replacement for `null-ls` | | | **mason.nvim** | Install/manage LSP/DAP servers, linters and formatters | | | **mason-lspconfig.nvim** | Bridges mason.nvim with the lspconfig plugin | | | **zen-mode.nvim** | Distraction-free coding for Neovim | | | **twilight.nvim** | Dims inactive portions of the code you're editing | | | **todo-comments.nvim** | Highlights `NOTE:`, `FIXME:` etc. and makes them findable via Telescope | | | **mini.nvim** | I use the icons | | | **flash.nvim** | Navigation and Treesitter selection w/ search labels | | | **copilot.lua** | The better github.com/github/copilot.vim | | | **copilot-cmp** | transforms zbirenbaum/copilot.lua into a cmp source. | | | **nvim-lint** | Narrow-scope linter plugin to use via Neovim diagnostic framework | | ## Looks This is how it looks like: ![My Neovim setup](./sample.png) ## Mason essentials This lists the LSPs/linter/formatters I consider ok for my use cases. Tools may support many more languages than I document in the "Language" column. The formatters installed here are used via `conform.nvim`. | Type | Language | Name | Benefits | Issues | | --------- | ------------------ | --------------------------- | -------------------------------- | ----------------------------------------------------- | | LSP | Markdown | **marksman** | Autocompletes links | | | LSP | Go | **gopls** | | n/a | | LSP | Terraform/OpenTofu | **terraform-ls** | | n/a | | LSP | Terraform/OpenTofu | **tflint** | | n/a | | LSP | Ansible | **ansible-language-server** | Ansible knowhow | Search _yaml.ansible_ in `prefs.lua` | | LSP | Bash | **bash-language-server** | Incorporates ShellCheck | n/a | | LSP | YAML | **yaml-language-server** | | n/a | | Linter | Ansible | **ansible-lint** | | yamllint vs. ansible-lint | | Linter | YAML | **yamllint** | | yamllint vs. ansible-lint | | Linter | Terraform/OpenTofu | **tflint** | | | | Linter | any | **woke** | Makes you aware of woke language | | | Formatter | Markdown, YAML | **prettier** | Markdown table formatting! | n/a | | Formatter | Lua | **stylua** | Formats Lua | n/a | | Formatter | Bash | **shfmt** | Formats Bash scripts | n/a | ## Key bindings See [CHEATSHEET](CHEATSHEET.md) ## Open issues/TODOs - - solution to search-replace visual blocks [![Please don't upload to GitHub](https://nogithub.codeberg.page/badge.svg)](https://nogithub.codeberg.page)