diff --git a/README.md b/README.md index 46f9b2c..0cf0487 100644 --- a/README.md +++ b/README.md @@ -72,11 +72,11 @@ variable is: - 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?) +- 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 symbol highlight/marker and hop between document references +- LSP multiple symbols highlight/marker and hop between document references - Preview definination/references @@ -96,7 +96,7 @@ variable is: - 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); comment folding +- 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 @@ -284,6 +284,7 @@ require'navigator'.setup({ 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}, 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 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 @@ -820,11 +821,14 @@ Codelens for C++/ccls. Symbol reference ### VS-code style folding with treesitter +Folding is using a hacked version of treesitter folding. + #### folding function ![image](https://user-images.githubusercontent.com/1681295/148491596-6cd6c507-c157-4536-b8c4-dc969436763a.png) #### folding comments +Multiline comments can be folded as it is treated as a block ![image](https://user-images.githubusercontent.com/1681295/148491845-5ffb18ea-f05d-4229-aec3-aa635b3de814.png) diff --git a/lua/navigator.lua b/lua/navigator.lua index f180ba1..8ad5de6 100755 --- a/lua/navigator.lua +++ b/lua/navigator.lua @@ -59,6 +59,7 @@ _NgConfigValues = { severity_sort = { reverse = true }, }, format_on_save = true, -- set to false to disasble lsp code format on save (if you are using prettier/efm/formater etc) + format_options = { async = false }, -- async: disable by default, I saw something unexpected disable_nulls_codeaction_sign = true, -- do not show nulls codeactions (as it will alway has a valid action) disable_format_cap = {}, -- a list of lsp disable file format (e.g. if you using efm or vim-codeformat etc), empty by default disable_lsp = {}, -- a list of lsp server disabled for your project, e.g. denols and tsserver you may diff --git a/lua/navigator/lspclient/mapping.lua b/lua/navigator/lspclient/mapping.lua index 5186349..5541924 100644 --- a/lua/navigator/lspclient/mapping.lua +++ b/lua/navigator/lspclient/mapping.lua @@ -21,55 +21,55 @@ local single = { '╭', '─', '╮', '│', '╯', '─', '╰', '│' } -- TODO https://github.com/neovim/neovim/pull/16591 use vimkeymap.set/del -- LuaFormatter off local key_maps = { - { key = 'gr', func = require('navigator.reference').async_ref, doc = 'async_ref' }, - { key = 'gr', func = require('navigator.reference').reference, doc = 'reference' }, -- reference deprecated - { mode = 'i', key = '', func = vim.lsp.signature_help, doc = 'signature_help' }, - { key = '', func = vim.lsp.buf.signature_help, doc = 'signature_help' }, - { key = 'g0', func = require('navigator.symbols').document_symbols, doc = 'document_symbols' }, - { key = 'gW', func = require('navigator.workspace').workspace_symbol_live, doc = 'workspace_symbol_live' }, - { key = '', func = require('navigator.definition').definition, doc = 'definition' }, - { key = 'gd', func = require('navigator.definition').definition, doc = 'definition' }, - { key = 'gD', func = vim.lsp.buf.declaration, doc = 'declaration' }, - { key = 'gp', func = require('navigator.definition').definition_preview, doc = 'definition_preview' }, - { key = 'gt', func = require('navigator.treesitter').buf_ts, doc = 'buf_ts' }, - { key = 'gT', func = require('navigator.treesitter').bufs_ts, doc = 'bufs_ts' }, - { key = 'ct', func = require('navigator.ctags').ctags, doc = 'ctags' }, - { key = 'K', func = vim.lsp.buf.hover, doc = 'hover' }, - { key = 'ca', mode = 'n', func = require('navigator.codeAction').code_action, doc = 'code_action' }, + { key = 'gr', func = require('navigator.reference').async_ref, desc = 'async_ref' }, + { key = 'gr', func = require('navigator.reference').reference, desc = 'reference' }, -- reference deprecated + { mode = 'i', key = '', func = vim.lsp.signature_help, desc = 'signature_help' }, + { key = '', func = vim.lsp.buf.signature_help, desc = 'signature_help' }, + { key = 'g0', func = require('navigator.symbols').document_symbols, desc = 'document_symbols' }, + { key = 'gW', func = require('navigator.workspace').workspace_symbol_live, desc = 'workspace_symbol_live' }, + { key = '', func = require('navigator.definition').definition, desc = 'definition' }, + { key = 'gd', func = require('navigator.definition').definition, desc = 'definition' }, + { key = 'gD', func = vim.lsp.buf.declaration, desc = 'declaration' }, + { key = 'gp', func = require('navigator.definition').definition_preview, desc = 'definition_preview' }, + { key = 'gt', func = require('navigator.treesitter').buf_ts, desc = 'buf_ts' }, + { key = 'gT', func = require('navigator.treesitter').bufs_ts, desc = 'bufs_ts' }, + { key = 'ct', func = require('navigator.ctags').ctags, desc = 'ctags' }, + { key = 'K', func = vim.lsp.buf.hover, desc = 'hover' }, + { key = 'ca', mode = 'n', func = require('navigator.codeAction').code_action, desc = 'code_action' }, { key = 'ca', mode = 'v', func = require('navigator.codeAction').range_code_action, - doc = 'range_code_action', + desc = 'range_code_action', }, -- { key = 're', func = 'rename()' }, - { key = 'rn', func = require('navigator.rename').rename, doc = 'rename' }, - { key = 'gi', func = vim.lsp.buf.incoming_calls, doc = 'incoming_calls' }, - { key = 'go', func = vim.lsp.buf.outgoing_calls, doc = 'outgoing_calls' }, - { key = 'gi', func = vim.lsp.buf.implementation, doc = 'implementation' }, - { key = 'D', func = vim.lsp.buf.type_definition, doc = 'type_definition' }, - { key = 'gL', func = require('navigator.diagnostics').show_diagnostics, doc = 'show_diagnostics' }, - { key = 'gG', func = require('navigator.diagnostics').show_buf_diagnostics, doc = 'show_buf_diagnostics' }, - { key = 'dt', func = require('navigator.diagnostics').toggle_diagnostics, doc = 'toggle_diagnostics' }, - { key = ']d', func = vim.diagnostic.goto_next, doc = 'next diagnostics' }, - { key = '[d', func = vim.diagnostic.goto_prev, doc = 'prev diagnostics' }, - { key = ']O', func = vim.diagnostic.set_loclist, doc = 'diagnostics set loclist' }, - { key = ']r', func = require('navigator.treesitter').goto_next_usage, doc = 'goto_next_usage' }, - { key = '[r', func = require('navigator.treesitter').goto_previous_usage, doc = 'goto_previous_usage' }, - { key = '', func = vim.lsp.buf.definition, doc = 'definition' }, - { key = 'g', func = vim.lsp.buf.implementation, doc = 'implementation' }, - { key = 'k', func = require('navigator.dochighlight').hi_symbol, doc = 'hi_symbol' }, - { key = 'wa', func = require('navigator.workspace').add_workspace_folder, doc = 'add_workspace_folder' }, + { key = 'rn', func = require('navigator.rename').rename, desc = 'rename' }, + { key = 'gi', func = vim.lsp.buf.incoming_calls, desc = 'incoming_calls' }, + { key = 'go', func = vim.lsp.buf.outgoing_calls, desc = 'outgoing_calls' }, + { key = 'gi', func = vim.lsp.buf.implementation, desc = 'implementation' }, + { key = 'D', func = vim.lsp.buf.type_definition, desc = 'type_definition' }, + { key = 'gL', func = require('navigator.diagnostics').show_diagnostics, desc = 'show_diagnostics' }, + { key = 'gG', func = require('navigator.diagnostics').show_buf_diagnostics, desc = 'show_buf_diagnostics' }, + { key = 'dt', func = require('navigator.diagnostics').toggle_diagnostics, desc = 'toggle_diagnostics' }, + { key = ']d', func = vim.diagnostic.goto_next, desc = 'next diagnostics' }, + { key = '[d', func = vim.diagnostic.goto_prev, desc = 'prev diagnostics' }, + { key = ']O', func = vim.diagnostic.set_loclist, desc = 'diagnostics set loclist' }, + { key = ']r', func = require('navigator.treesitter').goto_next_usage, desc = 'goto_next_usage' }, + { key = '[r', func = require('navigator.treesitter').goto_previous_usage, desc = 'goto_previous_usage' }, + { key = '', func = vim.lsp.buf.definition, desc = 'definition' }, + { key = 'g', func = vim.lsp.buf.implementation, desc = 'implementation' }, + { key = 'k', func = require('navigator.dochighlight').hi_symbol, desc = 'hi_symbol' }, + { key = 'wa', func = require('navigator.workspace').add_workspace_folder, desc = 'add_workspace_folder' }, { key = 'wr', func = require('navigator.workspace').remove_workspace_folder, - doc = 'remove_workspace_folder', + desc = 'remove_workspace_folder', }, - { key = 'ff', func = vim.lsp.buf.format, mode = 'n', doc = 'format' }, - { key = 'ff', func = vim.lsp.buf.range_formatting, mode = 'v', doc = 'range format' }, - { key = 'rf', func = require('navigator.formatting').range_format, mode = 'n', doc = 'range_fmt_v' }, - { key = 'wl', func = require('navigator.workspace').list_workspace_folders, doc = 'list_workspace_folders' }, - { key = 'la', mode = 'n', func = require('navigator.codelens').run_action, doc = 'run code lens action' }, + { key = 'ff', func = vim.lsp.buf.format, mode = 'n', desc = 'format' }, + { key = 'ff', func = vim.lsp.buf.range_formatting, mode = 'v', desc = 'range format' }, + { key = 'rf', func = require('navigator.formatting').range_format, mode = 'n', desc = 'range_fmt_v' }, + { key = 'wl', func = require('navigator.workspace').list_workspace_folders, desc = 'list_workspace_folders' }, + { key = 'la', mode = 'n', func = require('navigator.codelens').run_action, desc = 'run code lens action' }, } local commands = { @@ -88,8 +88,8 @@ local key_maps_help = {} local M = {} local ccls_mappings = { - { key = 'gi', func = require('navigator.cclshierarchy').incoming_calls, doc = 'incoming_calls' }, - { key = 'go', func = require('navigator.cclshierarchy').outgoing_calls, doc = 'outgoing_calls' }, + { key = 'gi', func = require('navigator.cclshierarchy').incoming_calls, desc = 'incoming_calls' }, + { key = 'go', func = require('navigator.cclshierarchy').outgoing_calls, desc = 'outgoing_calls' }, } local check_cap = function(opts) @@ -209,10 +209,13 @@ local function set_mapping(lsp_attach_info) -- neovim 0.7.0 opts.buffer = key_maps.buffer or value.buffer + if value.desc then + opts.desc = value.desc + end vim.keymap.set(value.mode or 'n', value.key, value.func, opts) - if string.find(value.doc, 'range format') then + if string.find(value.desc, 'range format') then rfmtkey = value.key - elseif string.find(value.doc, 'format') then + elseif string.find(value.desc, 'format') then fmtkey = value.key end end @@ -220,8 +223,8 @@ local function set_mapping(lsp_attach_info) for _, val in pairs(key_maps) do local helper_msg = '' - if val.doc then - helper_msg = val.doc + if val.desc then + helper_msg = val.desc elseif type(val.func) == 'string' then helper_msg = val.func end @@ -237,11 +240,17 @@ local function set_mapping(lsp_attach_info) if doc_fmt and _NgConfigValues.lsp.format_on_save then local gn = api.nvim_create_augroup('NavAuGroupFormat', {}) + local fopts = _NgConfigValues.lsp.format_options + + if not fopts.async and vim.api.nvim_buf_line_count(0) > 4000 then + fopts.async = true + end + api.nvim_create_autocmd({ 'BufWritePre' }, { group = gn, buffer = bufnr, callback = function() - vim.lsp.buf.format({ async = true }) + vim.lsp.buf.format(fopts) end, }) elseif fmtkey then diff --git a/selene.toml b/selene.toml index 7312a91..6540d6f 100644 --- a/selene.toml +++ b/selene.toml @@ -1 +1 @@ -std="vim" +std="lua51+vim"