# Navigator - Easy code navigation, view diagnostic errors, see relationships of functions, variables - A plugin combines power of LSP and 🌲🏡 treesitter together. Not only provids a better highlight but also help you analyse symbol context effectively. Here are examples #### Example: Javascripts closure The following screenshot shows javascript call tree 🌲 of variable `browser` insides a closure. This feature is similar to incoming & outgoing calls from LSP. It is designed for the symbol analysis. ![js_closure_call_tree](https://user-images.githubusercontent.com/1681295/119120589-cee23700-ba6f-11eb-95c5-b9ac8d445c31.jpg) Explanation: - The first line of floating windows shows there are 3 references for the symbol *browser* in closure.js - The first reference of browser is an assignment, an emoji 📝 indicates the value changed in this line. In many cases, we search for references to find out where the value changed. - The second reference of `browser` is inside function `displayName` and `displayName` sit inside `makeFunc`, So you will see ` displayName{} <- makeFunc{}` - The third similar to the second, as var browser is on the right side of '=', the value not changed in this line and emoji is not shown. #### Example: C++ defination Another example for C++ ![cpp_ref](https://user-images.githubusercontent.com/1681295/119215215-8bd7a080-bb0f-11eb-82fc-8cdf1955e6e7.jpg) You may find that a 🦕 dinosaur(d) on the line of `Rectangle rect;` which means there is a defination (d for def) of rect in this line #### Golang struct type Struct type references in multiple Go ﳑ files ![go_reference](https://user-images.githubusercontent.com/1681295/119123823-54b3b180-ba73-11eb-8790-097601e10f6a.gif) This feature can provide you info in which function/class/method the variable was referenced. It is handy for large project where class/function definition is too long to fit into the preview window. Also provides a birdview of where the variable is - Referenced - Modified - Defined - called # Features: - LSP easy setup. Support the most commonly used lsp clients setup. Dynamic lsp activation based on buffer type. This also enables you to handle workspace combine mixed types of codes (e.g. Go + javascript + yml) - Out of box experience. 10 lines of minimum vimrc can turn your neovim into a full-featured LSP & Treesitter powered IDE - Unorthodox UI with floating windows, navigator provides a visual way to manage and navigate through symbols, diagnostic errors, reference etc. It covers all features(handler) provided by LSP from commonly used search reference, to less commonly used search for interface implementation. - Async request with lsp.buf_request for reference search - Treesitter symbol search. It is handy for large files (Some of LSP e.g. sumneko_lua, there is a 100kb file size limition?) - FZY search with Lua-JIT - Better navigation for diagnostic errors, Navigate through all files/buffers that contain errors/warnings - Grouping references/implementation/incoming/outgoing based on file names. - Treesitter based variable/function context analysis. It is 10x times faster compared to purely rely on LSP. In most of the case, it takes treesitter less than 4 ms to read and render all nodes for a file of 1,000 LOC. - The first plugin, IMO, that allows you to search in all treesitter symbols in the workspace. - Nerdfont, emoji for LSP and Treesitter kind - Optimize display (remove trailing bracket/space), display the caller of reference, de-duplicate lsp results (e.g reference in the same line). Using treesitter for file preview highlighter etc # Why a new plugin I'd like to go beyond what the system is providing. # Similar projects / special mentions: - [nvim-lsputils](https://github.com/RishabhRD/nvim-lsputils) - [nvim-fzy](https://github.com/mfussenegger/nvim-fzy.git) - [fuzzy](https://github.com/amirrezaask/fuzzy.nvim) - [lspsaga](https://github.com/glepnir/lspsaga.nvim) - [fzf-lsp lsp with fzf as gui backend](https://github.com/gfanto/fzf-lsp.nvim) - [nvim-treesitter-textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects) # Install Require nvim-0.5.0 (a.k.a nightly) You can remove your lspconfig setup and use this plugin. The plugin depends on lspconfig and [guihua.lua](https://github.com/ray-x/guihua.lua), which provides GUI and fzy support(migrate from [romgrk's project](romgrk/fzy-lua-native)). ```vim Plug 'neovim/nvim-lspconfig' Plug 'ray-x/guihua.lua', {'do': 'cd lua/fzy && make' } Plug 'ray-x/navigator.lua' ``` Note: Highly recommened: 'nvim-treesitter/nvim-treesitter' Packer ```lua use {'ray-x/navigator.lua', requires = {'ray-x/guihua.lua', run = 'cd lua/fzy && make'}} ``` ## Setup Easy setup **BOTH** lspconfig and navigator with one liner. Navigator covers arounds 20 most used LSP setup. ```lua lua require'navigator'.setup() ``` ## Sample vimrc turning your neovim into a full-featured IDE ```vim call plug#begin('~/.vim/plugged') Plug 'neovim/nvim-lspconfig' Plug 'ray-x/guihua.lua', {'do': 'cd lua/fzy && make' } Plug 'ray-x/navigator.lua' " Plug 'hrsh7th/nvim-compe' and other plugins you commenly use... " optional, if you need treesitter symbol support Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} call plug#end() " No need for rquire('lspconfig'), navigator will configure it for you lua < or `:q!` to kill the floating window - (or \, \) to move - \ or \ to open location or apply code actions. Note: \ might be bound in insert mode by other plugins ## Configuration In `navigator.lua` there is a default configuration. You can override the values by passing your own values e.g ```lua -- 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](https://github.com/ray-x/aurora) ### Reference Pls check the first part of README ### Document Symbol ![document symbol](https://github.com/ray-x/files/blob/master/img/navigator/doc_symbol.gif?raw=true) ### Workspace Symbol ![workspace symbol](https://github.com/ray-x/files/blob/master/img/navigator/workspace_symbol.gif?raw=true) # Current symbol highlight and jump backward/forward between symbols Document highlight provided by LSP. Jump between symbols between symbols with treesitter (with `]r` and `[r`) ![doc jump](https://github.com/ray-x/files/blob/master/img/navigator/doc_hl_jump.gif?raw=true) ### Diagnostic Diagnostic in single bufer ![diagnostic](https://github.com/ray-x/files/blob/master/img/navigator/diag.jpg?raw=true) Show diagnostic in all buffers ![diagnostic multi files](https://github.com/ray-x/files/blob/master/img/navigator/diagnostic_multiplefiles.jpg?raw=true) ### Implementation ![implementation](https://user-images.githubusercontent.com/1681295/118735346-967e0580-b883-11eb-8c1e-88c5810f7e05.jpg?raw=true) ### Fzy search in reference ![fzy_reference](https://github.com/ray-x/files/blob/master/img/navigator/fzy_reference.jpg?raw=true) ### Code actions ![code actions](https://github.com/ray-x/files/blob/master/img/navigator/codeaction.jpg?raw=true) #### Fill struct with gopls ![code actions fill struct](https://github.com/ray-x/files/blob/master/img/navigator/fill_struct.gif?raw=true) ### Code preview with highlight ![treesitter_preview](https://user-images.githubusercontent.com/1681295/118900852-4bccbe00-b955-11eb-82f6-0747b1b64e7c.jpg) ### Treesitter symbol Treetsitter symbols in all buffers ![treesitter](https://user-images.githubusercontent.com/1681295/118734953-cc6eba00-b882-11eb-9db8-0a052630d57e.jpg?raw=true) ### Signature help Improved signature help with current parameter highlighted ![signature](https://github.com/ray-x/files/blob/master/img/navigator/signature_with_highlight.jpg?raw=true) ![show_signature](https://github.com/ray-x/files/blob/master/img/navigator/show_signnature.gif?raw=true "show_signature") ### Call hierarchy (incomming/outgoing) ![incomming](https://github.com/ray-x/files/blob/master/img/navigator/incomming.jpg?raw=true) ### Light bulb if codeAction available ![lightbulb](https://github.com/ray-x/files/blob/master/img/navigator/lightbulb.jpg?raw=true) ### Predefined LSP symbol nerdfont/emoji ![nerdfont](https://github.com/ray-x/files/blob/master/img/navigator/icon_nerd.jpg?raw=true) # Break changes and known issues [known issues I am working on](https://github.com/ray-x/navigator.lua/issues/1) # Todo - The project is in the early phase, bugs expected, PRs 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. Did not test other languages (e.g dart, swift etc) - Configuration options