--- title: "(Neo)vim is usable without plugins" date: "2025-06-17" --- Vim and Neovim are extremely powerful editors, but despite having lots of features built-in, many folk reach for third-party plugins quite easily. Here are a few common features that may be found of use which are built in to the editor. ## Completion (Vim) Completion functions are all prefixed with `C-x` in insert mode. Take this snippet from the `ins-completion` help section for reference: ```txt {tabWidth=0} In Insert and Replace mode, there are several commands to complete part of a keyword or line that has been typed. This is useful if you are using complicated keywords (e.g., function names with capitals and underscores). Completion can be done for: 1. Whole lines |i_CTRL-X_CTRL-L| 2. keywords in the current file |i_CTRL-X_CTRL-N| 3. keywords in 'dictionary' |i_CTRL-X_CTRL-K| 4. keywords in 'thesaurus', thesaurus-style |i_CTRL-X_CTRL-T| 5. keywords in the current and included files |i_CTRL-X_CTRL-I| 6. tags |i_CTRL-X_CTRL-]| 7. file names |i_CTRL-X_CTRL-F| 8. definitions or macros |i_CTRL-X_CTRL-D| 9. Vim command-line |i_CTRL-X_CTRL-V| 10. User defined completion |i_CTRL-X_CTRL-U| 11. omni completion |i_CTRL-X_CTRL-O| 12. Spelling suggestions |i_CTRL-X_s| 13. keywords in 'complete' |i_CTRL-N| |i_CTRL-P| ``` Highlights are omni completion - often tied to LSP, spelling suggestions, and file names. ## LSP (Neovim) This is easier to set up than ever thanks to Neovim v0.11 adding `vim.lsp.Config`. For starters, a configuration file for each language server must be created. Below is an example of one for `gopls`: ```lua return { cmd = { "gopls" }, root_markers = { ".git", "go.mod", "go.work" }, filetypes = { "go", "gomod", "gotmpl", "gowork" }, } ``` Then, just enable the server: ```vim if has('nvim-0.11') if executable('gopls') lua vim.lsp.enable('gopls') endif endif ``` See the [Neovim docs](https://neovim.io/doc/user/lsp.html#vim.lsp.Config) for more information. ## Fuzzy Finding (Vim) This is self-explanatory. Vim has recursive search support, along with wildcards. ```vim " Include subdirectories in search path set path+=** " Add exclusions from recursive searches set wildignore+=**/.git/**,**/build/**,**/node_modules/** " Bind a key for searching nnoremap :e **/* ``` ## Tree-sitter (Neovim) Tree-sitter parsers must be installed with an external package manager, ideally the one your operating system already uses. Other than that, Neovim should start Tree-sitter with just the below code: ```vim if has('nvim') augroup StartTreesitter autocmd! autocmd FileType * lua pcall(vim.treesitter.start) augroup END endif ```