lua | ||
plugin | ||
LICENSE | ||
README.md |
Navigator
Easy code navigation through LSP and 🌲🏡Treesitter symbols, diagnostic errors.
Features:
- LSP easy setup. Support some of the most commonly used lsp client setup
- Unorthodox UI with floating windows
- Async request with lsp.buf_request for reference search
- Treesitter symbol search. It is handy for large file (Do you know some of LSP e.g. sumneko_lua, there is a 100kb limition?)
- fzy search with Lua-JIT
- Better navigation for diagnostic errors, Navigate through files that contain errors/warnings
- Group references/implementation/incomming/outgoing based on file names.
- Nerdfont, emoji for LSP and Treesitter kind
Why a new plugin
After installed a handful of lsp plugins, I still got ~800 loc for lsp and treesitter and still increasing because I need to tune the lsp plugins to fit my requirements. Navigator.lua help user setup lspconfig with only a few lines of codes. This plugin provide a visual way to manage and navigate through symobls, errors etc. It also the first plugin, IMO, that allows you to search in all treesitter symbols in the workspace.
Similar projects / special mentions:
Install
You can remove your lspconfig setup and use this plugin. The plugin depends on guihua.lua, which provides GUI and fzy support(thanks romgrk).
Plug 'ray-x/guihua.lua', {'do': 'cd lua/fzy && make' }
Plug 'ray-x/navigator.lua'
Packer
use {'ray-x/navigator.lua', requires = {'ray-x/guihua.lua', run = 'cd lua/fzy && make'}}
Setup
lua require'navigator'.setup()
Sample vimrc
call plug#begin('~/.vim/plugged')
Plug 'neovim/nvim-lspconfig'
Plug 'ray-x/guihua.lua', {'do': 'cd lua/fzy && make' }
Plug 'ray-x/navigator.lua'
" optional if you need treesitter symbol support
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
call plug#end()
lua <<EOF
local nvim_lsp = require('lspconfig')
require'navigator'.setup()
EOF
Generally speaking, you could remove most part of your lspconfig.lua and use the hooks in navigator.lua
Dependency
- lspconfig
- guihua.lua (provides floating window, FZY)
- Optional:
- treesitter (list treesitter symbols)
- lsp-signature
- vim-illuminate
The plugin can be loaded lazily (packer opt = true
), And it will check if optional plugins existance and load those plugins only if they existed.
Usage
Please refer to lua/navigator/lspclient/mapping.lua on key mappings. Should be able to work out-of-box.
- Use <c-e> or
:q!
to kill the floating window - <up/down> (or <c-n>, <c-p>) to move
- <c-o> to open location or apply code actions
Configuration
In navigator.lua
there is a default configration. You can override the values by pass you own values
e.g
-- The attach will be call at end of navigator on_attach()
require'navigator'.setup({on_attach = function(client, bufnr) require 'illuminate'.on_attach(client)})
Screenshots
colorscheme: aurora
Reference
Document Symbol
Workspace Symbol
Diagnostic
Diagnostic in single bufer
Show diagnostic in all buffers
Implementation
Fzy search in reference
Code actions
Code preview with highlight
Treesitter symbol
Treetsitter symbols in all buffers
Signature help
Improved signature help with current parameter highlighted
Call hierarchy (incomming/outgoing)
Light bulb when codeAction avalible
Predefined LSP symbol nerdfont/emoji
Todo
- Early phase, bugs expected, PR and suggestions are welcome
- Async (some of the requests is slow on large codebases and might be good to use co-rountine)
- More clients. I use go, python, js/ts, java, c/cpp, lua most of the time. Do not test other languages (e.g dart, swift etc)
- Configuration options