mirror of
https://github.com/jdhao/nvim-config.git
synced 2025-06-08 14:14:33 +02:00
In lua, 0 and empty string is true, which is counter-intuitive and different from vim script. So we need to use proper boolean type for vim script global variables, instead of numbers.
200 lines
6.8 KiB
Lua
200 lines
6.8 KiB
Lua
local M = {}
|
|
|
|
function M.show_line_diagnostics()
|
|
local opts = {
|
|
focusable = false,
|
|
close_events = {'BufLeave', 'CursorMoved', 'InsertEnter', 'FocusLost'}
|
|
}
|
|
vim.lsp.diagnostic.show_line_diagnostics(opts)
|
|
end
|
|
|
|
local custom_attach = function(client, bufnr)
|
|
local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end
|
|
local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end
|
|
|
|
buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc')
|
|
|
|
-- Mappings.
|
|
local opts = { noremap=true, silent=true }
|
|
buf_set_keymap('n', 'gD', '<Cmd>lua vim.lsp.buf.declaration()<CR>', opts)
|
|
buf_set_keymap('n', 'gd', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts)
|
|
buf_set_keymap('n', '<C-]>', '<Cmd>lua vim.lsp.buf.definition()<CR>', opts)
|
|
buf_set_keymap('n', 'K', '<Cmd>lua vim.lsp.buf.hover()<CR>', opts)
|
|
buf_set_keymap('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>', opts)
|
|
buf_set_keymap('n', '<C-k>', '<cmd>lua vim.lsp.buf.signature_help()<CR>', opts)
|
|
buf_set_keymap('n', '<space>wa', '<cmd>lua vim.lsp.buf.add_workspace_folder()<CR>', opts)
|
|
buf_set_keymap('n', '<space>wr', '<cmd>lua vim.lsp.buf.remove_workspace_folder()<CR>', opts)
|
|
buf_set_keymap('n', '<space>wl', '<cmd>lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))<CR>', opts)
|
|
buf_set_keymap('n', '<space>D', '<cmd>lua vim.lsp.buf.type_definition()<CR>', opts)
|
|
buf_set_keymap('n', '<space>rn', '<cmd>lua vim.lsp.buf.rename()<CR>', opts)
|
|
buf_set_keymap('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>', opts)
|
|
buf_set_keymap('n', '[d', '<cmd>lua vim.lsp.diagnostic.goto_prev()<CR>', opts)
|
|
buf_set_keymap('n', ']d', '<cmd>lua vim.lsp.diagnostic.goto_next()<CR>', opts)
|
|
buf_set_keymap('n', '<space>q', '<cmd>lua vim.lsp.diagnostic.set_loclist()<CR>', opts)
|
|
buf_set_keymap('n', '<space>ca', '<cmd>lua vim.lsp.buf.code_action()<CR>', opts)
|
|
|
|
vim.cmd [[
|
|
autocmd CursorHold <buffer> lua require('config.lsp').show_line_diagnostics()
|
|
]]
|
|
|
|
-- Set some key bindings conditional on server capabilities
|
|
if client.resolved_capabilities.document_formatting then
|
|
buf_set_keymap("n", "<space>f", "<cmd>lua vim.lsp.buf.formatting()<CR>", opts)
|
|
end
|
|
if client.resolved_capabilities.document_range_formatting then
|
|
buf_set_keymap("x", "<space>f", "<cmd>lua vim.lsp.buf.range_formatting()<CR><ESC>", opts)
|
|
end
|
|
|
|
-- The blow command will highlight the current variable and its usages in the buffer.
|
|
if client.resolved_capabilities.document_highlight then
|
|
vim.cmd([[
|
|
hi link LspReferenceRead Visual
|
|
hi link LspReferenceText Visual
|
|
hi link LspReferenceWrite Visual
|
|
augroup lsp_document_highlight
|
|
autocmd! * <buffer>
|
|
autocmd CursorHold <buffer> lua vim.lsp.buf.document_highlight()
|
|
autocmd CursorMoved <buffer> lua vim.lsp.buf.clear_references()
|
|
augroup END
|
|
]])
|
|
end
|
|
|
|
local msg = string.format('Language server %s started!' , client.name)
|
|
vim.api.nvim_echo({{msg, 'MoreMsg'}, }, false, {})
|
|
end
|
|
|
|
local capabilities = vim.lsp.protocol.make_client_capabilities()
|
|
capabilities.textDocument.completion.completionItem.snippetSupport = true
|
|
|
|
local lspconfig = require("lspconfig")
|
|
|
|
lspconfig.pylsp.setup{
|
|
on_attach = custom_attach,
|
|
settings = {
|
|
pylsp = {
|
|
plugins = {
|
|
pylint = {enabled = true, executable = "pylint"},
|
|
pyflakes = {enabled = false},
|
|
pycodestyle = {enabled = false},
|
|
jedi_completion = {fuzzy = true},
|
|
pyls_isort = {enabled = true},
|
|
pylsp_mypy = {enabled = true}
|
|
}
|
|
}
|
|
},
|
|
flags = {
|
|
debounce_text_changes = 200,
|
|
}
|
|
}
|
|
|
|
-- lspconfig.pyright.setup{
|
|
-- on_attach = custom_attach,
|
|
-- }
|
|
|
|
lspconfig.clangd.setup{
|
|
on_attach = custom_attach,
|
|
capabilities = capabilities,
|
|
filetypes = { "c", "cpp", "cc" },
|
|
flags = {
|
|
debounce_text_changes = 500,
|
|
}
|
|
}
|
|
|
|
-- set up vim-language-server
|
|
lspconfig.vimls.setup{
|
|
on_attach = custom_attach,
|
|
flags = {
|
|
debounce_text_changes = 500,
|
|
}
|
|
}
|
|
|
|
local sumneko_binary_path = vim.fn.exepath('lua-language-server')
|
|
if vim.g.is_mac or vim.g.is_linux and sumneko_binary_path ~= '' then
|
|
local sumneko_root_path = vim.fn.fnamemodify(sumneko_binary_path, ':h:h:h')
|
|
|
|
local runtime_path = vim.split(package.path, ';')
|
|
table.insert(runtime_path, "lua/?.lua")
|
|
table.insert(runtime_path, "lua/?/init.lua")
|
|
|
|
require'lspconfig'.sumneko_lua.setup {
|
|
on_attach = custom_attach,
|
|
cmd = {sumneko_binary_path, "-E", sumneko_root_path .. "/main.lua"};
|
|
settings = {
|
|
Lua = {
|
|
runtime = {
|
|
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
|
|
version = 'LuaJIT',
|
|
-- Setup your lua path
|
|
path = runtime_path,
|
|
},
|
|
diagnostics = {
|
|
-- Get the language server to recognize the `vim` global
|
|
globals = {'vim'},
|
|
},
|
|
workspace = {
|
|
-- Make the server aware of Neovim runtime files
|
|
library = vim.api.nvim_get_runtime_file("", true),
|
|
},
|
|
-- Do not send telemetry data containing a randomized but unique identifier
|
|
telemetry = {
|
|
enable = false,
|
|
},
|
|
},
|
|
},
|
|
}
|
|
end
|
|
|
|
-- Change diagnostic signs.
|
|
vim.fn.sign_define('LspDiagnosticsSignError', { text = "✗", texthl = "LspDiagnosticsDefaultError" })
|
|
vim.fn.sign_define('LspDiagnosticsSignWarning', { text = "!", texthl = "LspDiagnosticsDefaultWarning" })
|
|
vim.fn.sign_define('LspDiagnosticsSignInformation', { text = "", texthl = "LspDiagnosticsDefaultInformation" })
|
|
vim.fn.sign_define('LspDiagnosticsSignHint', { text = "", texthl = "LspDiagnosticsDefaultHint" })
|
|
|
|
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(
|
|
vim.lsp.diagnostic.on_publish_diagnostics, {
|
|
underline = false,
|
|
virtual_text = false,
|
|
signs = true,
|
|
update_in_insert = false,
|
|
}
|
|
)
|
|
|
|
-- Refs: https://github.com/neovim/nvim-lspconfig/wiki/UI-customization#show-source-in-diagnostics
|
|
vim.lsp.handlers["textDocument/publishDiagnostics"] =
|
|
function(_, _, params, client_id, _)
|
|
local uri = params.uri
|
|
local bufnr = vim.uri_to_bufnr(uri)
|
|
|
|
if not bufnr then
|
|
return
|
|
end
|
|
|
|
if not vim.api.nvim_buf_is_loaded(bufnr) then
|
|
return
|
|
end
|
|
|
|
local diagnostics = params.diagnostics
|
|
for i, v in ipairs(diagnostics) do
|
|
diagnostics[i].message = string.format("%s: %s", v.source, v.message)
|
|
end
|
|
vim.lsp.diagnostic.save(diagnostics, bufnr, client_id)
|
|
|
|
local config = {
|
|
underline = false,
|
|
virtual_text = false,
|
|
signs = true,
|
|
update_in_insert = false,
|
|
}
|
|
vim.lsp.diagnostic.display(diagnostics, bufnr, client_id, config)
|
|
end
|
|
|
|
-- The following settings works with the bleeding edge neovim.
|
|
-- See https://github.com/neovim/neovim/pull/13998.
|
|
vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(
|
|
vim.lsp.handlers.hover, {
|
|
border = 'rounded'
|
|
}
|
|
)
|
|
|
|
return M
|