New commands LspAndDiag TsAndDiag for Panel

pull/268/head
ray-x 1 year ago
parent 66d84151e9
commit d202970180

@ -729,8 +729,10 @@ You can override the above highlight to fit your current colorscheme
| LspRestart | reload lsp |
| LspToggleFmt | toggle lsp format |
| LspSymbols | document symbol in side panel |
| LspAndDiag | document symbol and diagnostics in side panel |
| NRefPanel | show symbol reference in side panel |
| TSymobls | treesitter symbol in side panel |
| TsAndDiag | treesitter symbol and diagnostics in side panel |
| Calltree {args} | lsp call hierarchy call tree, args: -i (incomming default), -o (outgoing) |
## Screenshots

@ -15,59 +15,101 @@ 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, desc = 'async_ref' },
{ key = '<Leader>gr', func = require('navigator.reference').reference, desc = 'reference' }, -- reference deprecated
{ mode = 'i', key = '<M-k>', func = vim.lsp.signature_help, desc = 'signature_help' },
{ key = '<c-k>', 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 = '<c-]>', 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 = '<Leader>gt', func = require('navigator.treesitter').buf_ts, desc = 'buf_ts' },
{ key = '<Leader>gT', func = require('navigator.treesitter').bufs_ts, desc = 'bufs_ts' },
{ key = '<Leader>ct', func = require('navigator.ctags').ctags, desc = 'ctags' },
{ key = '<Space>ca', mode = 'n', func = require('navigator.codeAction').code_action, desc = 'code_action' },
{
key = '<Space>ca',
mode = 'v',
func = require('navigator.codeAction').range_code_action,
desc = 'range_code_action',
},
-- { key = '<Leader>re', func = 'rename()' },
{ key = '<Space>rn', func = require('navigator.rename').rename, desc = 'rename' },
{ key = '<Leader>gi', func = vim.lsp.buf.incoming_calls, desc = 'incoming_calls' },
{ key = '<Leader>go', func = vim.lsp.buf.outgoing_calls, desc = 'outgoing_calls' },
{ key = 'gi', func = vim.lsp.buf.implementation, desc = 'implementation' },
{ key = '<Space>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 = '<Leader>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 = '<C-LeftMouse>', func = vim.lsp.buf.definition, desc = 'definition' },
{ key = 'g<LeftMouse>', func = vim.lsp.buf.implementation, desc = 'implementation' },
{ key = '<Leader>k', func = require('navigator.dochighlight').hi_symbol, desc = 'hi_symbol' },
{ key = '<Space>wa', func = require('navigator.workspace').add_workspace_folder, desc = 'add_workspace_folder' },
{
key = '<Space>wr',
func = require('navigator.workspace').remove_workspace_folder,
desc = 'remove_workspace_folder',
},
{ key = '<Space>ff', func = vim.lsp.buf.format, mode = 'n', desc = 'format' },
{ key = '<Space>ff', func = vim.lsp.buf.range_formatting, mode = 'v', desc = 'range format' },
{
key = '<Space>gm',
func = require('navigator.formatting').range_format,
mode = 'n',
desc = 'range format operator e.g gmip',
},
{ key = '<Space>wl', func = require('navigator.workspace').list_workspace_folders, desc = 'list_workspace_folders' },
{ key = '<Space>la', mode = 'n', func = require('navigator.codelens').run_action, desc = 'run code lens action' },
{ key = 'gr', func = require('navigator.reference').async_ref, desc = 'async_ref' },
{ key = '<Leader>gr', func = require('navigator.reference').reference, desc = 'reference' }, -- reference deprecated
{ mode = 'i', key = '<M-k>', func = vim.lsp.signature_help, desc = 'signature_help' },
{ key = '<c-k>', 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 = '<c-]>', 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 = '<Leader>gt', func = require('navigator.treesitter').buf_ts, desc = 'buf_ts' },
{ key = '<Leader>gT', func = require('navigator.treesitter').bufs_ts, desc = 'bufs_ts' },
{ key = '<Leader>ct', func = require('navigator.ctags').ctags, desc = 'ctags' },
{
key = '<Space>ca',
mode = 'n',
func = require('navigator.codeAction').code_action,
desc = 'code_action',
},
{
key = '<Space>ca',
mode = 'v',
func = require('navigator.codeAction').range_code_action,
desc = 'range_code_action',
},
-- { key = '<Leader>re', func = 'rename()' },
{ key = '<Space>rn', func = require('navigator.rename').rename, desc = 'rename' },
{ key = '<Leader>gi', func = vim.lsp.buf.incoming_calls, desc = 'incoming_calls' },
{ key = '<Leader>go', func = vim.lsp.buf.outgoing_calls, desc = 'outgoing_calls' },
{ key = 'gi', func = vim.lsp.buf.implementation, desc = 'implementation' },
{ key = '<Space>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 = '<Leader>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 = '<C-LeftMouse>', func = vim.lsp.buf.definition, desc = 'definition' },
{ key = 'g<LeftMouse>', func = vim.lsp.buf.implementation, desc = 'implementation' },
{ key = '<Leader>k', func = require('navigator.dochighlight').hi_symbol, desc = 'hi_symbol' },
{
key = '<Space>wa',
func = require('navigator.workspace').add_workspace_folder,
desc = 'add_workspace_folder',
},
{
key = '<Space>wr',
func = require('navigator.workspace').remove_workspace_folder,
desc = 'remove_workspace_folder',
},
{ key = '<Space>ff', func = vim.lsp.buf.format, mode = 'n', desc = 'format' },
{ key = '<Space>ff', func = vim.lsp.buf.range_formatting, mode = 'v', desc = 'range format' },
{
key = '<Space>gm',
func = require('navigator.formatting').range_format,
mode = 'n',
desc = 'range format operator e.g gmip',
},
{
key = '<Space>wl',
func = require('navigator.workspace').list_workspace_folders,
desc = 'list_workspace_folders',
},
{
key = '<Space>la',
mode = 'n',
func = require('navigator.codelens').run_action,
desc = 'run code lens action',
},
}
if _NgConfigValues.lsp.hover then
@ -79,8 +121,16 @@ local key_maps_help = {}
local M = {}
local ccls_mappings = {
{ key = '<Leader>gi', func = require('navigator.cclshierarchy').incoming_calls, desc = 'incoming_calls' },
{ key = '<Leader>go', func = require('navigator.cclshierarchy').outgoing_calls, desc = 'outgoing_calls' },
{
key = '<Leader>gi',
func = require('navigator.cclshierarchy').incoming_calls,
desc = 'incoming_calls',
},
{
key = '<Leader>go',
func = require('navigator.cclshierarchy').outgoing_calls,
desc = 'outgoing_calls',
},
}
local check_cap = function(opts)
@ -119,17 +169,17 @@ end
local function set_cmds(_)
local commands = {
[[command! -nargs=* Nctags lua require("navigator.ctags").ctags(<f-args>)]],
"command! -nargs=0 LspLog lua require'navigator.lspclient.config'.open_lsp_log()",
"command! -nargs=0 LspRestart lua require'navigator.lspclient.config'.reload_lsp()",
"command! -nargs=0 LspToggleFmt lua require'navigator.lspclient.mapping'.toggle_lspformat()<CR>",
"command! -nargs=0 LspKeymaps lua require'navigator.lspclient.mapping'.get_keymaps_help()<CR>",
"command! -nargs=0 LspSymbols lua require'navigator.symbols'.side_panel()<CR>",
"command! -nargs=0 TSymbols lua require'navigator.treesitter'.side_panel()<CR>",
"command! -nargs=0 NRefPanel lua require'navigator.reference'.side_panel()<CR>",
"command! -nargs=* Calltree lua require'navigator.hierarchy'.calltree(<f-args>)<CR>",
"command! -nargs=* TsDiag lua require'navigator.sidepanel'.treesitter_and_diag_panel(<f-args>)<CR>",
"command! -nargs=* LspDiag lua require'navigator.sidepanel'.lsp_and_diag_panel(<f-args>)<CR>",
[[command! -nargs=* Nctags lua require("navigator.ctags").ctags(<f-args>)]],
"command! -nargs=0 LspLog lua require'navigator.lspclient.config'.open_lsp_log()",
"command! -nargs=0 LspRestart lua require'navigator.lspclient.config'.reload_lsp()",
"command! -nargs=0 LspToggleFmt lua require'navigator.lspclient.mapping'.toggle_lspformat()<CR>",
"command! -nargs=0 LspKeymaps lua require'navigator.lspclient.mapping'.get_keymaps_help()<CR>",
"command! -nargs=0 LspSymbols lua require'navigator.symbols'.side_panel()<CR>",
"command! -nargs=0 TSymbols lua require'navigator.treesitter'.side_panel()<CR>",
"command! -nargs=0 NRefPanel lua require'navigator.reference'.side_panel()<CR>",
"command! -nargs=* Calltree lua require'navigator.hierarchy'.calltree(<f-args>)<CR>",
"command! -nargs=* TsAndDiag lua require'navigator.sidepanel'.treesitter_and_diag_panel(<f-args>)<CR>",
"command! -nargs=* LspAndDiag lua require'navigator.sidepanel'.lsp_and_diag_panel(<f-args>)<CR>",
}
for _, value in pairs(commands) do
@ -142,7 +192,7 @@ end
local function set_mapping(lsp_attach_info)
local opts = { noremap = true, silent = true }
vim.validate({
lsp_attach_info = { lsp_attach_info, 'table' },
lsp_attach_info = { lsp_attach_info, 'table' },
})
if _NgConfigValues.debug then
log('setup mapping for client', lsp_attach_info.client.name, lsp_attach_info.client.cmd)
@ -180,7 +230,11 @@ local function set_mapping(lsp_attach_info)
trace('binding', v)
local exists = false
for _, default in pairs(key_maps) do
if v.func == default.func and (v.mode or 'n') == (default.mode or 'n') and not default.override then
if
v.func == default.func
and (v.mode or 'n') == (default.mode or 'n')
and not default.override
then
default.key, default.override, exists = v.key, true, true
break
end
@ -200,7 +254,9 @@ local function set_mapping(lsp_attach_info)
vim.notify('doc field no longer supported in navigator mapping, use desc instead')
end
if type(value.func) == 'string' then -- deprecated will remove when 0.8 is out
vim.notify('keymap config updated: ' .. value.key .. ' func ' .. value.func .. ' should be a function')
vim.notify(
'keymap config updated: ' .. value.key .. ' func ' .. value.func .. ' should be a function'
)
local f = '<Cmd>lua vim.lsp.buf.' .. value.func .. '<CR>'
if string.find(value.func, 'require') or string.find(value.func, 'vim.') then
f = '<Cmd>lua ' .. value.func .. '<CR>'
@ -282,13 +338,13 @@ local function set_mapping(lsp_attach_info)
if fmt then
api.nvim_create_autocmd({ 'BufWritePre' }, {
group = gn,
desc = 'auto format',
buffer = bufnr,
callback = function()
trace('format' .. vim.inspect(fopts))
vim.lsp.buf.format(fopts)
end,
group = gn,
desc = 'auto format',
buffer = bufnr,
callback = function()
trace('format' .. vim.inspect(fopts))
vim.lsp.buf.format(fopts)
end,
})
end
elseif fmtkey then
@ -313,15 +369,15 @@ local function autocmd()
local gn = api.nvim_create_augroup('NavAuGroupDocHlAu', {})
api.nvim_create_autocmd({ 'BufWritePre' }, {
group = gn,
desc = 'doc highlight',
callback = require('navigator.dochighlight').cmd_nohl,
group = gn,
desc = 'doc highlight',
callback = require('navigator.dochighlight').cmd_nohl,
})
api.nvim_create_autocmd({ 'CmdlineLeave' }, {
group = gn,
desc = 'doc highlight nohl',
callback = require('navigator.dochighlight').cmd_nohl,
group = gn,
desc = 'doc highlight nohl',
callback = require('navigator.dochighlight').cmd_nohl,
})
end
@ -347,8 +403,8 @@ end
function M.setup(attach_opts)
if not attach_opts or not attach_opts.client then
vim.notify(
'please call require"navigator.mapping".setup({bufnr=bufnr, client=client}) inside on_attach(client,bufnr)',
vim.lsp.log_levels.WARN
'please call require"navigator.mapping".setup({bufnr=bufnr, client=client}) inside on_attach(client,bufnr)',
vim.lsp.log_levels.WARN
)
end
attach_opts = attach_opts or { bufnr = 0, client = {}, cap = {} }
@ -363,8 +419,10 @@ function M.setup(attach_opts)
log('lsp cap:', cap.codeActionProvider)
if cap.call_hierarchy or cap.callHierarchyProvider then
vim.lsp.handlers['callHierarchy/incomingCalls'] = require('navigator.hierarchy').incoming_calls_handler
vim.lsp.handlers['callHierarchy/outgoingCalls'] = require('navigator.hierarchy').outgoing_calls_handler
vim.lsp.handlers['callHierarchy/incomingCalls'] =
require('navigator.hierarchy').incoming_calls_handler
vim.lsp.handlers['callHierarchy/outgoingCalls'] =
require('navigator.hierarchy').outgoing_calls_handler
end
vim.lsp.handlers['textDocument/references'] = require('navigator.reference').reference_handler
@ -372,37 +430,44 @@ function M.setup(attach_opts)
vim.lsp.handlers['textDocument/definition'] = require('navigator.definition').definition_handler
if cap.declarationProvider then
vim.lsp.handlers['textDocument/declaration'] = require('navigator.definition').declaration_handler
vim.lsp.handlers['textDocument/declaration'] =
require('navigator.definition').declaration_handler
end
vim.lsp.handlers['textDocument/typeDefinition'] = require('navigator.definition').typeDefinition_handler
vim.lsp.handlers['textDocument/implementation'] = require('navigator.implementation').implementation_handler
vim.lsp.handlers['textDocument/typeDefinition'] =
require('navigator.definition').typeDefinition_handler
vim.lsp.handlers['textDocument/implementation'] =
require('navigator.implementation').implementation_handler
-- vim.lsp.handlers['textDocument/documentSymbol'] = require('navigator.symbols').document_symbol_handler
vim.lsp.handlers['workspace/symbol'] = require('navigator.symbols').workspace_symbol_handler
vim.lsp.handlers['textDocument/publishDiagnostics'] = require('navigator.diagnostics').diagnostic_handler
vim.lsp.handlers['textDocument/publishDiagnostics'] =
require('navigator.diagnostics').diagnostic_handler
-- TODO: when active signature merge to neovim, remove this setup:
if vim.fn.empty(_NgConfigValues.signature_help_cfg) == 0 or _NgConfigValues.lsp_signature_help then
if
vim.fn.empty(_NgConfigValues.signature_help_cfg) == 0 or _NgConfigValues.lsp_signature_help
then
log('setup signature from navigator')
local hassig, sig = pcall(require, 'lsp_signature')
if hassig then
sig.setup(_NgConfigValues.signature_help_cfg or {})
end
else
vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(require('navigator.signature').signature_handler, {
border = { '', '', '', '', '', '', '', '' },
})
vim.lsp.handlers['textDocument/signatureHelp'] =
vim.lsp.with(require('navigator.signature').signature_handler, {
border = { '', '', '', '', '', '', '', '' },
})
end
api.nvim_create_autocmd({ 'BufWritePre' }, {
group = api.nvim_create_augroup('nvim_nv_event_autos', {}),
buffer = attach_opts.bufnr,
desc = 'diagnostic update',
callback = function()
require('navigator.diagnostics').setloclist(attach_opts.bufnr)
end,
group = api.nvim_create_augroup('nvim_nv_event_autos', {}),
buffer = attach_opts.bufnr,
desc = 'diagnostic update',
callback = function()
require('navigator.diagnostics').setloclist(attach_opts.bufnr)
end,
})
local border_style = single
@ -411,8 +476,8 @@ function M.setup(attach_opts)
end
if _NgConfigValues.lsp.hover then
vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(require('navigator.hover').handler, {
border = border_style,
})
border = border_style,
})
end
if cap.documentFormattingProvider then
log('formatting enabled setup hdl')
@ -423,13 +488,13 @@ end
M.get_keymaps_help = function()
local ListView = require('guihua.listview')
local win = ListView:new({
loc = 'top_center',
border = 'none',
prompt = true,
enter = true,
rect = { height = 24, width = 50 },
data = key_maps_help,
})
loc = 'top_center',
border = 'none',
prompt = true,
enter = true,
rect = { height = 24, width = 50 },
data = key_maps_help,
})
return win
end

@ -1,6 +1,5 @@
local gui = require('navigator.gui')
local diagnostic = vim.diagnostic or vim.lsp.diagnostic
local diag = require('navigator.diagnostics')
local util = require('navigator.util')
local log = util.log
local api = vim.api
@ -9,6 +8,7 @@ local M = {}
function M.treesitter_and_diag_panel()
local Panel = require('guihua.panel')
local diag = require('navigator.diagnostics')
local ft = vim.bo.filetype
local results = diag.diagnostic_list[ft]
log(diag.diagnostic_list, ft)
@ -48,25 +48,27 @@ function M.lsp_and_diag_panel()
local Panel = require('guihua.panel')
local ft = vim.bo.filetype
local diag = require('navigator.diagnostics')
local results = diag.diagnostic_list[ft]
log(diag.diagnostic_list, ft)
bufnr = bufnr or api.nvim_get_current_buf()
ft = vim.api.nvim_buf_get_option(bufnr, 'buftype') or vim.bo.filetype
local bf = api.nvim_get_current_buf()
ft = vim.api.nvim_buf_get_option(bf, 'buftype') or vim.bo.filetype
if ft == 'nofile' or ft == 'guihua' or ft == 'prompt' then
return
end
local params = vim.lsp.util.make_range_params()
local sync_req = require('navigator.lspwrapper').call_sync
local lsp = sync_req(
'textDocument/documentSymbol',
params,
{ timeout = 2000, bufnr = bufnr, no_show = true },
vim.lsp.with(require('navigator.symbols').document_symbol_handler, { no_show = true })
)
local p = Panel:new({
header = 'symboles',
header = 'symbols',
render = function(bufnr)
bufnr = bufnr or api.nvim_get_current_buf()
local params = vim.lsp.util.make_range_params()
local sync_req = require('navigator.lspwrapper').call_sync
local lsp = sync_req(
'textDocument/documentSymbol',
params,
{ timeout = 2000, bufnr = bufnr, no_show = true },
vim.lsp.with(require('navigator.symbols').document_symbol_handler, { no_show = true })
)
return lsp
end,
})
@ -74,7 +76,7 @@ function M.lsp_and_diag_panel()
header = 'diagnostic',
render = function(buf)
log(buf, diagnostic)
if diag.diagnostic_list[ft] ~= nil then
if results ~= nil then
local display_items = {}
for _, client_items in pairs(results) do
for _, items in pairs(client_items) do

@ -40,7 +40,15 @@ end
M.document_symbol_handler = function(err, result, ctx)
if err then
vim.notify('failed to get document symbol' .. vim.inspect(ctx), vim.lsp.log_levels.WARN)
if error ~= 'timeout' then
vim.notify(
'failed to get document symbol' .. vim.inspect(ctx) .. err,
vim.lsp.log_levels.WARN
)
else
log('request timeout')
end
return
end
local bufnr = ctx.bufnr or 0
local query = ' '
@ -49,7 +57,10 @@ M.document_symbol_handler = function(err, result, ctx)
end
if not result or vim.tbl_isempty(result) then
vim.notify('symbol ' .. query .. ' not found for buf ' .. vim.inspect(ctx), vim.lsp.log_levels.WARN)
vim.notify(
'symbol ' .. query .. ' not found for buf ' .. vim.inspect(ctx),
vim.lsp.log_levels.WARN
)
return
end
local locations = {}
@ -131,7 +142,10 @@ M.workspace_symbol_handler = function(err, result, ctx, cfg)
end
if not result or vim.tbl_isempty(result) then
log('symbol not found', ctx)
vim.notify('symbol' .. query .. 'not found for buf ' .. tostring(ctx.bufnr), vim.lsp.log_levels.WARN)
vim.notify(
'symbol' .. query .. 'not found for buf ' .. tostring(ctx.bufnr),
vim.lsp.log_levels.WARN
)
return
end
log(result[1])

Loading…
Cancel
Save