NeoVim is an [[Apache v2]]/[[Vim License]] licensed modal text editor backend written in [[3. Reference/Software/Programming Languages/C|C]].
- [Website](https://neovim.io/)
- [GitHub](https://github.com/neovim/neovim)
- [AlternativeTo](https://alternativeto.net/software/neovide/about/
> hyperextensible [[Vim]]-based text editor
# Notability
NeoVim is a heavily refactored [[Vim]] with [[Lua]] scripting, first-class [[Inter-Process Communication]], and [[LSP]] support.
I have used it since not long after its original release in 2014.
# Philosophy
NeoVim is a project that seeks to aggressively refactor [Vim](https://www.vim.org/) in order to:
- Simplify maintenance and encourage [contributions](https://github.com/neovim/neovim/blob/master/CONTRIBUTING.md)
- Split the work between multiple developers
- Enable [advanced UIs](https://github.com/neovim/neovim/wiki/Related-projects#gui) without modifications to the core
- Maximize [extensibility](https://github.com/neovim/neovim/wiki/Plugin-UI-architecture)
# OS Support
- [[Linux]]
- [[FreeBSD]]
- [[OpenBSD]]
- [[Android]]
- [[MacOS]]
- [[Windows]]
NeoVim, unlike mainline [[Vim]], does not currently run on `dv:link("Haiku OS")` but there are still some [efforts](https://discuss.haiku-os.org/t/vim-and-haiku/11992/3) being made to port it. Update [[2024-03-02]], efforts seem to have stalled.
# Features
- Modern [GUIs](https://github.com/neovim/neovim/wiki/Related-projects#gui)
- [API access](https://github.com/neovim/neovim/wiki/Related-projects#api-clients) from any language including C/C++, C#, Clojure, D, Elixir, Go, Haskell, Java/Kotlin, JavaScript/Node.js, Julia, Lisp, Lua, Perl, Python, Racket, Ruby, Rust
- Embedded, scriptable [terminal emulator](https://neovim.io/doc/user/nvim_terminal_emulator.html)
- Asynchronous [job control](https://github.com/neovim/neovim/pull/2247)
- [Shared data (shada)](https://github.com/neovim/neovim/pull/2506) among multiple editor instances
- [XDG base directories](https://github.com/neovim/neovim/pull/3470) support
- Compatible with most Vim plugins, including Ruby and Python plugins
## GUIs
### NeoVide
- Smooth scrolling
- Animated cursor moving to better keep track of its location
- Scary fast - launches instantly, full drawn
#### Platform Support
- Linux
- MacOS
- Windows
# Tips
See also: [[Vim#Tips]]
## Obsidian Integration
Working with [[Obsidian Editor]] vaults and using similar markup and features.
- https://github.com/oflisback/obsidian-bridge.nvim
- https://github.com/epwalsh/obsidian.nvim
## Python Issues
If NeoVim starts up with a Python error, you probably need to install the `pynvim` package in pip:
```sh
python3 -m pip install --user --upgrade pynvim
```
Note that while there *is* a "`neovim`" package, it is deprecated for whatever annoying reason and should be removed when encountered.
- https://github.com/fsharp/zarchive-vim-fsharp/issues/96
## Disable System Config
The only way to fully avoid the system configurations is to set the `$VIM` environment variable to a new directory. NeoVim will expect certain things to be there, like `syntax/syntax.vim` and `autoloads/spellfile.vim` and `doc/*`
## Extract Theme Colors
The format the NeoVim returns colors in is incompatible with many plugins. Instead of returning a hex code, it returns a single raw number.
To convert it back into a usable format, you need to use `sprintf` notation:
```lua
("#%06x"):format(neovim_color_number)
```
- https://www.reddit.com/r/neovim/comments/14p34gt/question_what_is_the_format_of_highlights/
## Using Stdin with External Commands
In nearly every situation *except* NeoVim, a program can explicitly access `stdin` using `/dev/stdin` like this snippet from a [[Bash - Unix Shell|Bash]] script:[^3]
```sh
my_var=$(< /dev/stdin)
```
Somehow, NeoVim's developers broke this and are uninterested in fixing it, calling it a a problem with the external tools.[^2]
The only other portable solution is to use `cat`, which may be slower as it does a lot more work to accomplish the same task, although there may be reasons to use `cat` anyway.[^4]
# Resources
## Preconfigs
See: [[Vim Preconfigs]]
## Docs
- https://neovim.io/doc/user/syntax.html
- https://neovim.io/doc/user/syntax.html#highlight-groups (syntax highlighting, color themes)
- https://neovim.io/doc/user/tui.html#tui-colors
## Plugin Lists
- https://vimawesome.com/?q=neovim
- https://github.com/rockerBOO/awesome-neovim/blob/main/README.md
### Distros
- https://github.com/sontungexpt/stinvim
# Plugins
See also: [[Vim#Plugins]]
- [akinsho/toggleterm.nvim](https://github.com/akinsho/toggleterm.nvim): "A neovim lua plugin to help easily manage multiple terminal windows"
## Metaplugins
Plugins that contain a lot of configurable functionality.
- https://github.com/folke/snacks.nvim `folke/snacks.nvim`
- [[#Pickers]]
## Pickers
- https://github.com/2kabhishek/pickme.nvim
### Mini-Pick
- https://github.com/nvim-mini/mini.pick
- https://github.com/nvim-mini/mini.nvim/blob/main/readmes/mini-extra.md
### FZF-Lua
- https://github.com/ibhagwan/fzf-lua
### Telescope
Telescope is functionally abandoned,[^1] but still mostly working.
- https://github.com/nvim-telescope/telescope.nvim
## Notes and Wiki
- https://github.com/dhananjaylatkar/notes.nvim
- https://github.com/nvim-neorg/neorg
## Completion
- https://github.com/ncm2/ncm2 "a slim, async and hackable completion framework for neovim."
- [numToStr/Comment.nvim](https://github.com/numToStr/Comment.nvim) "Smart and powerful comment plugin for neovim. Supports treesitter, dot repeat, left-right/up-down motions, hooks, and more"
- [windwp/nvim-autopairs](https://github.com/windwp/nvim-autopairs): autopairs for neovim written in Lua
## Status Lines
### sttusline
- [sontungexpt/sttusline](https://github.com/sontungexpt/sttusline/tree/table_version) - "A very lightweight, super fast and lazyloading statusline plugin for Neovim written in lua."
### LuaLine
- https://nickjanetakis.com/blog/modify-lualine-in-neovim-to-show-word-count-and-reading-time
#### Components
- https://github.com/meuter/lualine-so-fancy.nvim
#### Builds
- [examples/slanted-gaps.lua](https://github.com/nvim-lualine/lualine.nvim/blob/master/examples/slanted-gaps.lua)
- [Lazyvim based config with centered filename and nord color scheme](https://github.com/nvim-lualine/lualine.nvim/discussions/1389)
### Incline
Incline is a plugin for creating lightweight floating statuslines. It works great with Neovim's global statusline (`:set laststatus=3`).
#### Builds
- [Diagnostics + Diff + Devicons + Filename + Modification indicator + Colorsheme for focused/unfocused](https://github.com/b0o/incline.nvim/discussions/75)
- [Diagnostics + Git Diff + Filename](https://github.com/b0o/incline.nvim/discussions/32)
### Tabs / Buffers
```cardlink
url: https://github.com/nanozuki/tabby.nvim
title: "GitHub - nanozuki/tabby.nvim: A declarative, highly configurable, and neovim style tabline plugin. Use your nvim tabs as a workspace multiplexer!"
description: "A declarative, highly configurable, and neovim style tabline plugin. Use your nvim tabs as a workspace multiplexer! - nanozuki/tabby.nvim"
host: github.com
favicon: https://github.githubassets.com/favicons/favicon.svg
image: https://opengraph.githubassets.com/6809e78dac4e32634bb9778de80eb96d462be933bb21d1cd12e63912f70f760d/nanozuki/tabby.nvim
```
```cardlink
url: https://github.com/akinsho/bufferline.nvim
title: "GitHub - akinsho/bufferline.nvim: A snazzy bufferline for Neovim"
description: "A snazzy bufferline for Neovim. Contribute to akinsho/bufferline.nvim development by creating an account on GitHub."
host: github.com
favicon: https://github.githubassets.com/favicons/favicon.svg
image: https://opengraph.githubassets.com/f22e6570f180a21d2bb25ed7fbe2a9e4cfbf57798be8c898689fd5f96a8a6f04/akinsho/bufferline.nvim
```
# References
[^1]: https://github.com/nvim-telescope/telescope.nvim/issues/3524
[^2]: https://github.com/neovim/neovim/issues/14049
[^3]: https://stackoverflow.com/a/65065987/1255156
[^4]: https://unix.stackexchange.com/questions/716438/whats-wrong-with-var-dev-stdin-to-read-stdin-into-a-variable