aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/posts/neovim-is-usable-without-plugins.md
diff options
context:
space:
mode:
Diffstat (limited to 'content/posts/neovim-is-usable-without-plugins.md')
-rw-r--r--content/posts/neovim-is-usable-without-plugins.md90
1 files changed, 90 insertions, 0 deletions
diff --git a/content/posts/neovim-is-usable-without-plugins.md b/content/posts/neovim-is-usable-without-plugins.md
new file mode 100644
index 0000000..0fadb18
--- /dev/null
+++ b/content/posts/neovim-is-usable-without-plugins.md
@@ -0,0 +1,90 @@
+---
+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 <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:
+
+```vim
+if has('nvim')
+ augroup StartTreesitter
+ autocmd!
+ autocmd FileType * lua pcall(vim.treesitter.start)
+ augroup END
+endif
+```