navigator.lua/README.md

882 lines
34 KiB
Markdown
Raw Normal View History

2021-04-19 02:56:32 +00:00
# Navigator
- Source code analysis and navigate tool
2021-04-19 02:56:32 +00:00
- Easy code navigation, view diagnostic errors, see relationships of functions, variables
2021-04-19 02:56:32 +00:00
2021-06-14 09:42:50 +00:00
- A plugin combines the power of LSP and 🌲🏡 Treesitter together. Not only provids a better highlight but also help you analyse symbol context effectively.
- ctags fuzzy search & build ctags symbols
-
2021-12-25 06:27:37 +00:00
- [![a short intro of navigator](https://user-images.githubusercontent.com/1681295/147378905-51eede5f-e36d-48f4-9799-ae562949babe.jpeg)](https://youtu.be/P1kd7Y8AatE)
2021-12-25 06:14:55 +00:00
Here are some examples
#### Example: Javascript 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.
2021-07-17 02:34:07 +00:00
2021-07-17 02:41:06 +00:00
![navigator](https://user-images.githubusercontent.com/1681295/126022829-291a7a2e-4d24-4fde-8293-5ae61562e67d.jpg)
Explanation:
- The first line of floating windows shows there are 3 references for the symbol <span style="color:red"> _browser_ </span> in closure.js
- The first reference of browser is an assignment, an emoji 📝 indicates the value is changed in this line. In many
cases, we search for references to find out when 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.
2021-08-23 12:17:47 +00:00
#### Example: C++ definition
2021-08-23 12:17:47 +00:00
C++ example: search reference and definition
![cpp_ref](https://user-images.githubusercontent.com/1681295/119215215-8bd7a080-bb0f-11eb-82fc-8cdf1955e6e7.jpg)
You may find a 🦕 dinosaur(d) on the line of `Rectangle rect,` which means there is a definition (d for def) of rect in this line.
2021-08-21 23:19:11 +00:00
`<- f main()` means the definition is inside function main().
#### 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 a large
2021-08-21 23:19:11 +00:00
project where class/function definition is too long to fit into the preview window. Also provides a bird's eye view of where the
variable is:
- Referenced
- Modified
- Defined
- Called
2021-04-19 02:56:32 +00:00
# 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 with mixed types of codes (e.g. Go + javascript + yml). A better default setup is
included for LSP clients.
2021-05-05 19:58:15 +00:00
- Out of box experience. 10 lines of minimum vimrc can turn your neovim into a full-featured LSP & Treesitter powered IDE
- 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.
2021-11-13 10:58:40 +00:00
- Code Action GUI
- Luv async thread and tasks
2021-06-14 02:39:40 +00:00
- Edit your code in preview window
2021-04-26 11:45:45 +00:00
- 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 limitation?). Also as LSP trying to hide details behind, Treesitter allows you to access all AST semantics.
- FZY search with either native C (if gcc installed) or Lua-JIT
- LSP multiple symbols highlight/marker and hop between document references
2021-05-29 11:08:30 +00:00
- Preview definination/references
- 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, allows you to search in all treesitter symbols in the workspace.
2021-08-19 15:19:38 +00:00
- Nerdfont, emoji for LSP and treesitter kind
2021-04-19 02:56:32 +00:00
- 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
2021-06-23 15:17:43 +00:00
- ccls call hierarchy (Non-standard `ccls/call` API) supports
- Syntax folding based on treesitter or LSP_fold folding algorithm. (It behaves similar to vs-code); dedicated comment folding.
- Treesitter symbols sidebar, LSP document symbole sidebar. Both with preview and folding
2021-08-21 23:19:11 +00:00
- Calltree: Display and expand Lsp incoming/outgoing calls hierarchy-tree with sidebar
2021-09-08 01:12:20 +00:00
- Fully support LSP CodeAction, CodeLens, CodeLens action. Help you improve code quality.
2021-08-19 15:19:38 +00:00
2021-08-29 07:35:46 +00:00
- LRU cache for treesitter nodes
- Lazy loader friendly
2021-10-28 06:10:46 +00:00
- Multigrid support (different font and detachable)
2021-10-28 06:08:36 +00:00
- Side panel (sidebar) and floating windows
2021-04-19 02:56:32 +00:00
# Why a new plugin
2021-09-07 11:08:00 +00:00
I'd like to go beyond what the system is offering.
2021-04-19 02:56:32 +00:00
# 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)
2021-04-20 07:42:03 +00:00
- [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)
2021-04-19 02:56:32 +00:00
# Install
Require nvim-0.6.1 or above, nightly (0.8) prefered
2021-04-19 02:56:32 +00:00
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)).
2021-04-19 02:56:32 +00:00
```vim
2021-05-09 23:58:13 +00:00
Plug 'neovim/nvim-lspconfig'
2021-04-19 02:56:32 +00:00
Plug 'ray-x/guihua.lua', {'do': 'cd lua/fzy && make' }
Plug 'ray-x/navigator.lua'
```
Note: Highly recommend: 'nvim-treesitter/nvim-treesitter'
2021-04-19 02:56:32 +00:00
Packer
```lua
use({
'ray-x/navigator.lua',
requires = {
{ 'ray-x/guihua.lua', run = 'cd lua/fzy && make' },
{ 'neovim/nvim-lspconfig' },
},
})
2021-04-19 02:56:32 +00:00
```
## Setup
Easy setup **BOTH** lspconfig and navigator with one liner. Navigator covers around 20 most used LSP setup.
2021-05-02 13:54:30 +00:00
2021-04-19 02:56:32 +00:00
```lua
lua require'navigator'.setup()
```
## Sample vimrc turning your neovim into a full-featured IDE
2021-04-24 10:30:31 +00:00
```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'
2021-12-25 06:14:55 +00:00
" Plug 'hrsh7th/nvim-cmp' and other plugins you commenly use...
" optional, if you need treesitter symbol support
Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
2021-04-24 10:30:31 +00:00
call plug#end()
2021-12-26 10:09:25 +00:00
" No need for require('lspconfig'), navigator will configure it for you
2021-04-24 10:30:31 +00:00
lua <<EOF
require'navigator'.setup()
EOF
```
You can remove your lspconfig.lua and use the hooks of navigator.lua. As the
navigator will bind keys and handler for you. The LSP will be loaded lazily based on filetype.
A treesitter only mode. In some cases LSP is buggy or not available, you can also use treesitter
standalone
```vim
call plug#begin('~/.vim/plugged')
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'}
" optional:
Plug 'nvim-treesitter/nvim-treesitter-refactor' " this provides "go to def" etc
call plug#end()
lua <<EOF
require'navigator'.setup()
EOF
```
2021-11-03 04:26:08 +00:00
## Work with nvim-cmp and nvim-autopairs
The buffer type of navigator floating windows is `guihua`
I would suggest disable `guihua` for autocomplete.
e.g.
```lua
require('nvim-autopairs').setup{
2021-11-06 01:21:20 +00:00
disable_filetype = { "TelescopePrompt" , "guihua", "guihua_rust", "clap_input" },
2021-11-03 04:26:08 +00:00
2021-11-06 01:21:20 +00:00
if vim.o.ft == 'clap_input' and vim.o.ft == 'guihua' and vim.o.ft == 'guihua_rust' then
2021-11-03 04:26:08 +00:00
require'cmp'.setup.buffer { completion = {enable = false} }
end
2021-11-06 01:21:20 +00:00
-- or with autocmd
vim.cmd("autocmd FileType guihua lua require('cmp').setup.buffer { enabled = false }")
vim.cmd("autocmd FileType guihua_rust lua require('cmp').setup.buffer { enabled = false }")
2021-11-03 04:26:08 +00:00
...
}
```
## All configure options
Nondefault configuration example:
```lua
2021-07-16 09:14:26 +00:00
require'navigator'.setup({
debug = false, -- log output, set to true and log path: ~/.cache/nvim/gh.log
2021-06-25 10:18:55 +00:00
width = 0.75, -- max width ratio (number of cols for the floating window) / (window width)
height = 0.3, -- max list window height, 0.3 by default
preview_height = 0.35, -- max height of preview windows
2021-06-15 23:51:57 +00:00
border = {"╭", "─", "╮", "│", "╯", "─", "╰", "│"}, -- border style, can be one of 'none', 'single', 'double',
-- 'shadow', or a list of chars which defines the border
2021-06-25 10:18:55 +00:00
on_attach = function(client, bufnr)
-- your hook
end,
-- put a on_attach of your own here, e.g
-- function(client, bufnr)
-- -- the on_attach will be called at end of navigator on_attach
-- end,
-- The attach code will apply to all LSP clients
default_mapping = true, -- set to false if you will remap every key or if you using old version of nvim-
keymaps = {{key = "gK", func = vim.lsp.declaration, doc = 'declaration'}}, -- a list of key maps
-- this kepmap gK will override "gD" mapping function declaration() in default kepmap
-- please check mapping.lua for all keymaps
treesitter_analysis = true, -- treesitter variable context
treesitter_analysis_max_num = 100, -- how many items to run treesitter analysis
-- this value prevent slow in large projects, e.g. found 100000 reference in a project
transparency = 50, -- 0 ~ 100 blur the main window, 100: fully transparent, 0: opaque, set to nil or 100 to disable it
lsp_signature_help = true, -- if you would like to hook ray-x/lsp_signature plugin in navigator
-- setup here. if it is nil, navigator will not init signature help
signature_help_cfg = nil, -- if you would like to init ray-x/lsp_signature plugin in navigator, and pass in your own config to signature help
2021-06-15 23:51:57 +00:00
icons = {
-- Code action
code_action_icon = "🏏", -- note: need terminal support, for those not support unicode, might crash
2021-06-15 23:51:57 +00:00
-- Diagnostics
diagnostic_head = '🐛',
diagnostic_head_severity_1 = "🈲",
-- refer to lua/navigator.lua for more icons setups
2021-06-25 10:18:55 +00:00
},
lsp_installer = false, -- set to true if you would like use the lsp installed by williamboman/nvim-lsp-installer
lsp = {
2022-06-13 22:56:49 +00:00
enable = true, -- skip lsp setup if disabled make sure add require('navigator.lspclient.mapping').setup() in you
-- own on_attach
code_action = {enable = true, sign = true, sign_priority = 40, virtual_text = true},
code_lens_action = {enable = true, sign = true, sign_priority = 40, virtual_text = true},
2021-12-26 10:08:28 +00:00
format_on_save = true, -- set to false to disable lsp code format on save (if you are using prettier/efm/formater etc)
format_options = {async=false}, -- async: disable by default, the option used in vim.lsp.buf.format({async={true|false}, name = 'xxx'})
disable_format_cap = {"sqls", "sumneko_lua", "gopls"}, -- a list of lsp disable format capacity (e.g. if you using efm or vim-codeformat etc), empty {} by default
2021-08-21 23:19:11 +00:00
disable_lsp = {'pylsd', 'sqlls'}, -- a list of lsp server disabled for your project, e.g. denols and tsserver you may
-- only want to enable one lsp server
-- to disable all default config and use your own lsp setup set
-- disable_lsp = 'all'
-- Default {}
2022-02-17 11:21:34 +00:00
diagnostic = {
underline = true,
virtual_text = true, -- show virtual for diagnostic message
update_in_insert = false, -- update diagnostic message in insert mode
},
diagnostic_scrollbar_sign = {'▃', '▆', '█'}, -- experimental: diagnostic status in scroll bar area; set to false to disable the diagnostic sign,
-- for other style, set to {'╍', 'ﮆ'} or {'-', '='}
2021-08-23 23:17:20 +00:00
diagnostic_virtual_text = true, -- show virtual for diagnostic message
diagnostic_update_in_insert = false, -- update diagnostic message in insert mode
disply_diagnostic_qf = true, -- always show quickfix if there are diagnostic errors, set to false if you want to
ignore it
tsserver = {
filetypes = {'typescript'} -- disable javascript etc,
2021-06-17 22:50:49 +00:00
-- set to {} to disable the lspclient for all filetypes
},
ctags ={
cmd = 'ctags',
tagfile = 'tags'
options = '-R --exclude=.git --exclude=node_modules --exclude=test --exclude=vendor --excmd=number'
}
gopls = { -- gopls setting
on_attach = function(client, bufnr) -- on_attach for gopls
-- your special on attach here
-- e.g. disable gopls format because a known issue https://github.com/golang/go/issues/45732
print("i am a hook, I will disable document format")
client.resolved_capabilities.document_formatting = false
end,
settings = {
gopls = {gofumpt = false} -- disable gofumpt etc,
}
2021-06-15 23:51:57 +00:00
},
sumneko_lua = {
sumneko_root_path = vim.fn.expand("$HOME") .. "/github/sumneko/lua-language-server",
sumneko_binary = vim.fn.expand("$HOME") .. "/github/sumneko/lua-language-server/bin/macOS/lua-language-server",
},
2022-01-10 14:13:23 +00:00
servers = {'cmake', 'ltex'}, -- by default empty, and it should load all LSP clients avalible based on filetype
-- but if you whant navigator load e.g. `cmake` and `ltex` for you , you
2021-11-26 07:26:30 +00:00
-- can put them in the `servers` list and navigator will auto load them.
-- you could still specify the custom config like this
-- cmake = {filetypes = {'cmake', 'makefile'}, single_file_support = false},
}
})
```
### LSP clients
Built clients:
```lua
local servers = {
"angularls", "gopls", "tsserver", "flow", "bashls", "dockerls", "julials", "pylsp", "pyright",
"jedi_language_server", "jdtls", "sumneko_lua", "vimls", "html", "jsonls", "solargraph", "cssls",
"yamlls", "clangd", "ccls", "sqls", "denols", "graphql", "dartls", "dotls",
"kotlin_language_server", "nimls", "intelephense", "vuels", "phpactor", "omnisharp",
2022-03-05 10:27:25 +00:00
"r_language_server", "rust_analyzer", "terraformls", "svelte", "texlab", "clojure_lsp", "elixirls",
"sourcekit", "fsautocomplete", "vls", "hls"
}
```
Navigator will try to load avalible lsp server/client based on filetype. The clients has none default on_attach.
incremental sync and debounce is enabled by navigator. And the lsp
snippet will be enabled. So you could use COQ and nvim-cmp snippet expand.
Other than above setup, additional none default setup are used for following lsp:
- gopls
- clangd
- rust_analyzer
- sqls
- sumneko_lua
- pyright
- ccls
Please check [client setup](https://github.com/ray-x/navigator.lua/blob/26012cf9c172aa788a2e53018d94b32c5c75af75/lua/navigator/lspclient/clients.lua#L98-L234)
The plugin can work with multiple LSP, e.g sqls+gopls+efm. But there are cases you may need to disable some of the
2021-09-28 02:05:57 +00:00
servers. (Prevent loading multiple LSP for same source code.) e.g. I saw strange behaviours when I use
pylsp+pyright+jedi
together. If you have multiple similar LSP installed and have trouble with the plugin, please enable only one at a time.
2021-11-26 07:26:30 +00:00
#### Add your own servers
Above servers covered a small part neovim lspconfig support, You can still use lspconfig to add and config servers not
in the list. If you would like to add a server not in the list, you can check this PR https://github.com/ray-x/navigator.lua/pull/107
2022-02-19 03:59:31 +00:00
Alternatively, update following option in setup(if you do not want a PR):
2021-11-26 07:26:30 +00:00
```lua
require'navigator'setup{lsp={servers={'cmake', 'lexls'}}}
```
2022-02-19 03:59:31 +00:00
Above option add cmake and lexls to the default server list
2021-10-24 01:30:52 +00:00
### Disable a lsp client loading from navigator
2021-11-26 07:26:30 +00:00
Note: If you have multiple lsp installed for same language, please only enable one at a time by disable others with e.g. `disable_lsp={'denols', 'clangd'}`
To disable a specific LSP, set `filetypes` to {} e.g.
```lua
2021-07-16 09:14:26 +00:00
require'navigator'.setup({
lsp={
pylsd={filetype={}}
}
})
2021-04-24 10:30:31 +00:00
```
Or:
```lua
require'navigator'.setup({
lsp={
disable_lsp = {'pylsd', 'sqlls'},
}
})
```
### Try it your self
2022-01-13 23:36:54 +00:00
In `playground` folder, there is a `init.lua` and source code for you to play with. Check [playground/README.md](https://github.com/ray-x/navigator.lua/blob/master/playground/README.md) for more details
### Default keymaps
| mode | key | function |
| ---- | --------------- | ---------------------------------------------------------- |
2022-02-24 08:03:50 +00:00
| n | gr | async references, definitions and context |
| n | \<Leader>gr | show reference and context |
| i | \<m-k\> | signature help |
| n | \<c-k\> | signature help |
| n | gW | workspace symbol |
| n | gD | declaration |
| n | gd | definition |
| n | g0 | document symbol |
| n | \<C-]\> | go to definition (if multiple show listview) |
| n | gp | definition preview (Go to Preview) |
| n | \<C-LeftMouse\> | definition |
| n | g\<LeftMouse\> | implementation |
2022-01-12 09:12:51 +00:00
| n | \<Leader>gt | treesitter document symbol |
| n | \<Leader\>gT | treesitter symbol for all open buffers |
| n | \<Leader\> ct | ctags symbol search |
| n | \<Leader\> cg | ctags symbol generate |
| n | K | hover doc |
2021-11-13 10:58:40 +00:00
| n | \<Space\>ca | code action (when you see 🏏 ) |
| n | \<Space\>la | code lens action (when you see a codelens indicator) |
| v | \<Space\>ca | range code action (when you see 🏏 ) |
| n | \<Space\>rn | rename with floating window |
| n | \<Leader\>re | rename (lsp default) |
2021-11-18 03:49:36 +00:00
| n | \<Leader\>gi | hierarchy incoming calls |
| n | \<Leader\>go | hierarchy outgoing calls |
| n | gi | implementation |
| n | \<Space\> D | type definition |
| n | gL | show line diagnostic |
| n | gG | show diagnostic for all buffers |
| n | ]d | next diagnostic |
| n | [d | previous diagnostic |
| n | \<Leader\> dt | diagnostic toggle(enable/disable) |
| n | ]r | next treesitter reference/usage |
| n | [r | previous treesitter reference/usage |
| n | \<Space\> wa | add workspace folder |
| n | \<Space\> wr | remove workspace folder |
| n | \<Space\> wl | print workspace folder |
| n | \<Leader\>k | toggle reference highlight |
| i/n | \<C-p\> | previous item in list |
| i/n | \<C-n\> | next item in list |
| i/n | number 1~9 | move to ith row/item in the list |
| i/n | \<Up\> | previous item in list |
| i/n | \<Down\> | next item in list |
| n | \<Ctrl-w\>j | move cursor to preview (windows move to bottom view point) |
| n | \<Ctrl-w\>k | move cursor to list (windows move to up view point) |
| i/n | \<C-o\> | open preview file in nvim/Apply action |
| n | \<C-v\> | open preview file in nvim with vsplit |
| n | \<C-s\> | open preview file in nvim with split |
| n | \<Enter\> | open preview file in nvim/Apply action |
2021-09-27 00:36:12 +00:00
| n | \<ESC\> | close listview of floating window |
| i/n | \<C-e\> | close listview of floating window |
| i/n | \<C-b\> | previous page in listview |
| i/n | \<C-f\> | next page in listview |
| i/n | \<C-s\> | save the modification to preview window to file |
### Colors/Highlight:
2021-05-24 10:20:28 +00:00
2021-09-20 22:49:03 +00:00
You can override default highlight GHListDark (listview) and GHTextViewDark (code view) and GHListHl (select item)
2021-05-24 10:20:28 +00:00
e.g.
```vim
hi default GHTextViewDark guifg=#e0d8f4 guibg=#332e55
hi default GHListDark guifg=#e0d8f4 guibg=#103234
2021-09-20 22:49:03 +00:00
hi default GHListHl guifg=#e0d8f4 guibg=#404254
2021-05-24 10:20:28 +00:00
```
There are other Lsp highlight been used in this plugin, e.g LspReferenceRead/Text/Write are used for document highlight,
LspDiagnosticsXXX are used for diagnostic. Please check highlight.lua and dochighlight.lua for more info.
2021-04-25 10:34:33 +00:00
## Dependency
- lspconfig
2021-04-25 10:34:33 +00:00
- guihua.lua (provides floating window, FZY)
- Optional:
- treesitter (list treesitter symbols, object analysis)
- lsp-signature (better signature help)
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.
The terminal will need to be able to output nerdfont and emoji correctly. I am using Kitty with nerdfont (Victor Mono).
2021-05-05 00:23:40 +00:00
2022-01-10 14:13:23 +00:00
## Integrat with lsp_installer (williamboman/nvim-lsp-installer)
2022-01-10 14:13:23 +00:00
If you are using lsp_installer and would like to use the lsp servers installed by lsp_installer. Please set
```lua
2021-10-18 02:15:17 +00:00
lsp_installer = true
```
2022-01-10 14:13:23 +00:00
In the config. Also please setup the lsp server from installer setup with `server:setup{opts}`
2021-09-24 01:54:03 +00:00
2022-06-12 10:44:20 +00:00
example:
```lua
use({
'williamboman/nvim-lsp-installer',
config = function()
local lsp_installer = require('nvim-lsp-installer')
lsp_installer.setup{}
end,
})
use({
'ray-x/navigator.lua',
config = function()
require('navigator').setup({
debug = true,
lsp_installer = true,
keymaps = { { key = 'gR', func = "require('navigator.reference').async_ref()" } },
})
end,
})
```
Please refer to [lsp_installer_config](https://github.com/ray-x/navigator.lua/blob/master/playground/init_lsp_installer.lua)
for more info
Alternatively, Navigator can be used to startup the server installed by lsp-installer.
2021-10-18 02:15:17 +00:00
as it will override the navigator setup
2022-01-10 14:13:23 +00:00
To start LSP installed by lsp_installer, please use following setups
2021-09-24 01:54:03 +00:00
```lua
require'navigator'.setup({
2021-10-18 02:15:17 +00:00
-- lsp_installer = false -- default value is false
2021-09-24 01:54:03 +00:00
lsp = {
tsserver = { cmd = {'your tsserver installed by lsp_installer'} }
2021-09-24 01:54:03 +00:00
}
})
```
2021-10-18 02:15:17 +00:00
example cmd setup (mac) for pyright :
```
2022-01-10 14:13:23 +00:00
require'navigator'.setup({
-- lsp_installer = false -- default value is false
lsp = {
tsserver = {
cmd = { "/Users/username/.local/share/nvim/lsp_servers/python/node_modules/.bin/pyright-langserver", "--stdio" }
}
}
}
2021-10-18 02:15:17 +00:00
```
The lsp servers installed by nvim-lsp-installer is in following dir
2021-12-23 05:40:32 +00:00
```lua
local path = require 'nvim-lsp-installer.path'
local install_root_dir = path.concat {vim.fn.stdpath 'data', 'lsp_servers'}
```
And you can setup binary full path to this: (e.g. with gopls)
2022-01-10 14:13:23 +00:00
`install_root_dir .. '/go/gopls'` So the config is
```lua
local path = require 'nvim-lsp-installer.path'
local install_root_dir = path.concat {vim.fn.stdpath 'data', 'lsp_servers'}
require'navigator'.setup({
-- lsp_installer = false -- default value is false
lsp = {
gopls = {
cmd = { install_root_dir .. '/go/gopls' }
}
}
}
```
2022-03-04 06:20:03 +00:00
Use lsp_installer configs
You can delegate the lsp server setup to lsp_installer with `server:setup{opts}`
Here is an example [init_lsp_installer.lua](https://github.com/ray-x/navigator.lua/blob/master/playground/init_lsp_installer.lua)
### Integration with other lsp plugins (e.g. rust-tools, go.nvim, clangd extension)
2022-06-15 07:38:38 +00:00
There are lots of plugins provides lsp support
go.nvim allow you either hook gopls from go.nvim or from navigator and it can export the lsp setup from go.nvim.
rust-tools and clangd allow you to setup on_attach from config server
2022-06-15 07:38:38 +00:00
Here is an example to setup rust with rust-tools
```lua
require'navigator'.setup({
lsp = {
disable_lsp = { "rust_analyzer", "clangd" }, -- will not run rust_analyzer setup from navigator
2022-06-15 07:38:38 +00:00
}
})
require('rust-tools').setup({
server = {
on_attach = function(client, bufnr)
require('navigator.lspclient.mapping').setup({client=client, bufnr=bufnr}) -- setup navigator keymaps here,
2022-06-15 07:38:38 +00:00
-- otherwise, you can define your own commands to call navigator functions
end,
}
})
require("clangd_extensions").setup {
server = {
on_attach = function(client, bufnr)
require('navigator.lspclient.mapping').setup({client=client, bufnr=bufnr}) -- setup navigator keymaps here,
-- otherwise, you can define your own commands to call navigator functions
end,
}
}
2022-06-15 07:38:38 +00:00
```
2021-04-19 03:09:32 +00:00
## Usage
2021-04-24 10:30:31 +00:00
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
2021-04-25 03:58:32 +00:00
- <up/down> (or \<c-n\>, \<c-p\>) to move
- \<c-o\> or \<CR\> to open location or apply code actions. Note: \<CR\> might be bound in insert mode by other plugins
2021-04-19 03:09:32 +00:00
2021-04-26 11:21:01 +00:00
## Configuration
In `navigator.lua` there is a default configuration. You can override the values by passing your own values
2021-04-26 11:21:01 +00:00
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)})
```
## Highlight
Highlight I am using:
- LspReferenceRead, LspReferenceText and LspReferenceWrite are used for `autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()`
That is where you saw the current symbol been highlighted.
- GHListDark and GHTextViewDark is used for floating listvew and TextView. They are be based on current background
(Normal) and PmenuSel
- In future, I will use NormalFloat for floating view. But ATM, most of colorscheme does not define NormalFloat
You can override the above highlight to fit your current colorscheme
2021-07-23 00:44:55 +00:00
## commands
2021-12-23 05:40:32 +00:00
| command | function |
| ------------ | ------------------------- |
| LspToggleFmt | toggle lsp auto format |
| LspKeymaps | show LSP releated keymaps |
| Nctags {args} | show ctags symbols, args: -g regen ctags |
| LspRestart | reload lsp |
| LspToggleFmt | toggle lsp format |
| LspSymbols | document symbol in side panel |
| TSymobls | treesitter symbol in side panel |
| Calltree {args} | lsp call hierarchy call tree, args: -i (incomming default), -o (outgoing) |
2021-07-23 00:44:55 +00:00
2021-04-19 02:56:32 +00:00
## Screenshots
2021-04-25 10:34:33 +00:00
colorscheme: [aurora](https://github.com/ray-x/aurora)
2021-04-24 10:30:31 +00:00
2021-04-19 02:56:32 +00:00
### Reference
Pls check the first part of README
2021-05-08 04:54:37 +00:00
### Definition preview
Using treesitter and LSP to view the symbol definition
![image](https://user-images.githubusercontent.com/1681295/139771978-bbc970a5-be9f-42cf-8942-3477485bd89c.png)
### Sidebar, folding, outline
Treesitter outline and Diagnostics
<img width="708" alt="image" src="https://user-images.githubusercontent.com/1681295/174791609-0023e68f-f1f4-4335-9ea2-d2360e9f0bfd.png">
<img width="733" alt="image" src="https://user-images.githubusercontent.com/1681295/174804579-26f87fbf-426b-46d0-a7a3-a5aab69c032f.png">
2022-07-02 11:24:56 +00:00
Calltree (Expandable LSP call hierarchy)
<img width="769" alt="image" src="https://user-images.githubusercontent.com/1681295/176998572-e39fc968-4c8c-475d-b3b8-fb7991663646.png">
2021-10-28 06:08:36 +00:00
### GUI and multigrid support
You can load a different font size for floating win
![multigrid2](https://user-images.githubusercontent.com/1681295/139196378-bf69ade9-c916-42a9-a91f-cccb39b9c4eb.jpg)
### Document Symbol and navigate through the list
2021-04-20 22:25:31 +00:00
![doc_symbol_and_navigate](https://user-images.githubusercontent.com/1681295/148642747-1870b1a4-67c2-4a0d-8a41-d462ecdc663e.gif)
The key binding to navigate in the list.
- up and down key
- `<Ctrl-f/b>` for page up and down
- number key 1~9 go to the ith item.
- If there are loads of results, would be good to use fzy search prompt to filter out the result you are interested.
2021-04-19 02:56:32 +00:00
2021-04-23 08:19:59 +00:00
### Workspace Symbol
![workspace symbol](https://github.com/ray-x/files/blob/master/img/navigator/workspace_symbol.gif?raw=true)
2021-05-29 11:08:30 +00:00
### highlight document symbol and jump between reference
2021-05-29 11:08:30 +00:00
![multiple_symbol_hi3](https://user-images.githubusercontent.com/1681295/120067627-f9f80680-c0bf-11eb-9216-18e5c8547f59.gif)
# Current symbol highlight and jump backward/forward between symbols
2021-05-08 04:54:37 +00:00
Document highlight provided by LSP.
Jump between symbols with treesitter (with `]r` and `[r`)
2021-05-08 04:54:37 +00:00
![doc jump](https://github.com/ray-x/files/blob/master/img/navigator/doc_hl_jump.gif?raw=true)
2021-04-19 02:56:32 +00:00
### Diagnostic
2021-08-09 16:03:51 +00:00
Visual studio code style show errors minimap in scroll bar area
2021-08-23 23:17:20 +00:00
(Check setup for `diagnostic_scrollbar_sign`)
2021-08-10 05:27:20 +00:00
2021-08-09 16:03:51 +00:00
![diagnostic_scroll_bar](https://user-images.githubusercontent.com/1681295/128736430-e365523d-810c-4c16-a3b4-c74969f45f0b.jpg)
2021-04-25 10:34:33 +00:00
Diagnostic in single bufer
2021-04-19 02:56:32 +00:00
![diagnostic](https://github.com/ray-x/files/blob/master/img/navigator/diag.jpg?raw=true)
2021-04-25 10:34:33 +00:00
Show diagnostic in all buffers
2021-04-24 09:55:48 +00:00
![diagnostic multi files](https://github.com/ray-x/files/blob/master/img/navigator/diagnostic_multiplefiles.jpg?raw=true)
2021-04-19 02:56:32 +00:00
2021-06-14 02:39:40 +00:00
### Edit in preview window
2021-06-14 02:47:45 +00:00
2021-06-14 02:39:40 +00:00
You can in place edit your code in floating window
2021-06-14 02:47:45 +00:00
https://user-images.githubusercontent.com/1681295/121832919-89cbc080-cd0e-11eb-9778-11d0f356b38d.mov
2021-06-14 02:39:40 +00:00
(Note: This feature only avalible in `find reference` and `find diagnostic`, You can not add/remove lines in floating window)
2021-04-19 02:56:32 +00:00
### Implementation
![implementation](https://user-images.githubusercontent.com/1681295/118735346-967e0580-b883-11eb-8c1e-88c5810f7e05.jpg?raw=true)
2021-04-19 02:56:32 +00:00
### 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)
2021-11-10 08:54:17 +00:00
### Symbol rename
![rename](https://user-images.githubusercontent.com/1681295/141081135-55f45c2d-28c6-4475-a083-e37dfabe9afd.jpg)
#### Fill struct with gopls
2021-04-24 10:30:31 +00:00
![code actions fill struct](https://github.com/ray-x/files/blob/master/img/navigator/fill_struct.gif?raw=true)
2021-04-19 02:56:32 +00:00
### Code preview with highlight
![treesitter_preview](https://user-images.githubusercontent.com/1681295/118900852-4bccbe00-b955-11eb-82f6-0747b1b64e7c.jpg)
2021-04-19 02:56:32 +00:00
### 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)
2021-04-27 09:05:13 +00:00
![show_signature](https://github.com/ray-x/files/blob/master/img/navigator/show_signnature.gif?raw=true "show_signature")
2021-11-18 03:49:36 +00:00
### Call hierarchy (incomming/outgoing calls)
2021-04-19 02:56:32 +00:00
2021-11-18 03:49:36 +00:00
![incomming_calls](https://user-images.githubusercontent.com/1681295/142348079-49b71486-4f16-4f10-95c9-483aad11c262.jpg)
2021-04-19 02:56:32 +00:00
### Light bulb if codeAction available
2021-04-24 04:44:57 +00:00
![lightbulb](https://github.com/ray-x/files/blob/master/img/navigator/lightbulb.jpg?raw=true)
2021-09-08 01:12:20 +00:00
### Codelens
Codelens for gopls/golang. Garbage collection analyse:
![codelens](https://user-images.githubusercontent.com/1681295/132428956-7835bf30-2ed5-4871-b2d7-7fbad22f63e8.jpg)
Codelens for C++/ccls. Symbol reference
![codelens_cpp_ccls](https://user-images.githubusercontent.com/1681295/132429134-abc6547e-79cc-44a4-b7a9-23550b895e51.jpg)
2021-04-24 04:44:57 +00:00
### Predefined LSP symbol nerdfont/emoji
2021-04-21 02:12:48 +00:00
![nerdfont](https://github.com/ray-x/files/blob/master/img/navigator/icon_nerd.jpg?raw=true)
2022-01-07 04:30:26 +00:00
### VS-code style folding with treesitter
Folding is using a hacked version of treesitter folding.
2022-01-07 04:31:32 +00:00
#### folding function
2022-01-07 04:30:26 +00:00
![image](https://user-images.githubusercontent.com/1681295/148491596-6cd6c507-c157-4536-b8c4-dc969436763a.png)
2022-01-07 04:31:32 +00:00
#### folding comments
Multiline comments can be folded as it is treated as a block
2022-01-07 04:30:26 +00:00
![image](https://user-images.githubusercontent.com/1681295/148491845-5ffb18ea-f05d-4229-aec3-aa635b3de814.png)
2021-11-02 23:35:09 +00:00
# Debug the plugin
One simple way to gether debug info and understand what is wrong is output the debug logs
```lua
require'navigator'.setup({
debug = false, -- log output, set to true and log path: ~/.local/share/nvim/gh.log
})
```
```lua
2021-11-02 23:41:46 +00:00
-- a example of adding logs in the plugin
2021-11-02 23:35:09 +00:00
2021-11-02 23:41:46 +00:00
local log = require"navigator.util".log
2021-11-02 23:35:09 +00:00
local definition_hdlr = util.mk_handler(function(err, locations, ctx, _)
2021-11-02 23:41:46 +00:00
-- output your log
log('[definition] log for locations', locations, "and ctx", ctx)
2021-11-02 23:35:09 +00:00
if err ~= nil then
return
end
end
```
# Break changes and known issues
[known issues I am working on](https://github.com/ray-x/navigator.lua/issues/1)
2021-04-19 02:56:32 +00:00
# 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
# Errors and Bug Reporting
- Please double check your setup and check if minium setup works or not
2022-02-17 11:24:53 +00:00
- It should works for 0.6.1, neovim 0.7.x prefered.
- Check console output
- Check `LspInfo` and treesitter status with `checkhealth`
- Turn on log and attach the log to your issue if possible you can remove any personal/company info in the log
2022-02-19 03:59:31 +00:00
- Submit Issue with minium vimrc. Please check playground/init.lua as a vimrc template. !!!Please DONOT use a packer vimrc
2022-02-22 15:55:47 +00:00
that installs everything to default folder!!! Also check this repo [navigator bug report](https://github.com/fky2015/navigator.nvim-bug-report)