frostyfalls

Lots of ideas, not many implementations.

(Neo)vim is usable without plugins

Last modified Jun 17 2025.

Table of Contents

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:

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:

return {
    cmd = { "gopls" },
    root_markers = { ".git", "go.mod", "go.work" },
    filetypes = { "go", "gomod", "gotmpl", "gowork" },
}

Then, just enable the server:

if has('nvim-0.11')
  if executable('gopls')
    lua vim.lsp.enable('gopls')
  endif
endif

See the Neovim docs for more information.

Fuzzy Finding (Vim) #

This is self-explanatory. Vim has recursive search support, along with wildcards.

" Include subdirectories in search path
set path+=**

" Add exclusions from recursive searches
set wildignore+=**/.git/**,**/build/**,**/node_modules/**

" Bind a key for searching
nnoremap <C-p> :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:

if has('nvim')
  augroup StartTreesitter
    autocmd!
    autocmd FileType * lua pcall(vim.treesitter.start)
  augroup END
endif