summaryrefslogtreecommitdiff
path: root/.config/nvim/lua/lsp
diff options
context:
space:
mode:
Diffstat (limited to '.config/nvim/lua/lsp')
-rw-r--r--.config/nvim/lua/lsp/handlers.lua135
-rw-r--r--.config/nvim/lua/lsp/init.lua18
-rw-r--r--.config/nvim/lua/lsp/null-ls/formatters.lua8
-rw-r--r--.config/nvim/lua/lsp/null-ls/init.lua2
-rw-r--r--.config/nvim/lua/lsp/null-ls/linters.lua8
-rw-r--r--.config/nvim/lua/lsp/peek.lua25
6 files changed, 111 insertions, 85 deletions
diff --git a/.config/nvim/lua/lsp/handlers.lua b/.config/nvim/lua/lsp/handlers.lua
index e273261..d19cb33 100644
--- a/.config/nvim/lua/lsp/handlers.lua
+++ b/.config/nvim/lua/lsp/handlers.lua
@@ -3,69 +3,108 @@
local M = {}
function M.setup()
- vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(
- vim.lsp.diagnostic.on_publish_diagnostics,
- {
+ vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
+ virtual_text = options.lsp.diagnostics.virtual_text,
+ signs = options.lsp.diagnostics.signs.active,
+ underline = options.lsp.document_highlight,
+ })
+
+ vim.lsp.handlers["textDocument/publishDiagnostics"] = function(_, _, params, client_id, _)
+ local config = { -- your config
virtual_text = options.lsp.diagnostics.virtual_text,
- signs = options.lsp.diagnostics.signs.active,
- underline = options.lsp.document_highlight,
+ signs = options.lsp.diagnostics.signs,
+ underline = options.lsp.diagnostics.underline,
+ update_in_insert = options.lsp.diagnostics.update_in_insert,
+ severity_sort = options.lsp.diagnostics.severity_sort,
}
- )
+ local uri = params.uri
+ local bufnr = vim.uri_to_bufnr(uri)
- vim.lsp.handlers["textDocument/publishDiagnostics"] =
- function(_, _, params, client_id, _)
- local config = { -- your config
- virtual_text = options.lsp.diagnostics.virtual_text,
- signs = options.lsp.diagnostics.signs,
- underline = options.lsp.diagnostics.underline,
- update_in_insert = options.lsp.diagnostics.update_in_insert,
- severity_sort = options.lsp.diagnostics.severity_sort,
- }
- local uri = params.uri
- local bufnr = vim.uri_to_bufnr(uri)
+ if not bufnr then
+ return
+ end
- if not bufnr then
- return
- end
+ local diagnostics = params.diagnostics
- local diagnostics = params.diagnostics
+ vim.lsp.diagnostic.save(diagnostics, bufnr, client_id)
- for i, v in ipairs(diagnostics) do
- local source = v.source
- if source then
- if string.find(source, "/") then
- source = string.sub(v.source, string.find(v.source, "([%w-_]+)$"))
- end
- diagnostics[i].message = string.format("%s: %s", source, v.message)
- else
- diagnostics[i].message = string.format("%s", v.message)
- end
+ if not vim.api.nvim_buf_is_loaded(bufnr) then
+ return
+ end
+ vim.lsp.diagnostic.display(diagnostics, bufnr, client_id, config)
+ end
- if vim.tbl_contains(vim.tbl_keys(v), "code") then
- diagnostics[i].message = diagnostics[i].message
- .. string.format(" [%s]", v.code)
- end
- end
+ vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
+ border = options.lsp.popup_border,
+ })
- vim.lsp.diagnostic.save(diagnostics, bufnr, client_id)
+ vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, {
+ border = options.lsp.popup_border,
+ })
+end
+
+function M.show_line_diagnostics()
+ local diagnostics = vim.lsp.diagnostic.get_line_diagnostics()
+ local diags = vim.deepcopy(diagnostics)
+ local height = #diagnostics
+ local width = 0
+ local opts = {}
+ local close_events = { "CursorMoved", "CursorMovedI", "BufHidden", "InsertCharPre" }
+ local diagnostic_severities = {
+ "Error",
+ "Warning",
+ "Information",
+ "Hint",
+ }
+ if height == 0 then
+ return
+ end
+ local bufnr = vim.api.nvim_create_buf(false, true)
- if not vim.api.nvim_buf_is_loaded(bufnr) then
- return
+ for i, diagnostic in ipairs(diagnostics) do
+ local source = diagnostic.source
+ if source then
+ if string.find(source, "/") then
+ source = string.sub(diagnostic.source, string.find(diagnostic.source, "([%w-_]+)$"))
end
+ diags[i].message = string.format("%s: %s", source, diagnostic.message)
+ else
+ diags[i].message = string.format("%s", diagnostic.message)
+ end
- vim.lsp.diagnostic.display(diagnostics, bufnr, client_id, config)
+ if diagnostic.code then
+ diags[i].message = string.format("%s [%s]", diags[i].message, diagnostic.code)
+ end
+ if diags[i].message:len() > width then
+ width = string.len(diags[i].message)
end
+ end
- vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
- border = options.lsp.popup_border,
- })
+ opts = vim.lsp.util.make_floating_popup_options(width, height, opts)
+ opts["style"] = "minimal"
+ opts["border"] = "rounded"
- vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(
- vim.lsp.handlers.signature_help,
- {
- border = options.lsp.popup_border,
- }
+ vim.api.nvim_buf_set_option(bufnr, "bufhidden", "wipe")
+ local winnr = vim.api.nvim_open_win(bufnr, false, opts)
+ vim.api.nvim_win_set_option(winnr, "winblend", 0)
+ vim.api.nvim_buf_set_var(bufnr, "lsp_floating_window", winnr)
+ for i, diag in ipairs(diags) do
+ local message = diag.message:gsub("[\n\r]", " ")
+ vim.api.nvim_buf_set_lines(bufnr, i - 1, i - 1, 0, { message })
+ vim.api.nvim_buf_add_highlight(
+ bufnr,
+ -1,
+ "LspDiagnosticsFloating" .. diagnostic_severities[diag.severity],
+ i - 1,
+ 0,
+ diag.message:len()
+ )
+ end
+
+ vim.api.nvim_command(
+ "autocmd QuitPre <buffer> ++nested ++once lua pcall(vim.api.nvim_win_close, " .. winnr .. ", true)"
)
+ vim.lsp.util.close_preview_autocmd(close_events, winnr)
end
return M
diff --git a/.config/nvim/lua/lsp/init.lua b/.config/nvim/lua/lsp/init.lua
index b693dec..f0f7b45 100644
--- a/.config/nvim/lua/lsp/init.lua
+++ b/.config/nvim/lua/lsp/init.lua
@@ -19,9 +19,9 @@ local function lsp_highlight_document(client)
if client.resolved_capabilities.document_highlight then
vim.api.nvim_exec(
[[
- hi LspReferenceRead cterm=bold ctermbg=red guibg=#464646
- hi LspReferenceText cterm=bold ctermbg=red guibg=#464646
- hi LspReferenceWrite cterm=bold ctermbg=red guibg=#464646
+ hi LspReferenceRead cterm=bold ctermbg=red guibg=#353d46
+ hi LspReferenceText cterm=bold ctermbg=red guibg=#353d46
+ hi LspReferenceWrite cterm=bold ctermbg=red guibg=#353d46
augroup lsp_document_highlight
autocmd! * <buffer>
autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()
@@ -44,11 +44,11 @@ local function add_lsp_buffer_keybindings(bufnr)
["gd"] = { "<cmd>lua vim.lsp.buf.definition()<CR>", "Goto Definition" },
["gD"] = { "<cmd>lua vim.lsp.buf.declaration()<CR>", "Goto declaration" },
["gr"] = { "<cmd>lua vim.lsp.buf.references()<CR>", "Goto references" },
- ["gi"] = { "<cmd>lua vim.lsp.buf.implementation()<CR>", "Goto implementation" },
+ ["gI"] = { "<cmd>lua vim.lsp.buf.implementation()<CR>", "Goto Implementation" },
["gs"] = { "<cmd>lua vim.lsp.buf.signature_help()<CR>", "show signature help" },
["gp"] = { "<cmd>lua require'lsp.peek'.Peek('definition')<CR>", "Peek definition" },
["gl"] = {
- "<cmd>lua vim.lsp.diagnostic.show_line_diagnostics({ show_header = false, border = 'single' })<CR>",
+ "<cmd>lua require'lsp.handlers'.show_line_diagnostics()<CR>",
"Show line diagnostics",
},
}
@@ -99,14 +99,14 @@ end
function M.common_on_init(client, bufnr)
if options.lsp.on_init_callback then
options.lsp.on_init_callback(client, bufnr)
- Log:get_default().info "Called lsp.on_init_callback"
+ Log:debug "Called lsp.on_init_callback"
return
end
local formatters = options.lang[vim.bo.filetype].formatters
if not vim.tbl_isempty(formatters) and formatters[1]["exe"] ~= nil and formatters[1].exe ~= "" then
client.resolved_capabilities.document_formatting = false
- Log:get_default().info(
+ Log:debug(
string.format("Overriding language server [%s] with format provider [%s]", client.name, formatters[1].exe)
)
end
@@ -115,7 +115,7 @@ end
function M.common_on_attach(client, bufnr)
if options.lsp.on_attach_callback then
options.lsp.on_attach_callback(client, bufnr)
- Log:get_default().info "Called lsp.on_init_callback"
+ Log:debug "Called lsp.on_init_callback"
end
lsp_highlight_document(client)
add_lsp_buffer_keybindings(bufnr)
@@ -125,7 +125,7 @@ end
function M.setup(lang)
local lsp_utils = require "lsp.utils"
local lsp = options.lang[lang].lsp
- if lsp_utils.is_client_active(lsp.provider) then
+ if (lsp.active ~= nil and not lsp.active) or lsp_utils.is_client_active(lsp.provider) then
return
end
diff --git a/.config/nvim/lua/lsp/null-ls/formatters.lua b/.config/nvim/lua/lsp/null-ls/formatters.lua
index cf62615..651d6f1 100644
--- a/.config/nvim/lua/lsp/null-ls/formatters.lua
+++ b/.config/nvim/lua/lsp/null-ls/formatters.lua
@@ -3,7 +3,7 @@ local formatters_by_ft = {}
local null_ls = require "null-ls"
local services = require "lsp.null-ls.services"
-local logger = require("core.log"):get_default()
+local Log = require("core.log")
local function list_names(formatters, option)
option = option or {}
@@ -45,15 +45,15 @@ function M.list_configured(formatter_configs)
local formatter = null_ls.builtins.formatting[fmt_config.exe]
if not formatter then
- logger.error("Not a valid formatter:", fmt_config.exe)
+ Log:error("Not a valid formatter:" .. fmt_config.exe)
errors[fmt_config.exe] = {} -- Add data here when necessary
else
local formatter_cmd = services.find_command(formatter._opts.command)
if not formatter_cmd then
- logger.warn("Not found:", formatter._opts.command)
+ Log:warn("Not found:" .. formatter._opts.command)
errors[fmt_config.exe] = {} -- Add data here when necessary
else
- logger.info("Using formatter:", formatter_cmd)
+ Log:debug("Using formatter:" .. formatter_cmd)
formatters[fmt_config.exe] = formatter.with {
command = formatter_cmd,
extra_args = fmt_config.args,
diff --git a/.config/nvim/lua/lsp/null-ls/init.lua b/.config/nvim/lua/lsp/null-ls/init.lua
index f2b1042..d12b40a 100644
--- a/.config/nvim/lua/lsp/null-ls/init.lua
+++ b/.config/nvim/lua/lsp/null-ls/init.lua
@@ -30,7 +30,7 @@ function M.setup(filetype, option)
local ok, _ = pcall(require, "null-ls")
if not ok then
- require("core.log"):get_default().error "Missing null-ls dependency"
+ require("core.log"):error "Missing null-ls dependency"
return
end
diff --git a/.config/nvim/lua/lsp/null-ls/linters.lua b/.config/nvim/lua/lsp/null-ls/linters.lua
index a4eaa89..0f6cbc1 100644
--- a/.config/nvim/lua/lsp/null-ls/linters.lua
+++ b/.config/nvim/lua/lsp/null-ls/linters.lua
@@ -3,7 +3,7 @@ local linters_by_ft = {}
local null_ls = require "null-ls"
local services = require "lsp.null-ls.services"
-local logger = require("core.log"):get_default()
+local Log = require("core.log")
local function list_names(linters, option)
option = option or {}
@@ -45,15 +45,15 @@ function M.list_configured(linter_configs)
local linter = null_ls.builtins.diagnostics[lnt_config.exe]
if not linter then
- logger.error("Not a valid linter:", lnt_config.exe)
+ Log:error("Not a valid linter: " .. lnt_config.exe)
errors[lnt_config.exe] = {} -- Add data here when necessary
else
local linter_cmd = services.find_command(linter._opts.command)
if not linter_cmd then
- logger.warn("Not found:", linter._opts.command)
+ Log:warn("Not found: " .. linter._opts.command)
errors[lnt_config.exe] = {} -- Add data here when necessary
else
- logger.info("Using linter:", linter_cmd)
+ Log:debug("Using linter: " .. linter_cmd)
linters[lnt_config.exe] = linter.with {
command = linter_cmd,
extra_args = lnt_config.args,
diff --git a/.config/nvim/lua/lsp/peek.lua b/.config/nvim/lua/lsp/peek.lua
index e4f4e1e..dbc6741 100644
--- a/.config/nvim/lua/lsp/peek.lua
+++ b/.config/nvim/lua/lsp/peek.lua
@@ -12,8 +12,7 @@ local function create_floating_file(location, opts)
-- Set some defaults
opts = opts or {}
- local close_events = opts.close_events
- or { "CursorMoved", "CursorMovedI", "BufHidden", "InsertCharPre" }
+ local close_events = opts.close_events or { "CursorMoved", "CursorMovedI", "BufHidden", "InsertCharPre" }
-- location may be LocationLink or Location
local uri = location.targetUri or location.uri
@@ -30,10 +29,7 @@ local function create_floating_file(location, opts)
local contents = vim.api.nvim_buf_get_lines(
bufnr,
range.start.line,
- math.min(
- range["end"].line + 1 + (opts.context or 10),
- range.start.line + (opts.max_height or 15)
- ), -- Don't let the window be more that 15 lines long(height)
+ math.min(range["end"].line + 1 + (opts.context or 10), range.start.line + (opts.max_height or 15)), -- Don't let the window be more that 15 lines long(height)
false
)
local width, height = vim.lsp.util._make_floating_popup_size(contents, opts)
@@ -46,13 +42,12 @@ local function create_floating_file(location, opts)
local winnr = vim.api.nvim_open_win(bufnr, false, opts)
vim.api.nvim_win_set_option(winnr, "winblend", 0)
+ vim.api.nvim_win_set_cursor(winnr, { range.start.line + 1, range.start.character })
vim.api.nvim_buf_set_var(bufnr, "lsp_floating_window", winnr)
-- Set some autocmds to close the window
vim.api.nvim_command(
- "autocmd QuitPre <buffer> ++nested ++once lua pcall(vim.api.nvim_win_close, "
- .. winnr
- .. ", true)"
+ "autocmd QuitPre <buffer> ++nested ++once lua pcall(vim.api.nvim_win_close, " .. winnr .. ", true)"
)
vim.lsp.util.close_preview_autocmd(close_events, winnr)
@@ -134,18 +129,10 @@ function M.Peek(what)
else
-- Make a new request and then create the new window in the callback
local params = vim.lsp.util.make_position_params()
- local success, _ = pcall(
- vim.lsp.buf_request,
- 0,
- "textDocument/" .. what,
- params,
- preview_location_callback
- )
+ local success, _ = pcall(vim.lsp.buf_request, 0, "textDocument/" .. what, params, preview_location_callback)
if not success then
print(
- 'peek: Error calling LSP method "textDocument/'
- .. what
- .. '". The current language lsp might not support it.'
+ 'peek: Error calling LSP method "textDocument/' .. what .. '". The current language lsp might not support it.'
)
end
end