fix the referece floatwindow loading performance issue

pull/117/head
ray-x 2 years ago
parent ae13350ad1
commit ce3c5fe2cb

@ -1,11 +1,11 @@
local M = {} local M = {}
local function warn(msg) local function warn(msg)
vim.api.nvim_echo({{"WRN: " .. msg, "WarningMsg"}}, true, {}) vim.api.nvim_echo({ { 'WRN: ' .. msg, 'WarningMsg' } }, true, {})
end end
local function info(msg) local function info(msg)
vim.api.nvim_echo({{"Info: " .. msg}}, true, {}) vim.api.nvim_echo({ { 'Info: ' .. msg } }, true, {})
end end
_NgConfigValues = { _NgConfigValues = {
@ -19,8 +19,8 @@ _NgConfigValues = {
keymaps = {}, -- e.g keymaps={{key = "GR", func = "references()"}, } this replace gr default mapping keymaps = {}, -- e.g keymaps={{key = "GR", func = "references()"}, } this replace gr default mapping
external = nil, -- true: enable for goneovim multigrid otherwise false external = nil, -- true: enable for goneovim multigrid otherwise false
border = "single", -- border style, can be one of 'none', 'single', 'double', "shadow" border = 'single', -- border style, can be one of 'none', 'single', 'double', "shadow"
combined_attach = "both", -- both: use both customized attach and navigator default attach, mine: only use my attach defined in vimrc combined_attach = 'both', -- both: use both customized attach and navigator default attach, mine: only use my attach defined in vimrc
on_attach = function(client, bufnr) on_attach = function(client, bufnr)
-- your on_attach will be called at end of navigator on_attach -- your on_attach will be called at end of navigator on_attach
end, end,
@ -38,14 +38,14 @@ _NgConfigValues = {
sign = true, sign = true,
sign_priority = 40, sign_priority = 40,
virtual_text = true, virtual_text = true,
virtual_text_icon = true virtual_text_icon = true,
}, },
code_lens_action = { code_lens_action = {
enable = true, enable = true,
sign = true, sign = true,
sign_priority = 40, sign_priority = 40,
virtual_text = true, virtual_text = true,
virtual_text_icon = true virtual_text_icon = true,
}, },
format_on_save = true, -- set to false to disasble lsp code format on save (if you are using prettier/efm/formater etc) format_on_save = true, -- set to false to disasble lsp code format on save (if you are using prettier/efm/formater etc)
disable_format_cap = {}, -- a list of lsp disable file format (e.g. if you using efm or vim-codeformat etc), empty by default disable_format_cap = {}, -- a list of lsp disable file format (e.g. if you using efm or vim-codeformat etc), empty by default
@ -57,7 +57,7 @@ _NgConfigValues = {
-- to load those files -- to load those files
diagnostic_virtual_text = true, -- show virtual for diagnostic message diagnostic_virtual_text = true, -- show virtual for diagnostic message
diagnostic_update_in_insert = false, -- update diagnostic message in insert mode diagnostic_update_in_insert = false, -- update diagnostic message in insert mode
diagnostic_scrollbar_sign = {'', '', ''}, -- set to nil to disable, set to {'╍', 'ﮆ'} to enable diagnostic status in scroll bar area diagnostic_scrollbar_sign = { '', '', '' }, -- set to nil to disable, set to {'╍', 'ﮆ'} to enable diagnostic status in scroll bar area
tsserver = { tsserver = {
-- filetypes = {'typescript'} -- disable javascript etc, -- filetypes = {'typescript'} -- disable javascript etc,
-- set to {} to disable the lspclient for all filetype -- set to {} to disable the lspclient for all filetype
@ -67,44 +67,44 @@ _NgConfigValues = {
-- sumneko_binary = sumneko_binary, -- sumneko_binary = sumneko_binary,
-- cmd = {'lua-language-server'} -- cmd = {'lua-language-server'}
}, },
servers = {} -- you can add additional lsp server so navigator will load the default for you servers = {}, -- you can add additional lsp server so navigator will load the default for you
}, },
lsp_installer = false, -- set to true if you would like use the lsp installed by williamboman/nvim-lsp-installer lsp_installer = false, -- set to true if you would like use the lsp installed by williamboman/nvim-lsp-installer
icons = { icons = {
icons = true, -- set to false to use system default ( if you using a terminal does not have nerd/icon) icons = true, -- set to false to use system default ( if you using a terminal does not have nerd/icon)
-- Code action -- Code action
code_action_icon = "🏏", -- "", code_action_icon = '🏏', -- "",
-- code lens -- code lens
code_lens_action_icon = "👓", code_lens_action_icon = '👓',
-- Diagnostics -- Diagnostics
diagnostic_head = '🐛', diagnostic_head = '🐛',
diagnostic_err = "📛", diagnostic_err = '📛',
diagnostic_warn = "👎", diagnostic_warn = '👎',
diagnostic_info = [[👩]], diagnostic_info = [[👩]],
diagnostic_hint = [[💁]], diagnostic_hint = [[💁]],
diagnostic_head_severity_1 = "🈲", diagnostic_head_severity_1 = '🈲',
diagnostic_head_severity_2 = "☣️", diagnostic_head_severity_2 = '☣️',
diagnostic_head_severity_3 = "👎", diagnostic_head_severity_3 = '👎',
diagnostic_head_description = "👹", diagnostic_head_description = '👹',
diagnostic_virtual_text = "🦊", diagnostic_virtual_text = '🦊',
diagnostic_file = "🚑", diagnostic_file = '🚑',
-- Values -- Values
value_changed = "📝", value_changed = '📝',
value_definition = "🦕", value_definition = '🐶', -- it is easier to see than 🦕
-- Treesitter -- Treesitter
match_kinds = { match_kinds = {
var = "", -- "👹", -- Vampaire var = '', -- "👹", -- Vampaire
method = "ƒ ", -- "🍔", -- mac method = 'ƒ ', -- "🍔", -- mac
["function"] = "", -- "🤣", -- Fun ['function'] = '', -- "🤣", -- Fun
parameter = "", -- Pi parameter = '', -- Pi
associated = "🤝", associated = '🤝',
namespace = "🚀", namespace = '🚀',
type = "", type = '',
field = "🏈" field = '🏈',
}, },
treesitter_defult = "🌲" treesitter_defult = '🌲',
} },
} }
vim.cmd("command! -nargs=0 LspLog lua require'navigator.lspclient.config'.open_lsp_log()") vim.cmd("command! -nargs=0 LspLog lua require'navigator.lspclient.config'.open_lsp_log()")
@ -112,12 +112,12 @@ vim.cmd("command! -nargs=0 LspRestart lua require'navigator.lspclient.config'.re
vim.cmd("command! -nargs=0 LspToggleFmt lua require'navigator.lspclient.mapping'.toggle_lspformat()<CR>") vim.cmd("command! -nargs=0 LspToggleFmt lua require'navigator.lspclient.mapping'.toggle_lspformat()<CR>")
M.deprecated = function(cfg) M.deprecated = function(cfg)
local warn = require'navigator.util'.warn local warn = require('navigator.util').warn
if cfg.code_action_prompt then if cfg.code_action_prompt then
warn("code_action_prompt moved to lsp.code_action") warn('code_action_prompt moved to lsp.code_action')
end end
if cfg.code_lens_action_prompt then if cfg.code_lens_action_prompt then
warn("code_lens_action_prompt moved to lsp.code_lens_action") warn('code_lens_action_prompt moved to lsp.code_lens_action')
end end
if cfg.lsp ~= nil and cfg.lsp.disable_format_ft ~= nil and cfg.lsp.disable_format_ft ~= {} then if cfg.lsp ~= nil and cfg.lsp.disable_format_ft ~= nil and cfg.lsp.disable_format_ft ~= {} then
@ -140,25 +140,37 @@ local extend_config = function(opts)
end end
for key, value in pairs(opts) do for key, value in pairs(opts) do
if _NgConfigValues[key] == nil then if _NgConfigValues[key] == nil then
warn(string.format("[] Deprecated? Key %s is not in default setup, it could be incorrect to set to %s", key, warn(
vim.inspect(value))) string.format(
'[] Deprecated? Key %s is not in default setup, it could be incorrect to set to %s',
key,
vim.inspect(value)
)
)
_NgConfigValues[key] = value _NgConfigValues[key] = value
-- return -- return
else else
if type(_NgConfigValues[key]) == "table" then if type(_NgConfigValues[key]) == 'table' then
if type(value) ~= "table" then if type(value) ~= 'table' then
info(string.format("[] Reset type: Key %s setup value %s type %s , from %s", key, vim.inspect(value), info(
type(value), vim.inspect(_NgConfigValues[key]))) string.format(
'[] Reset type: Key %s setup value %s type %s , from %s',
key,
vim.inspect(value),
type(value),
vim.inspect(_NgConfigValues[key])
)
)
end end
for k, v in pairs(value) do for k, v in pairs(value) do
if type(k) == "number" then if type(k) == 'number' then
-- replace all item in array -- replace all item in array
_NgConfigValues[key] = value _NgConfigValues[key] = value
break break
end end
-- level 3 -- level 3
if type(_NgConfigValues[key][k]) == "table" then if type(_NgConfigValues[key][k]) == 'table' then
if type(v) == "table" then if type(v) == 'table' then
for k2, v2 in pairs(v) do for k2, v2 in pairs(v) do
_NgConfigValues[key][k][k2] = v2 _NgConfigValues[key][k][k2] = v2
end end
@ -169,13 +181,14 @@ local extend_config = function(opts)
if _NgConfigValues[key][k] == nil then if _NgConfigValues[key][k] == nil then
if key == 'lsp' then if key == 'lsp' then
local lsp = require('navigator.lspclient.clients').lsp local lsp = require('navigator.lspclient.clients').lsp
if not vim.tbl_contains(lsp or {}, k) and k ~= 'efm' then if not vim.tbl_contains(lsp or {}, k) and k ~= 'efm' and k ~= 'null-ls' then
info(string.format("[] extend LSP support for %s ", k)) info(string.format('[] extend LSP support for %s ', k))
end end
elseif key == 'keymaps' then elseif key == 'keymaps' then
info('keymap override')
-- skip key check and allow mapping to handle that -- skip key check and allow mapping to handle that
else else
warn(string.format("[] Key %s %s not valid", key, k)) warn(string.format('[] Key %s %s not valid', key, k))
end end
-- return -- return
end end
@ -201,7 +214,7 @@ end
M.setup = function(cfg) M.setup = function(cfg)
extend_config(cfg) extend_config(cfg)
vim.cmd([[autocmd FileType,BufEnter * lua require'navigator.lspclient.clients'.setup()]]) -- BufWinEnter BufNewFile,BufRead ? vim.cmd([[autocmd FileType,BufEnter * lua require'navigator.lspclient.clients'.on_filetype()]]) -- BufWinEnter BufNewFile,BufRead ?
-- local log = require"navigator.util".log -- local log = require"navigator.util".log
-- log(debug.traceback()) -- log(debug.traceback())
-- log(cfg, _NgConfigValues) -- log(cfg, _NgConfigValues)
@ -209,10 +222,10 @@ M.setup = function(cfg)
require('navigator.lazyloader').init() require('navigator.lazyloader').init()
require('navigator.lspclient.clients').setup(_NgConfigValues) require('navigator.lspclient.clients').setup(_NgConfigValues)
-- require("navigator.lspclient.mapping").setup(_NgConfigValues) -- require("navigator.lspclient.mapping").setup(_NgConfigValues)
require("navigator.reference") require('navigator.reference')
require("navigator.definition") require('navigator.definition')
require("navigator.hierarchy") require('navigator.hierarchy')
require("navigator.implementation") require('navigator.implementation')
-- log("navigator loader") -- log("navigator loader")
@ -224,7 +237,6 @@ M.setup = function(cfg)
if _NgConfigValues.ts_fold == true then if _NgConfigValues.ts_fold == true then
require('navigator.foldts').on_attach() require('navigator.foldts').on_attach()
end end
end end
return M return M

@ -1,9 +1,9 @@
-- todo allow config passed in -- todo allow config passed in
local log = require"navigator.util".log local log = require('navigator.util').log
local trace = require"navigator.util".trace local trace = require('navigator.util').trace
local uv = vim.loop local uv = vim.loop
local warn = require'navigator.util'.warn local warn = require('navigator.util').warn
_NG_Loaded = {} _NG_Loaded = {}
_LoadedFiletypes = {} _LoadedFiletypes = {}
@ -12,22 +12,22 @@ packer_plugins = packer_plugins or nil -- suppress warnings
-- packer only -- packer only
local highlight = require "navigator.lspclient.highlight" local highlight = require('navigator.lspclient.highlight')
local has_lsp, lspconfig = pcall(require, "lspconfig") local has_lsp, lspconfig = pcall(require, 'lspconfig')
if not has_lsp then if not has_lsp then
return { return {
setup = function() setup = function()
print("loading lsp config failed LSP may not working correctly") print('loading lsp config failed LSP may not working correctly')
end end,
} }
end end
local util = lspconfig.util local util = lspconfig.util
local config = require"navigator".config_values() local config = require('navigator').config_values()
-- local cap = vim.lsp.protocol.make_client_capabilities() -- local cap = vim.lsp.protocol.make_client_capabilities()
local on_attach = require("navigator.lspclient.attach").on_attach local on_attach = require('navigator.lspclient.attach').on_attach
-- gopls["ui.completion.usePlaceholders"] = true -- gopls["ui.completion.usePlaceholders"] = true
-- lua setup -- lua setup
@ -37,25 +37,25 @@ local luadevcfg = {
library = { library = {
vimruntime = true, -- runtime path vimruntime = true, -- runtime path
types = true, -- full signature, docs and completion of vim.api, vim.treesitter, vim.lsp and others types = true, -- full signature, docs and completion of vim.api, vim.treesitter, vim.lsp and others
plugins = {"nvim-treesitter", "plenary.nvim"} plugins = { 'nvim-treesitter', 'plenary.nvim' },
}, },
lspconfig = { lspconfig = {
-- cmd = {sumneko_binary}, -- cmd = {sumneko_binary},
on_attach = on_attach on_attach = on_attach,
} },
} }
local luadev = {} local luadev = {}
require'navigator.lazyloader'.load('lua-dev.nvim', 'folke/lua-dev.nvim') require('navigator.lazyloader').load('lua-dev.nvim', 'folke/lua-dev.nvim')
local ok, l = pcall(require, "lua-dev") local ok, l = pcall(require, 'lua-dev')
if ok and l then if ok and l then
luadev = l.setup(luadevcfg) luadev = l.setup(luadevcfg)
end end
local path = vim.split(package.path, ";") local path = vim.split(package.path, ';')
table.insert(path, "lua/?.lua") table.insert(path, 'lua/?.lua')
table.insert(path, "lua/?/init.lua") table.insert(path, 'lua/?/init.lua')
local function add(lib) local function add(lib)
for _, p in pairs(vim.fn.expand(lib, false, true)) do for _, p in pairs(vim.fn.expand(lib, false, true)) do
@ -67,7 +67,7 @@ local function add(lib)
end end
-- add runtime -- add runtime
add("$VIMRUNTIME") add('$VIMRUNTIME')
-- add your config -- add your config
-- local home = vim.fn.expand("$HOME") -- local home = vim.fn.expand("$HOME")
@ -79,22 +79,22 @@ add(vim.fn.stdpath('config'))
-- add(home .. "/.local/share/nvim/site/pack/packer/start/*") -- add(home .. "/.local/share/nvim/site/pack/packer/start/*")
-- end -- end
library[vim.fn.expand("$VIMRUNTIME/lua")] = true library[vim.fn.expand('$VIMRUNTIME/lua')] = true
library[vim.fn.expand("$VIMRUNTIME/lua/vim")] = true library[vim.fn.expand('$VIMRUNTIME/lua/vim')] = true
library[vim.fn.expand("$VIMRUNTIME/lua/vim/lsp")] = true library[vim.fn.expand('$VIMRUNTIME/lua/vim/lsp')] = true
-- [vim.fn.expand("~/repos/nvim/lua")] = true -- [vim.fn.expand("~/repos/nvim/lua")] = true
-- TODO remove onece PR #944 merged to lspconfig -- TODO remove onece PR #944 merged to lspconfig
local path_sep = require"navigator.util".path_sep() local path_sep = require('navigator.util').path_sep()
local strip_dir_pat = path_sep .. "([^" .. path_sep .. "]+)$" local strip_dir_pat = path_sep .. '([^' .. path_sep .. ']+)$'
local strip_sep_pat = path_sep .. "$" local strip_sep_pat = path_sep .. '$'
local dirname = function(pathname) local dirname = function(pathname)
if not pathname or #pathname == 0 then if not pathname or #pathname == 0 then
return return
end end
local result = pathname:gsub(strip_sep_pat, ""):gsub(strip_dir_pat, "") local result = pathname:gsub(strip_sep_pat, ''):gsub(strip_dir_pat, '')
if #result == 0 then if #result == 0 then
return "/" return '/'
end end
return result return result
end end
@ -103,97 +103,101 @@ end
local setups = { local setups = {
clojure_lsp = { clojure_lsp = {
root_dir = function(fname) root_dir = function(fname)
return util.root_pattern("deps.edn", "build.boot", "project.clj", "shadow-cljs.edn", "bb.edn", ".git")(fname) return util.root_pattern('deps.edn', 'build.boot', 'project.clj', 'shadow-cljs.edn', 'bb.edn', '.git')(fname)
or util.path.dirname(fname) or util.path.dirname(fname)
end, end,
on_attach = on_attach, on_attach = on_attach,
filetypes = {"clojure", "edn"}, filetypes = { 'clojure', 'edn' },
message_level = vim.lsp.protocol.MessageType.error, message_level = vim.lsp.protocol.MessageType.error,
cmd = {"clojure-lsp"} cmd = { 'clojure-lsp' },
}, },
gopls = { gopls = {
on_attach = on_attach, on_attach = on_attach,
-- capabilities = cap, -- capabilities = cap,
filetypes = {"go", "gomod"}, filetypes = { 'go', 'gomod' },
message_level = vim.lsp.protocol.MessageType.Error, message_level = vim.lsp.protocol.MessageType.Error,
cmd = { cmd = {
"gopls", -- share the gopls instance if there is one already 'gopls', -- share the gopls instance if there is one already
"-remote=auto", --[[ debug options ]] -- '-remote=auto', --[[ debug options ]] --
-- "-logfile=auto", -- "-logfile=auto",
-- "-debug=:0", -- "-debug=:0",
"-remote.debug=:0" '-remote.debug=:0',
-- "-rpc.trace", -- "-rpc.trace",
}, },
flags = {allow_incremental_sync = true, debounce_text_changes = 1000}, flags = { allow_incremental_sync = true, debounce_text_changes = 1000 },
settings = { settings = {
gopls = { gopls = {
-- more settings: https://github.com/golang/tools/blob/master/gopls/doc/settings.md -- more settings: https://github.com/golang/tools/blob/master/gopls/doc/settings.md
-- flags = {allow_incremental_sync = true, debounce_text_changes = 500}, -- flags = {allow_incremental_sync = true, debounce_text_changes = 500},
-- not supported -- not supported
analyses = {unusedparams = true, unreachable = false}, analyses = { unusedparams = true, unreachable = false },
codelenses = { codelenses = {
generate = true, -- show the `go generate` lens. generate = true, -- show the `go generate` lens.
gc_details = true, -- // Show a code lens toggling the display of gc's choices. gc_details = true, -- // Show a code lens toggling the display of gc's choices.
test = true, test = true,
tidy = true tidy = true,
}, },
usePlaceholders = true, usePlaceholders = true,
completeUnimported = true, completeUnimported = true,
staticcheck = true, staticcheck = true,
matcher = "fuzzy", matcher = 'fuzzy',
diagnosticsDelay = "500ms", diagnosticsDelay = '500ms',
experimentalWatchedFileDelay = "1000ms", experimentalWatchedFileDelay = '1000ms',
symbolMatcher = "fuzzy", symbolMatcher = 'fuzzy',
gofumpt = false, -- true, -- turn on for new repos, gofmpt is good but also create code turmoils gofumpt = false, -- true, -- turn on for new repos, gofmpt is good but also create code turmoils
buildFlags = {"-tags", "integration"} buildFlags = { '-tags', 'integration' },
-- buildFlags = {"-tags", "functional"} -- buildFlags = {"-tags", "functional"}
} },
}, },
root_dir = function(fname) root_dir = function(fname)
return util.root_pattern("go.mod", ".git")(fname) or dirname(fname) -- util.path.dirname(fname) return util.root_pattern('go.mod', '.git')(fname) or dirname(fname) -- util.path.dirname(fname)
end end,
}, },
clangd = { clangd = {
flags = {allow_incremental_sync = true, debounce_text_changes = 500}, flags = { allow_incremental_sync = true, debounce_text_changes = 500 },
cmd = { cmd = {
"clangd", "--background-index", "--suggest-missing-includes", "--clang-tidy", 'clangd',
"--header-insertion=iwyu", "--clang-tidy-checks=-*,llvm-*,clang-analyzer-*", '--background-index',
"--cross-file-rename" '--suggest-missing-includes',
'--clang-tidy',
'--header-insertion=iwyu',
'--clang-tidy-checks=-*,llvm-*,clang-analyzer-*',
'--cross-file-rename',
}, },
filetypes = {"c", "cpp", "objc", "objcpp"}, filetypes = { 'c', 'cpp', 'objc', 'objcpp' },
on_attach = function(client) on_attach = function(client)
client.resolved_capabilities.document_formatting = true client.resolved_capabilities.document_formatting = true
on_attach(client) on_attach(client)
end end,
}, },
rust_analyzer = { rust_analyzer = {
root_dir = function(fname) root_dir = function(fname)
return util.root_pattern("Cargo.toml", "rust-project.json", ".git")(fname) or util.path.dirname(fname) return util.root_pattern('Cargo.toml', 'rust-project.json', '.git')(fname) or util.path.dirname(fname)
end, end,
filetypes = {"rust"}, filetypes = { 'rust' },
message_level = vim.lsp.protocol.MessageType.error, message_level = vim.lsp.protocol.MessageType.error,
on_attach = on_attach, on_attach = on_attach,
settings = { settings = {
["rust-analyzer"] = { ['rust-analyzer'] = {
assist = {importMergeBehavior = "last", importPrefix = "by_self"}, assist = { importMergeBehavior = 'last', importPrefix = 'by_self' },
cargo = {loadOutDirsFromCheck = true}, cargo = { loadOutDirsFromCheck = true },
procMacro = {enable = true} procMacro = { enable = true },
} },
}, },
flags = {allow_incremental_sync = true, debounce_text_changes = 500} flags = { allow_incremental_sync = true, debounce_text_changes = 500 },
}, },
sqls = { sqls = {
filetypes = {"sql"}, filetypes = { 'sql' },
on_attach = function(client, bufnr) on_attach = function(client, bufnr)
client.resolved_capabilities.execute_command = true client.resolved_capabilities.execute_command = true
highlight.diagnositc_config_sign() highlight.diagnositc_config_sign()
require"sqls".setup {picker = "telescope"} -- or default require('sqls').setup({ picker = 'telescope' }) -- or default
end, end,
flags = {allow_incremental_sync = true, debounce_text_changes = 500}, flags = { allow_incremental_sync = true, debounce_text_changes = 500 },
settings = { settings = {
cmd = {"sqls", "-config", "$HOME/.config/sqls/config.yml"} cmd = { 'sqls', '-config', '$HOME/.config/sqls/config.yml' },
-- alterantively: -- alterantively:
-- connections = { -- connections = {
-- { -- {
@ -201,92 +205,124 @@ local setups = {
-- datasourcename = 'host=127.0.0.1 port=5432 user=postgres password=password dbname=user_db sslmode=disable', -- datasourcename = 'host=127.0.0.1 port=5432 user=postgres password=password dbname=user_db sslmode=disable',
-- }, -- },
-- }, -- },
} },
}, },
sumneko_lua = { sumneko_lua = {
cmd = {"lua-language-server"}, cmd = { 'lua-language-server' },
filetypes = {"lua"}, filetypes = { 'lua' },
on_attach = on_attach, on_attach = on_attach,
flags = {allow_incremental_sync = true, debounce_text_changes = 500}, flags = { allow_incremental_sync = true, debounce_text_changes = 500 },
settings = { settings = {
Lua = { Lua = {
runtime = { runtime = {
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) -- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
version = "LuaJIT", version = 'LuaJIT',
-- Setup your lua path -- Setup your lua path
path = vim.split(package.path, ";") path = vim.split(package.path, ';'),
}, },
diagnostics = { diagnostics = {
enable = true, enable = true,
-- Get the language server to recognize the `vim` global -- Get the language server to recognize the `vim` global
globals = {"vim", "describe", "it", "before_each", "after_each", "teardown", "pending"} globals = { 'vim', 'describe', 'it', 'before_each', 'after_each', 'teardown', 'pending' },
}, },
completion = {callSnippet = "Both"}, completion = { callSnippet = 'Both' },
workspace = { workspace = {
-- Make the server aware of Neovim runtime files -- Make the server aware of Neovim runtime files
library = library, library = library,
maxPreload = 2000, maxPreload = 2000,
preloadFileSize = 40000 preloadFileSize = 40000,
}, },
telemetry = {enable = false} telemetry = { enable = false },
} },
}, },
on_new_config = function(cfg, root) on_new_config = function(cfg, root)
local libs = vim.tbl_deep_extend('force', {}, library) local libs = vim.tbl_deep_extend('force', {}, library)
libs[root] = nil libs[root] = nil
cfg.settings.Lua.workspace.library = libs cfg.settings.Lua.workspace.library = libs
return cfg return cfg
end end,
}, },
pyright = { pyright = {
on_attach = on_attach, on_attach = on_attach,
cmd = {"pyright-langserver", "--stdio"}, cmd = { 'pyright-langserver', '--stdio' },
filetypes = {"python"}, filetypes = { 'python' },
flags = {allow_incremental_sync = true, debounce_text_changes = 500}, flags = { allow_incremental_sync = true, debounce_text_changes = 500 },
settings = { settings = {
python = { python = {
formatting = {provider = 'black'}, formatting = { provider = 'black' },
analysis = { analysis = {
autoSearchPaths = true, autoSearchPaths = true,
useLibraryCodeForTypes = true, useLibraryCodeForTypes = true,
diagnosticMode = "workspace" diagnosticMode = 'workspace',
} },
} },
} },
}, },
ccls = { ccls = {
on_attach = on_attach, on_attach = on_attach,
init_options = { init_options = {
compilationDatabaseDirectory = "build", compilationDatabaseDirectory = 'build',
root_dir = [[ util.root_pattern("compile_commands.json", "compile_flags.txt", "CMakeLists.txt", "Makefile", ".git") or util.path.dirname ]], root_dir = [[ util.root_pattern("compile_commands.json", "compile_flags.txt", "CMakeLists.txt", "Makefile", ".git") or util.path.dirname ]],
index = {threads = 2}, index = { threads = 2 },
clang = {excludeArgs = {"-frounding-math"}} clang = { excludeArgs = { '-frounding-math' } },
}, },
flags = {allow_incremental_sync = true} flags = { allow_incremental_sync = true },
}, },
jdtls = { jdtls = {
settings = { settings = {
java = {signatureHelp = {enabled = true}, contentProvider = {preferred = 'fernflower'}} java = { signatureHelp = { enabled = true }, contentProvider = { preferred = 'fernflower' } },
} },
} },
} }
setups.sumneko_lua = vim.tbl_deep_extend('force', luadev, setups.sumneko_lua) setups.sumneko_lua = vim.tbl_deep_extend('force', luadev, setups.sumneko_lua)
local servers = { local servers = {
"angularls", "gopls", "tsserver", "flow", "bashls", "dockerls", "julials", "pylsp", "pyright", 'angularls',
"jedi_language_server", "jdtls", "sumneko_lua", "vimls", "html", "jsonls", "solargraph", "cssls", 'gopls',
"yamlls", "clangd", "ccls", "sqls", "denols", "graphql", "dartls", "dotls", 'tsserver',
"kotlin_language_server", "nimls", "intelephense", "vuels", "phpactor", "omnisharp", 'flow',
"r_language_server", "rust_analyzer", "terraformls", "svelte", "texlab", "clojure_lsp" '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',
'r_language_server',
'rust_analyzer',
'terraformls',
'svelte',
'texlab',
'clojure_lsp',
} }
local has_lspinst = false local has_lspinst = false
if config.lsp_installer == true then if config.lsp_installer == true then
has_lspinst, _ = pcall(require, "nvim-lsp-installer") has_lspinst, _ = pcall(require, 'nvim-lsp-installer')
if has_lspinst then if has_lspinst then
local srvs = require'nvim-lsp-installer.servers'.get_installed_servers() local srvs = require('nvim-lsp-installer.servers').get_installed_servers()
log('lsp_installered servers', srvs) log('lsp_installered servers', srvs)
if #srvs > 0 then if #srvs > 0 then
servers = srvs servers = srvs
@ -300,7 +336,7 @@ end
local ng_default_cfg = { local ng_default_cfg = {
on_attach = on_attach, on_attach = on_attach,
flags = {allow_incremental_sync = true, debounce_text_changes = 1000} flags = { allow_incremental_sync = true, debounce_text_changes = 1000 },
} }
local configs = {} local configs = {}
@ -315,7 +351,7 @@ local function load_cfg(ft, client, cfg, loaded)
log(ft, client, loaded) log(ft, client, loaded)
if lspconfig[client] == nil then if lspconfig[client] == nil then
log("not supported by nvim", client) log('not supported by nvim', client)
return return
end end
@ -342,26 +378,25 @@ local function load_cfg(ft, client, cfg, loaded)
for _, c in pairs(loaded) do for _, c in pairs(loaded) do
if client == c then if client == c then
-- loaded -- loaded
trace(client, "already been loaded for", ft, loaded) trace(client, 'already been loaded for', ft, loaded)
return return
end end
end end
if lspconfig[client] == nil then if lspconfig[client] == nil then
error("client " .. client .. " not supported") error('client ' .. client .. ' not supported')
return return
end end
trace("load cfg", cfg) trace('load cfg', cfg)
log('lspconfig setup') log('lspconfig setup')
-- log(lspconfig.available_servers()) -- log(lspconfig.available_servers())
-- force reload with config -- force reload with config
lspconfig[client].setup(cfg) lspconfig[client].setup(cfg)
vim.defer_fn(function() vim.defer_fn(function()
vim.cmd([[doautocmd FileType ]] .. ft) vim.cmd([[doautocmd FileType ]] .. ft)
end, 100) end, 100)
log(client, "loading for", ft) log(client, 'loading for', ft)
end end
-- need to verify the lsp server is up -- need to verify the lsp server is up
end end
@ -378,9 +413,9 @@ local function lsp_startup(ft, retry, user_lsp_opts)
capabilities.textDocument.completion.completionItem.labelDetailsSupport = true capabilities.textDocument.completion.completionItem.labelDetailsSupport = true
capabilities.textDocument.completion.completionItem.deprecatedSupport = true capabilities.textDocument.completion.completionItem.deprecatedSupport = true
capabilities.textDocument.completion.completionItem.commitCharactersSupport = true capabilities.textDocument.completion.completionItem.commitCharactersSupport = true
capabilities.textDocument.completion.completionItem.tagSupport = {valueSet = {1}} capabilities.textDocument.completion.completionItem.tagSupport = { valueSet = { 1 } }
capabilities.textDocument.completion.completionItem.resolveSupport = { capabilities.textDocument.completion.completionItem.resolveSupport = {
properties = {'documentation', 'detail', 'additionalTextEdits'} properties = { 'documentation', 'detail', 'additionalTextEdits' },
} }
capabilities.workspace.configuration = true capabilities.workspace.configuration = true
@ -396,13 +431,13 @@ local function lsp_startup(ft, retry, user_lsp_opts)
if lspclient.name then if lspclient.name then
lspclient = lspclient.name lspclient = lspclient.name
else else
warn("incorrect set for lspclient", vim.inspect(lspclient)) warn('incorrect set for lspclient', vim.inspect(lspclient))
goto continue goto continue
end end
end end
if user_lsp_opts[lspclient] ~= nil and user_lsp_opts[lspclient].filetypes ~= nil then if user_lsp_opts[lspclient] ~= nil and user_lsp_opts[lspclient].filetypes ~= nil then
if not vim.tbl_contains(user_lsp_opts[lspclient].filetypes, ft) then if not vim.tbl_contains(user_lsp_opts[lspclient].filetypes, ft) then
trace("ft", ft, "disabled for", lspclient) trace('ft', ft, 'disabled for', lspclient)
goto continue goto continue
end end
end end
@ -412,30 +447,30 @@ local function lsp_startup(ft, retry, user_lsp_opts)
end end
if vim.tbl_contains(config.lsp.disable_lsp or {}, lspclient) then if vim.tbl_contains(config.lsp.disable_lsp or {}, lspclient) then
log("disable lsp", lspclient) log('disable lsp', lspclient)
goto continue goto continue
end end
local default_config = {} local default_config = {}
log(lspclient) log(lspclient)
if lspconfig[lspclient] == nil then if lspconfig[lspclient] == nil then
print("lspclient", lspclient, "no longer support by lspconfig, please submit an issue") print('lspclient', lspclient, 'no longer support by lspconfig, please submit an issue')
goto continue goto continue
end end
if lspconfig[lspclient].document_config and lspconfig[lspclient].document_config.default_config then if lspconfig[lspclient].document_config and lspconfig[lspclient].document_config.default_config then
default_config = lspconfig[lspclient].document_config.default_config default_config = lspconfig[lspclient].document_config.default_config
else else
print("missing document config for client: ", lspclient) print('missing document config for client: ', lspclient)
goto continue goto continue
end end
default_config = vim.tbl_deep_extend("force", default_config, ng_default_cfg) default_config = vim.tbl_deep_extend('force', default_config, ng_default_cfg)
local cfg = setups[lspclient] or {} local cfg = setups[lspclient] or {}
cfg = vim.tbl_deep_extend("keep", cfg, default_config) cfg = vim.tbl_deep_extend('keep', cfg, default_config)
-- filetype disabled -- filetype disabled
if not vim.tbl_contains(cfg.filetypes or {}, ft) then if not vim.tbl_contains(cfg.filetypes or {}, ft) then
trace("ft", ft, "disabled for", lspclient) trace('ft', ft, 'disabled for', lspclient)
goto continue goto continue
end end
@ -447,10 +482,10 @@ local function lsp_startup(ft, retry, user_lsp_opts)
log(lspclient, config.lsp.disable_format_cap) log(lspclient, config.lsp.disable_format_cap)
if vim.tbl_contains(config.lsp.disable_format_cap or {}, lspclient) then if vim.tbl_contains(config.lsp.disable_format_cap or {}, lspclient) then
log("fileformat disabled for ", lspclient) log('fileformat disabled for ', lspclient)
disable_fmt = true disable_fmt = true
end end
cfg = vim.tbl_deep_extend("force", cfg, user_lsp_opts[lspclient]) cfg = vim.tbl_deep_extend('force', cfg, user_lsp_opts[lspclient])
if config.combined_attach == nil then if config.combined_attach == nil then
cfg.on_attach = function(client, bufnr) cfg.on_attach = function(client, bufnr)
on_attach(client, bufnr) on_attach(client, bufnr)
@ -459,9 +494,9 @@ local function lsp_startup(ft, retry, user_lsp_opts)
end end
end end
end end
if config.combined_attach == "mine" then if config.combined_attach == 'mine' then
if config.on_attach == nil then if config.on_attach == nil then
error("on attach not provided") error('on attach not provided')
end end
cfg.on_attach = function(client, bufnr) cfg.on_attach = function(client, bufnr)
config.on_attach(client, bufnr) config.on_attach(client, bufnr)
@ -470,7 +505,7 @@ local function lsp_startup(ft, retry, user_lsp_opts)
end end
end end
end end
if config.combined_attach == "both" then if config.combined_attach == 'both' then
cfg.on_attach = function(client, bufnr) cfg.on_attach = function(client, bufnr)
if config.on_attach then if config.on_attach then
config.on_attach(client, bufnr) config.on_attach(client, bufnr)
@ -487,7 +522,7 @@ local function lsp_startup(ft, retry, user_lsp_opts)
end end
cfg.on_init = function(client) cfg.on_init = function(client)
if client and client.config and client.config.settings then if client and client.config and client.config.settings then
client.notify('workspace/didChangeConfiguration', {settings = client.config.settings}) client.notify('workspace/didChangeConfiguration', { settings = client.config.settings })
end end
end end
end end
@ -495,7 +530,7 @@ local function lsp_startup(ft, retry, user_lsp_opts)
log('loading', lspclient, 'name', lspconfig[lspclient].name, 'has lspinst', has_lspinst) log('loading', lspclient, 'name', lspconfig[lspclient].name, 'has lspinst', has_lspinst)
-- start up lsp -- start up lsp
if has_lspinst and _NgConfigValues.lsp_installer then if has_lspinst and _NgConfigValues.lsp_installer then
local installed, installer_cfg = require("nvim-lsp-installer.servers").get_server(lspconfig[lspclient].name) local installed, installer_cfg = require('nvim-lsp-installer.servers').get_server(lspconfig[lspclient].name)
log('lsp server', installer_cfg, lspconfig[lspclient].name) log('lsp server', installer_cfg, lspconfig[lspclient].name)
if installed and installer_cfg then if installed and installer_cfg then
@ -511,12 +546,30 @@ local function lsp_startup(ft, retry, user_lsp_opts)
::continue:: ::continue::
end end
if not _NG_Loaded['null_ls'] then
local nulls_cfg = user_lsp_opts['null_ls']
if nulls_cfg then
local cfg = {}
cfg = vim.tbl_deep_extend('keep', cfg, nulls_cfg)
cfg.on_attach = function(client, bufnr)
if efm_cfg.on_attach then
efm_cfg.on_attach(client, bufnr)
end
on_attach(client, bufnr)
end
lspconfig['null-ls'].setup(cfg)
log('null-ls loading')
_NG_Loaded['null-ls'] = true
configs['null-ls'] = cfg
end
end
if not _NG_Loaded['efm'] then if not _NG_Loaded['efm'] then
local efm_cfg = user_lsp_opts['efm'] local efm_cfg = user_lsp_opts['efm']
if efm_cfg then if efm_cfg then
local cfg = {} local cfg = {}
cfg = vim.tbl_deep_extend("keep", cfg, efm_cfg) cfg = vim.tbl_deep_extend('keep', cfg, efm_cfg)
cfg.on_attach = function(client, bufnr) cfg.on_attach = function(client, bufnr)
if efm_cfg.on_attach then if efm_cfg.on_attach then
efm_cfg.on_attach(client, bufnr) efm_cfg.on_attach(client, bufnr)
@ -548,58 +601,67 @@ local function get_cfg(client)
end end
local function setup(user_opts) local function setup(user_opts)
log(user_opts)
local ft = vim.bo.filetype local ft = vim.bo.filetype
local bufnr = tostring(vim.api.nvim_get_current_buf()) local bufnr = vim.api.nvim_get_current_buf()
if _LoadedFiletypes[ft .. bufnr] then local uri = vim.uri_from_bufnr(bufnr)
log("navigator was loaded for ft", ft)
if uri == 'file://' or uri == 'file:///' then
log('skip loading for ft ', ft, uri)
return
end
log(user_opts)
log(uri)
if _LoadedFiletypes[ft .. tostring(bufnr)] then
log('navigator was loaded for ft', ft)
return return
end end
local disable_ft = { local disable_ft = {
"NvimTree", "guihua", "clap_input", "clap_spinner", "vista", "vista_kind", "TelescopePrompt", 'NvimTree',
"guihua_rust", "csv", "txt", "defx", "packer" 'guihua',
'clap_input',
'clap_spinner',
'vista',
'vista_kind',
'TelescopePrompt',
'guihua_rust',
'csv',
'txt',
'defx',
'packer',
} }
for i = 1, #disable_ft do for i = 1, #disable_ft do
if ft == disable_ft[i] or _LoadedFiletypes[ft] then if ft == disable_ft[i] or _LoadedFiletypes[ft] then
trace("navigator disabled for ft or it is loaded", ft) trace('navigator disabled for ft or it is loaded', ft)
return return
end end
end end
if user_opts ~= nil then if user_opts ~= nil then
log("navigator user setup", user_opts) log('navigator user setup', user_opts)
end end
trace(debug.traceback()) trace(debug.traceback())
if #vim.lsp.buf_get_clients() > 0 and user_opts == nil then if #vim.lsp.buf_get_clients() > 0 and user_opts == nil then
log("already setup") log('already setup')
return return
end end
user_opts = user_opts or config -- incase setup was triggered from autocmd user_opts = user_opts or config -- incase setup was triggered from autocmd
if ft == nil then if ft == nil then
ft = vim.api.nvim_buf_get_option(0, "filetype") ft = vim.api.nvim_buf_get_option(bufnr, 'filetype')
end end
if ft == nil or ft == "" then if ft == nil or ft == '' then
log('nil filetype, callback')
vim.defer_fn(function() vim.defer_fn(function()
setup(user_opts) setup(user_opts)
end, 500) end, 200)
log("nil filetype, callback")
return return
end end
local retry = true local retry = true
local bufnr = vim.fn.bufnr()
local uri = vim.uri_from_bufnr(bufnr)
if uri == 'file://' or uri == 'file:///' then
log("skip loading for ft ", ft, uri)
return
end
trace('setup', user_opts) trace('setup', user_opts)
log("loading for ft ", ft, uri) log('loading for ft ', ft, uri)
highlight.diagnositc_config_sign() highlight.diagnositc_config_sign()
highlight.add_highlight() highlight.add_highlight()
local lsp_opts = user_opts.lsp local lsp_opts = user_opts.lsp
@ -609,10 +671,12 @@ local function setup(user_opts)
if slua and not slua.cmd then if slua and not slua.cmd then
if slua.sumneko_root_path and slua.sumneko_binary then if slua.sumneko_root_path and slua.sumneko_binary then
lsp_opts.sumneko_lua.cmd = { lsp_opts.sumneko_lua.cmd = {
slua.sumneko_binary, "-E", slua.sumneko_root_path .. "/main.lua" slua.sumneko_binary,
'-E',
slua.sumneko_root_path .. '/main.lua',
} }
else else
lsp_opts.sumneko_lua.cmd = {"lua-language-server"} lsp_opts.sumneko_lua.cmd = { 'lua-language-server' }
end end
end end
end end
@ -621,18 +685,40 @@ local function setup(user_opts)
--- if code line enabled --- if code line enabled
if _NgConfigValues.lsp.code_lens then if _NgConfigValues.lsp.code_lens then
require("navigator.codelens").setup() require('navigator.codelens').setup()
end end
_LoadedFiletypes[ft] = true _LoadedFiletypes[ft] = true
-- _LoadedFiletypes[ft] = vim.tbl_extend("keep", _LoadedFiletypes[ft] or {}, {ft}) -- _LoadedFiletypes[ft] = vim.tbl_extend("keep", _LoadedFiletypes[ft] or {}, {ft})
end end
-- append lsps to servers -- append lsps to servers
function add_servers(lsps) function add_servers(lsps)
vim.validate {lsps = {lsps, 't'}} vim.validate({ lsps = { lsps, 't' } })
vim.list_extend(servers, lsps) vim.list_extend(servers, lsps)
end end
return {setup = setup, get_cfg = get_cfg, lsp = servers, add_servers = add_servers} function on_filetype()
local bufnr = vim.api.nvim_get_current_buf()
local uri = vim.uri_from_bufnr(bufnr)
local ft = vim.bo.filetype
if ft == nil then return end
if uri == 'file://' or uri == 'file:///' then
log('skip loading for ft ', ft, uri)
return
end
log(uri)
local wids = vim.fn.win_findbuf(bufnr)
if wins == nil or wins == {} then
log('buf not shown return')
end
setup()
end
return { setup = setup, get_cfg = get_cfg, lsp = servers, add_servers = add_servers , on_filetype = on_filetype}

@ -215,12 +215,12 @@ M.toggle_lspformat = function(on)
if on == nil then if on == nil then
print("format on save true") print("format on save true")
end end
vim.cmd([[set eventignore=""]]) vim.cmd([[set eventignore-=BufWritePre]])
else else
if on == nil then if on == nil then
print("format on save false") print("format on save false")
end end
vim.cmd([[set eventignore=BufWritePre]]) vim.cmd([[set eventignore+=BufWritePre]])
end end
end end

@ -1,36 +1,36 @@
local M = {} local M = {}
local util = require "navigator.util" local util = require('navigator.util')
local nvim_0_6 = util.nvim_0_6() local nvim_0_6 = util.nvim_0_6()
local gutil = require "guihua.util" local gutil = require('guihua.util')
local lsp = require "vim.lsp" local lsp = require('vim.lsp')
local api = vim.api local api = vim.api
local log = require"navigator.util".log local log = require('navigator.util').log
local lerr = require"navigator.util".error local lerr = require('navigator.util').error
local trace = require"navigator.util".trace local trace = require('navigator.util').trace
local symbol_kind = require"navigator.lspclient.lspkind".symbol_kind local symbol_kind = require('navigator.lspclient.lspkind').symbol_kind
local cwd = vim.loop.cwd() local cwd = vim.loop.cwd()
local is_win = vim.loop.os_uname().sysname:find("Windows") local is_win = vim.loop.os_uname().sysname:find('Windows')
local path_sep = require"navigator.util".path_sep() local path_sep = require('navigator.util').path_sep()
local path_cur = require"navigator.util".path_cur() local path_cur = require('navigator.util').path_cur()
cwd = gutil.add_pec(cwd) cwd = gutil.add_pec(cwd)
local ts_nodes = require('navigator.lru').new(1000, 1024 * 1024) local ts_nodes = require('navigator.lru').new(1000, 1024 * 1024)
local ts_nodes_time = require('navigator.lru').new(1000) local ts_nodes_time = require('navigator.lru').new(1000)
local TS_analysis_enabled = require"navigator".config_values().treesitter_analysis local TS_analysis_enabled = require('navigator').config_values().treesitter_analysis
-- extract symbol from range -- extract symbol from range
function M.get_symbol(text, range) function M.get_symbol(text, range)
if range == nil then if range == nil then
return "" return ''
end end
return string.sub(text, range.start.character + 1, range['end'].character) return string.sub(text, range.start.character + 1, range['end'].character)
end end
local function check_lhs(text, symbol) local function check_lhs(text, symbol)
local find = require'guihua.util'.word_find local find = require('guihua.util').word_find
local s = find(text, symbol) local s = find(text, symbol)
local eq = string.find(text, '=') or 0 local eq = string.find(text, '=') or 0
local eq2 = string.find(text, '==') or 0 local eq2 = string.find(text, '==') or 0
@ -40,7 +40,7 @@ local function check_lhs(text, symbol)
return false return false
end end
if s < eq and eq ~= eq2 then if s < eq and eq ~= eq2 then
trace(symbol, "modified") trace(symbol, 'modified')
end end
if eq == eq3 + 1 then if eq == eq3 + 1 then
return false return false
@ -54,18 +54,20 @@ local function check_lhs(text, symbol)
end end
function M.lines_from_locations(locations, include_filename) function M.lines_from_locations(locations, include_filename)
local fnamemodify = (function(filename) local fnamemodify = function(filename)
if include_filename then if include_filename then
return vim.fn.fnamemodify(filename, ":~:.") .. ":" return vim.fn.fnamemodify(filename, ':~:.') .. ':'
else else
return "" return ''
end end
end) end
local lines = {} local lines = {}
for _, loc in ipairs(locations) do for _, loc in ipairs(locations) do
table.insert(lines, table.insert(
(fnamemodify(loc["filename"]) .. loc["lnum"] .. ":" .. loc["col"] .. ": " .. vim.trim(loc["text"]))) lines,
(fnamemodify(loc['filename']) .. loc['lnum'] .. ':' .. loc['col'] .. ': ' .. vim.trim(loc['text']))
)
end end
return lines return lines
@ -83,18 +85,18 @@ function M.symbols_to_items(result)
item.name = result[i].name -- symbol name item.name = result[i].name -- symbol name
item.text = result[i].name item.text = result[i].name
if kind ~= nil then if kind ~= nil then
item.text = kind .. ": " .. item.text item.text = kind .. ': ' .. item.text
end end
item.filename = vim.uri_to_fname(item.uri) item.filename = vim.uri_to_fname(item.uri)
item.display_filename = item.filename:gsub(cwd .. path_sep, path_cur, 1) item.display_filename = item.filename:gsub(cwd .. path_sep, path_cur, 1)
if item.range == nil or item.range.start == nil then if item.range == nil or item.range.start == nil then
log("range not set", result[i], item) log('range not set', result[i], item)
end end
item.lnum = item.range.start.line + 1 item.lnum = item.range.start.line + 1
if item.containerName ~= nil then if item.containerName ~= nil then
item.text = "" .. item.containerName .. item.text item.text = '' .. item.containerName .. item.text
end end
table.insert(locations, item) table.insert(locations, item)
end end
@ -131,9 +133,9 @@ function M.check_capabilities(feature, client_id)
return true return true
else else
if #clients == 0 then if #clients == 0 then
log("LSP: no client attached") log('LSP: no client attached')
else else
trace("LSP: server does not support " .. feature) trace('LSP: server does not support ' .. feature)
end end
return false return false
end end
@ -145,7 +147,7 @@ function M.call_sync(method, params, opts, handler)
local results_lsp, err = lsp.buf_request_sync(0, method, params, opts.timeout or vim.g.navtator_timeout or 1000) local results_lsp, err = lsp.buf_request_sync(0, method, params, opts.timeout or vim.g.navtator_timeout or 1000)
if nvim_0_6() then if nvim_0_6() then
handler(err, extract_result(results_lsp), {method = method}, nil) handler(err, extract_result(results_lsp), { method = method }, nil)
else else
handler(err, method, extract_result(results_lsp), nil, nil) handler(err, method, extract_result(results_lsp), nil, nil)
end end
@ -163,18 +165,18 @@ end
local function ts_functions(uri) local function ts_functions(uri)
local unload_bufnr local unload_bufnr
local ts_enabled, _ = pcall(require, "nvim-treesitter.locals") local ts_enabled, _ = pcall(require, 'nvim-treesitter.locals')
if not ts_enabled or not TS_analysis_enabled then if not ts_enabled or not TS_analysis_enabled then
lerr("ts not enabled") lerr('ts not enabled')
return nil return nil
end end
local ts_func = require"navigator.treesitter".buf_func local ts_func = require('navigator.treesitter').buf_func
local bufnr = vim.uri_to_bufnr(uri) local bufnr = vim.uri_to_bufnr(uri)
local x = os.clock() local x = os.clock()
trace(ts_nodes) trace(ts_nodes)
local tsnodes = ts_nodes:get(uri) local tsnodes = ts_nodes:get(uri)
if tsnodes ~= nil then if tsnodes ~= nil then
trace("get data from cache") trace('get data from cache')
local t = ts_nodes_time:get(uri) or 0 local t = ts_nodes_time:get(uri) or 0
local fname = vim.uri_to_fname(uri) local fname = vim.uri_to_fname(uri)
local modified = vim.fn.getftime(fname) local modified = vim.fn.getftime(fname)
@ -188,7 +190,7 @@ local function ts_functions(uri)
end end
local unload = false local unload = false
if not api.nvim_buf_is_loaded(bufnr) then if not api.nvim_buf_is_loaded(bufnr) then
trace("! load buf !", uri, bufnr) trace('! load buf !', uri, bufnr)
vim.fn.bufload(bufnr) vim.fn.bufload(bufnr)
-- vim.api.nvim_buf_detach(bufnr) -- if user opens the buffer later, it prevents user attach event -- vim.api.nvim_buf_detach(bufnr) -- if user opens the buffer later, it prevents user attach event
unload = true unload = true
@ -201,35 +203,35 @@ local function ts_functions(uri)
ts_nodes:set(uri, funcs) ts_nodes:set(uri, funcs)
ts_nodes_time:set(uri, os.time()) ts_nodes_time:set(uri, os.time())
trace(funcs, ts_nodes:get(uri)) trace(funcs, ts_nodes:get(uri))
trace(string.format("elapsed time: %.4f\n", os.clock() - x)) -- how long it tooks trace(string.format('elapsed time: %.4f\n', os.clock() - x)) -- how long it tooks
return funcs, unload_bufnr return funcs, unload_bufnr
end end
local function ts_definition(uri, range) local function ts_definition(uri, range)
local unload_bufnr local unload_bufnr
local ts_enabled, _ = pcall(require, "nvim-treesitter.locals") local ts_enabled, _ = pcall(require, 'nvim-treesitter.locals')
if not ts_enabled or not TS_analysis_enabled then if not ts_enabled or not TS_analysis_enabled then
lerr("ts not enabled") lerr('ts not enabled')
return nil return nil
end end
local key = string.format('%s_%d_%d_%d', uri, range.start.line, range.start.character, range['end'].line) local key = string.format('%s_%d_%d_%d', uri, range.start.line, range.start.character, range['end'].line)
local tsnode = ts_nodes:get(key) local tsnodes = ts_nodes:get(key)
local ftime = ts_nodes_time:get(key) local ftime = ts_nodes_time:get(key)
local fname = vim.uri_to_fname(uri) local fname = vim.uri_to_fname(uri)
local modified = vim.fn.getftime(fname) local modified = vim.fn.getftime(fname)
if tsnodes and modified <= ftime then if tsnodes and modified <= ftime then
log('ts def from cache') log('ts def from cache')
return tsnode return tsnodes
end end
local ts_def = require"navigator.treesitter".find_definition local ts_def = require('navigator.treesitter').find_definition
local bufnr = vim.uri_to_bufnr(uri) local bufnr = vim.uri_to_bufnr(uri)
local x = os.clock() local x = os.clock()
trace(ts_nodes) trace(ts_nodes)
local unload = false local unload = false
if not api.nvim_buf_is_loaded(bufnr) then if not api.nvim_buf_is_loaded(bufnr) then
log("! load buf !", uri, bufnr) log('! load buf !', uri, bufnr)
vim.fn.bufload(bufnr) vim.fn.bufload(bufnr)
unload = true unload = true
end end
@ -238,7 +240,7 @@ local function ts_definition(uri, range)
if unload then if unload then
unload_bufnr = bufnr unload_bufnr = bufnr
end end
trace(string.format(" ts def elapsed time: %.4f\n", os.clock() - x), def_range) -- how long it takes trace(string.format(' ts def elapsed time: %.4f\n', os.clock() - x), def_range) -- how long it takes
ts_nodes:set(key, def_range) ts_nodes:set(key, def_range)
ts_nodes_time:set(key, x) ts_nodes_time:set(key, x)
return def_range, unload_bufnr return def_range, unload_bufnr
@ -279,7 +281,7 @@ local function slice_locations(locations, max_items)
if #locations > max_items then if #locations > max_items then
local uri = locations[max_items] local uri = locations[max_items]
for i = max_items + 1, #locations do for i = max_items + 1, #locations do
if uri ~= locations[i] and not brk then if uri ~= locations[i] then
cut = i cut = i
break break
end end
@ -291,15 +293,17 @@ local function slice_locations(locations, max_items)
second_part = vim.list_slice(locations, cut + 1, #locations) second_part = vim.list_slice(locations, cut + 1, #locations)
end end
return first_part, second_part return first_part, second_part
end end
local function test_locations() local function test_locations()
local locations = { local locations = {
{uri = '1', range = {start = {line = 1}}}, {uri = '2', range = {start = {line = 2}}}, { uri = '1', range = { start = { line = 1 } } },
{uri = '2', range = {start = {line = 3}}}, {uri = '1', range = {start = {line = 3}}}, { uri = '2', range = { start = { line = 2 } } },
{uri = '1', range = {start = {line = 4}}}, {uri = '3', range = {start = {line = 4}}}, { uri = '2', range = { start = { line = 3 } } },
{uri = '3', range = {start = {line = 4}}} { uri = '1', range = { start = { line = 3 } } },
{ uri = '1', range = { start = { line = 4 } } },
{ uri = '3', range = { start = { line = 4 } } },
{ uri = '3', range = { start = { line = 4 } } },
} }
local second_part local second_part
order_locations(locations) order_locations(locations)
@ -310,7 +314,7 @@ end
function M.locations_to_items(locations, max_items) function M.locations_to_items(locations, max_items)
max_items = max_items or 100000 -- max_items = max_items or 100000 --
if not locations or vim.tbl_isempty(locations) then if not locations or vim.tbl_isempty(locations) then
print("list not avalible") print('list not avalible')
return return
end end
local width = 4 local width = 4
@ -325,12 +329,14 @@ function M.locations_to_items(locations, max_items)
locations, second_part = slice_locations(locations, max_items) locations, second_part = slice_locations(locations, max_items)
trace(locations) trace(locations)
vim.cmd([[set eventignore+=FileType]])
local cut = -1 local cut = -1
local unload_bufnrs = {} local unload_bufnrs = {}
for i, loc in ipairs(locations) do for i, loc in ipairs(locations) do
local funcs = nil local funcs = nil
local item = lsp.util.locations_to_items({loc})[1] local item = lsp.util.locations_to_items({ loc })[1]
-- log(item) -- log(item)
item.range = locations[i].range or locations[i].targetRange item.range = locations[i].range or locations[i].targetRange
item.uri = locations[i].uri or locations[i].targetUri item.uri = locations[i].uri or locations[i].targetUri
@ -376,7 +382,7 @@ function M.locations_to_items(locations, max_items)
local def = uri_def[item.uri] local def = uri_def[item.uri]
if def and def.start and item.range then if def and def.start and item.range then
if def.start.line == item.range.start.line then if def.start.line == item.range.start.line then
log("ts def in current line") log('ts def in current line')
item.definition = true item.definition = true
end end
end end
@ -400,17 +406,19 @@ function M.locations_to_items(locations, max_items)
vim.defer_fn(function() vim.defer_fn(function()
for i, bufnr_unload in ipairs(unload_bufnrs) do for i, bufnr_unload in ipairs(unload_bufnrs) do
if api.nvim_buf_is_loaded(bufnr_unload) and i > 10 then if api.nvim_buf_is_loaded(bufnr_unload) and i > 10 then
api.nvim_buf_delete(bufnr_unload, {unload = true}) api.nvim_buf_delete(bufnr_unload, { unload = true })
end end
end end
end, 100) end, 100)
end end
vim.cmd([[set eventignore-=FileType]])
return items, width + 24, second_part -- TODO handle long line? return items, width + 24, second_part -- TODO handle long line?
end end
function M.apply_action(action, ctx, client) function M.apply_action(action, ctx, client)
assert(action ~= nil, "action must not be nil") assert(action ~= nil, 'action must not be nil')
if action.edit then if action.edit then
vim.lsp.util.apply_workspace_edit(action.edit) vim.lsp.util.apply_workspace_edit(action.edit)
end end
@ -426,7 +434,6 @@ function M.apply_action(action, ctx, client)
end end
end end
log(action) log(action)
end end
local function apply_action(action, client, ctx) local function apply_action(action, client, ctx)
@ -466,9 +473,12 @@ function M.on_user_choice(action_tuple, ctx)
-- --
local client = vim.lsp.get_client_by_id(action_tuple[1]) local client = vim.lsp.get_client_by_id(action_tuple[1])
local action = action_tuple[2] local action = action_tuple[2]
if not action.edit and client and type(client.resolved_capabilities.code_action) == 'table' if
and client.resolved_capabilities.code_action.resolveProvider then not action.edit
and client
and type(client.resolved_capabilities.code_action) == 'table'
and client.resolved_capabilities.code_action.resolveProvider
then
client.request('codeAction/resolve', action, function(err, resolved_action) client.request('codeAction/resolve', action, function(err, resolved_action)
if err then if err then
vim.notify(err.code .. ': ' .. err.message, vim.log.levels.ERROR) vim.notify(err.code .. ': ' .. err.message, vim.log.levels.ERROR)
@ -483,7 +493,7 @@ end
function M.symbol_to_items(locations) function M.symbol_to_items(locations)
if not locations or vim.tbl_isempty(locations) then if not locations or vim.tbl_isempty(locations) then
print("list not avalible") print('list not avalible')
return return
end end
@ -520,7 +530,6 @@ function M.request(method, hdlr) -- e.g textDocument/reference
vim.lsp.for_each_buffer_client(bufnr, function(client, client_id, _bufnr) vim.lsp.for_each_buffer_client(bufnr, function(client, client_id, _bufnr)
client.request(method, ref_params, hdlr, bufnr) client.request(method, ref_params, hdlr, bufnr)
end) end)
end end
return M return M

@ -0,0 +1 @@
std="vim"

@ -0,0 +1,4 @@
indent_type = "Spaces"
indent_width = 2
column_width = 120
quote_style = "AutoPreferSingle"

@ -0,0 +1,20 @@
local func = function(p, uv)
local before = os.time()
local async
async = uv.new_async(function(a, b, c)
p('in async notify callback')
p(a, b, c)
uv.close(async)
end)
local args = {500, 'string', nil, false, 5, "helloworld", async}
local unpack = unpack or table.unpack
uv.new_thread(function(num, s, null, bool, five, hw, asy)
local uv2 = require 'luv'
uv2.async_send(asy, 'a', true, 250)
uv2.sleep(1000)
end, unpack(args)):join()
local elapsed = (os.time() - before) * 1000
assert(elapsed >= 1000, "elapsed should be at least delay ")
end
func(print, vim.loop)

@ -0,0 +1,53 @@
[selene]
base = "lua51"
name = "vim"
[vim]
any = true
[_G]
property = true
writable = "new-fields"
[debug]
property = true
[[describe.args]]
type = "string"
[[describe.args]]
type = "function"
[[it.args]]
type = "string"
[[it.args]]
type = "function"
[[before_each.args]]
type = "function"
[[after_each.args]]
type = "function"
[assert.is_not]
any = true
[[assert.equals.args]]
type = "any"
[[assert.equals.args]]
type = "any"
[[assert.equals.args]]
type = "any"
required = false
[[assert.same.args]]
type = "any"
[[assert.same.args]]
type = "any"
[[assert.truthy.args]]
type = "any"
[[assert.spy.args]]
type = "any"
[[assert.stub.args]]
type = "any"
Loading…
Cancel
Save