<ahref="https://patreon.com/chrisatmachine"title="Donate to this project using Patreon"><imgsrc="https://img.shields.io/badge/patreon-donate-yellow.svg"alt="Patreon donate button"/></a>
<ahref="https://twitter.com/intent/follow?screen_name=chrisatmachine"><imgsrc="https://img.shields.io/twitter/follow/chrisatmachine?style=social&logo=twitter"alt="follow on Twitter"></a>
LunarVim provides neovim configuration files that take advantage of tree-sitter and language server protocol. The configuration is written in lua.
## Why do I want tree-sitter and LSP?
* Normally, an editor uses regular expression parsing for things like highlighting and checking the syntax of your file. Each time you make a change, the editor must re-parse the entire file. Tree-sitter, on the other hand, transforms text into a syntax tree. Each time you make a change, only the parts of the code that change need to be parsed. This greatly improves the speed of parsing. This can make a huge difference when editing large files.
* Neovim 0.5 including language server protocol means your editor can provide: code actions, completions, formatting, navigating to definitions, renaming, etc. The language server only has to be written once and will work on any editor that supports LSP. Any improvements made to the language server will immediately be used by all editors that support LSP.
* This project aims to help one transition away from VSCode, and into a superior text editing experience. (Just making this clear)
* This is also a community project, if you would like to see support for a feature or [language](https://github.com/neovim/nvim-lspconfig/blob/master/CONFIG.md) consider making a PR.
* This project will do it's best to include core features you would expect from a modern IDE, while making it easy to add or remove what the user wants.
Some operating systems package versions of Neovim 0.5. You can install those or you can follow the steps below to compile from source. Compiling from source is the recommended method.
First, get the dependencies. For distributions other than Ubuntu or Arch go [here](https://github.com/neovim/neovim/wiki/Building-Neovim#build-prerequisites)
The home screen is a plugin called [Dashboard](https://github.com/glepnir/dashboard-nvim). It uses the [Telescope](https://github.com/nvim-telescope/telescope.nvim) plugin to find files or find words within files. The home screen provides a link to load saved Sessions. The home screen links to the settings file located at this path: ~/.config/nvim/lv-settings.lua
The default leader key is set to \<Space>. Pressing it will also open up [Whichkey](https://github.com/folke/which-key.nvim). Whichkey will help you easily access many of the default keybindings.
Or you can translate your old bindings to lua and keep them in the provided keymappings file. Follow the lua guide available [here](https://github.com/nanotee/nvim-lua-guide)
## Important Configuration files
| Path | Description |
|------|-------------|
|~/.config/nvim/lv-settings.lua | The main settings file |
[Packer](https://github.com/wbthomason/packer.nvim) manages your installed plugins. Any time you make changes to your list of plugins in ~/.config/nvim/lua/plugins.lua you must first run the command :PackerCompile then :PackerInstall.
LunarVim lists the attached lsp server in the bottom status bar. If it says 'No client connected' use :LspInfo to troubleshoot.
### Understanding LspInfo
1. Make sure there is a client attached to the buffer. 0 attached clients means lsp is not running
2. Active clients are clients in other files you have open
3. Clients that match the filetype will be listed. If installed with :LspInstall <servername> the language servers will be installed.
4. 'cmd' must be populated. This is the language server executable. If the 'cmd' isn't set or if it's not executable you won't be able to run the language server.
* In the example below 'efm-langserver' is the name of the binary that acts as the langserver. If we run 'which efm-langserver' and we get a location to the executable, it means the langauge server is installed and available globally.
* If you know the command is installed AND you don't want to install it globally you'll need to manually set the cmd in the language server settings. Configurations are stored in ~/.config/nvim/lua/lsp/ The settings will be stored in a file that matches the name of the language. e.g. python-ls.lua
* 'identified root' must also be populated. Most language servers require you be inside a git repository for the root to be detected. If you don't want to initialize the directory as a git repository, an empty .git/ folder will also work.
5. Some language servers get set up on a per project basis so you may have to reinstall the language server when you move to a different project.
If you still have problems after implementing the above measures, rule out plugin problems with the following. This reinstalls your plugins and language servers.
Color schemes are provided by [this repository](https://github.com/ChristianChiarulli/nvcode-color-schemes.vim). Follow that link for information about editing specific colors for a color scheme. The provided color schemes are compatible with tree-sitter highlight groups. Color schemes are installed to ~/.local/share/nvim/site/pack/packer/opt/nvcode-color-schemes.vim. If you edit files in that directory, they will be overwritten the next time Packer compiles your plugins.
## Available colorschemes:
```bash
nvcode (basically just dark+)
onedark
nord
aurora (more colorful nord)
gruvbox
palenight
snazzy (Based on hyper-snazzy by Sindre Sorhus)
```
## Switching colors
To switch color schemes on the fly, type the following command:
Whether you plan on using LunarVim as is or as a base to configure your own neovim, the following commands may be useful. Any command that includes the symbol ':' is meant to be typed as a command in neovim. Make sure you're in normal mode not insert mode.
| Command | Description |
|------|-------------|
| :checkhealth | Check the health of your neovim install |
| :checkhealth \<pluginname> | Check the health of a plugin |
| nvim -v | checks your neovim version |
| nvim -V | vebose output when running neovim. Prints out every event |
| :PackerCompile | Must be run when you make plugin changes. (or, alternately run :PackerSync) |
| :PackerInstall | Only install missing plugins|
| :PackerUpdate | Update and install plugins |
|:PackerClean | Remove any disabled or unused plugins |
|:PackerSync | Performs 'PackerClean' then 'PackerUpdate' |
|:PackerStatus | List the status of your plugins |
|:LspInstall \<language> | Install a language server for a specific programming language |
| :LspInfo | List the status of active and configured language servers|
|:LspStart \<language> | Start the requested server name. Will only succesfully start if the command detects a root directory matching the current config. Pass autostart = false to your .setup{} call for a language server if you would like to launch clients solely with this command. Defaults to all servers matching current buffer filetype. |
|:LspStop | Stops all buffer clients|
|:LspRestart | Restarts all buffer clients|
|:map | List keybindings |
|:nmap | List normal mode keybindings |
|:vmap | List visual mode keybindings |
|:imap | List insert mode keybindings |
|:verbose imap \<keybinding> | Print out what a particular keybinding is mapped to|
|:messages | Print error messages. Useful when messages get cut off|