summaryrefslogtreecommitdiffstats
path: root/lua/user/lsp
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2022-03-07 14:43:57 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2022-03-07 14:43:57 +0100
commit596823bc99e656d3913ad7fe7f6c0f27a30c0110 (patch)
tree9ddf40caf018cc630d445db327d7b8d52994f921 /lua/user/lsp
parentcbcab8684e06379c9f5c51cfc9cac68d8684fe0c (diff)
downloadvim-596823bc99e656d3913ad7fe7f6c0f27a30c0110.zip
vim-596823bc99e656d3913ad7fe7f6c0f27a30c0110.tar.gz
switch to neovim + lua
Diffstat (limited to 'lua/user/lsp')
-rw-r--r--lua/user/lsp/handlers.lua97
-rw-r--r--lua/user/lsp/init.lua13
-rw-r--r--lua/user/lsp/lsp-installer.lua28
-rw-r--r--lua/user/lsp/null-ls.lua19
-rw-r--r--lua/user/lsp/settings/jsonls.lua197
-rw-r--r--lua/user/lsp/settings/sumneko_lua.lua16
6 files changed, 370 insertions, 0 deletions
diff --git a/lua/user/lsp/handlers.lua b/lua/user/lsp/handlers.lua
new file mode 100644
index 0000000..b7b1a92
--- /dev/null
+++ b/lua/user/lsp/handlers.lua
@@ -0,0 +1,97 @@
+local M = {}
+
+-- TODO: backfill this to template
+M.setup = function()
+ local signs = {
+ { name = "DiagnosticSignError", text = "" },
+ { name = "DiagnosticSignWarn", text = "" },
+ { name = "DiagnosticSignHint", text = "" },
+ { name = "DiagnosticSignInfo", text = "" },
+ }
+
+ for _, sign in ipairs(signs) do
+ vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" })
+ end
+
+ local config = {
+ -- disable virtual text
+ virtual_text = false,
+ -- show signs
+ signs = {
+ active = signs,
+ },
+ update_in_insert = true,
+ underline = true,
+ severity_sort = true,
+ float = {
+ focusable = false,
+ style = "minimal",
+ border = "rounded",
+ source = "always",
+ header = "",
+ prefix = "",
+ },
+ }
+
+ vim.diagnostic.config(config)
+
+ vim.lsp.handlers["textDocument/hover"] = vim.lsp.with(vim.lsp.handlers.hover, {
+ border = "rounded",
+ })
+
+ vim.lsp.handlers["textDocument/signatureHelp"] = vim.lsp.with(vim.lsp.handlers.signature_help, {
+ border = "rounded",
+ })
+end
+
+local function lsp_highlight_document(client)
+ -- Set autocommands conditional on server_capabilities
+ if client.resolved_capabilities.document_highlight then
+ vim.api.nvim_exec(
+ [[
+ 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
+ ]],
+ false
+ )
+ end
+end
+
+local function lsp_keymaps(bufnr)
+ local opts = { noremap = true, silent = true }
+ -- SEE : https://neovim.io/doc/user/lsp.html
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "<cmd>lua vim.lsp.buf.definition()<CR>", opts)
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", opts)
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "ga", "<cmd>lua vim.lsp.buf.declaration()<CR>", opts)
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", opts)
+
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "gb", "<cmd>lua vim.lsp.buf.hover()<CR>", opts)
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "gé", "<cmd>lua vim.lsp.buf.signature_help()<CR>", opts)
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "gk", '<cmd>lua vim.diagnostic.open_float({ border = "rounded" })<CR>', opts)
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "g.", '<cmd>lua vim.diagnostic.goto_next({ border = "rounded" })<CR>', opts)
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "gx", '<cmd>lua vim.diagnostic.goto_prev({ border = "rounded" })<CR>', opts)
+ vim.api.nvim_buf_set_keymap(bufnr, "n", "<leader>q", "<cmd>lua vim.diagnostic.setloclist()<CR>", opts)
+ vim.cmd [[ command! Format execute 'lua vim.lsp.buf.formatting()' ]] -- FIXME what ?
+end
+
+M.on_attach = function(client, bufnr)
+ if client.name == "tsserver" then
+ client.resolved_capabilities.document_formatting = false
+ end
+ lsp_keymaps(bufnr)
+ lsp_highlight_document(client)
+end
+
+local capabilities = vim.lsp.protocol.make_client_capabilities()
+
+local status_ok, cmp_nvim_lsp = pcall(require, "cmp_nvim_lsp")
+if not status_ok then
+ return
+end
+
+M.capabilities = cmp_nvim_lsp.update_capabilities(capabilities)
+
+return M
diff --git a/lua/user/lsp/init.lua b/lua/user/lsp/init.lua
new file mode 100644
index 0000000..add8bf8
--- /dev/null
+++ b/lua/user/lsp/init.lua
@@ -0,0 +1,13 @@
+local status_ok, lspconfig = pcall(require, "lspconfig")
+if not status_ok then
+ return
+end
+
+require "user.lsp.lsp-installer"
+require("user.lsp.handlers").setup()
+require "user.lsp.null-ls"
+
+lspconfig.gdscript.setup{
+ on_attach = require("user.lsp.handlers").on_attach,
+ capabilities = require("user.lsp.handlers").capabilities,
+}
diff --git a/lua/user/lsp/lsp-installer.lua b/lua/user/lsp/lsp-installer.lua
new file mode 100644
index 0000000..7675878
--- /dev/null
+++ b/lua/user/lsp/lsp-installer.lua
@@ -0,0 +1,28 @@
+local status_ok, lsp_installer = pcall(require, "nvim-lsp-installer")
+if not status_ok then
+ return
+end
+
+-- Register a handler that will be called for all installed servers.
+-- Alternatively, you may also register handlers on specific server instances instead (see example below).
+-- SEE : https://github.com/williamboman/nvim-lsp-installer#setup
+lsp_installer.on_server_ready(function(server)
+ local opts = {
+ on_attach = require("user.lsp.handlers").on_attach,
+ capabilities = require("user.lsp.handlers").capabilities,
+ }
+
+ if server.name == "jsonls" then
+ local jsonls_opts = require("user.lsp.settings.jsonls")
+ opts = vim.tbl_deep_extend("force", jsonls_opts, opts)
+ end
+
+ if server.name == "sumneko_lua" then
+ local sumneko_opts = require("user.lsp.settings.sumneko_lua")
+ opts = vim.tbl_deep_extend("force", sumneko_opts, opts)
+ end
+
+ -- This setup() function is exactly the same as lspconfig's setup function.
+ -- Refer to https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md
+ server:setup(opts)
+end)
diff --git a/lua/user/lsp/null-ls.lua b/lua/user/lsp/null-ls.lua
new file mode 100644
index 0000000..15720d1
--- /dev/null
+++ b/lua/user/lsp/null-ls.lua
@@ -0,0 +1,19 @@
+local null_ls_status_ok, null_ls = pcall(require, "null-ls")
+if not null_ls_status_ok then
+ return
+end
+
+-- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/formatting
+local formatting = null_ls.builtins.formatting
+-- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics
+local diagnostics = null_ls.builtins.diagnostics
+
+null_ls.setup({
+ debug = false,
+ sources = {
+ formatting.prettier.with({ extra_args = { "--no-semi", "--single-quote", "--jsx-single-quote" } }),
+ formatting.black.with({ extra_args = { "--fast" } }),
+ formatting.stylua,
+ -- diagnostics.flake8
+ },
+})
diff --git a/lua/user/lsp/settings/jsonls.lua b/lua/user/lsp/settings/jsonls.lua
new file mode 100644
index 0000000..1fffa68
--- /dev/null
+++ b/lua/user/lsp/settings/jsonls.lua
@@ -0,0 +1,197 @@
+local default_schemas = nil
+local status_ok, jsonls_settings = pcall(require, "nlspsettings.jsonls")
+if status_ok then
+ default_schemas = jsonls_settings.get_default_schemas()
+end
+
+local schemas = {
+ {
+ description = "TypeScript compiler configuration file",
+ fileMatch = {
+ "tsconfig.json",
+ "tsconfig.*.json",
+ },
+ url = "https://json.schemastore.org/tsconfig.json",
+ },
+ {
+ description = "Lerna config",
+ fileMatch = { "lerna.json" },
+ url = "https://json.schemastore.org/lerna.json",
+ },
+ {
+ description = "Babel configuration",
+ fileMatch = {
+ ".babelrc.json",
+ ".babelrc",
+ "babel.config.json",
+ },
+ url = "https://json.schemastore.org/babelrc.json",
+ },
+ {
+ description = "ESLint config",
+ fileMatch = {
+ ".eslintrc.json",
+ ".eslintrc",
+ },
+ url = "https://json.schemastore.org/eslintrc.json",
+ },
+ {
+ description = "Bucklescript config",
+ fileMatch = { "bsconfig.json" },
+ url = "https://raw.githubusercontent.com/rescript-lang/rescript-compiler/8.2.0/docs/docson/build-schema.json",
+ },
+ {
+ description = "Prettier config",
+ fileMatch = {
+ ".prettierrc",
+ ".prettierrc.json",
+ "prettier.config.json",
+ },
+ url = "https://json.schemastore.org/prettierrc",
+ },
+ {
+ description = "Vercel Now config",
+ fileMatch = { "now.json" },
+ url = "https://json.schemastore.org/now",
+ },
+ {
+ description = "Stylelint config",
+ fileMatch = {
+ ".stylelintrc",
+ ".stylelintrc.json",
+ "stylelint.config.json",
+ },
+ url = "https://json.schemastore.org/stylelintrc",
+ },
+ {
+ description = "A JSON schema for the ASP.NET LaunchSettings.json files",
+ fileMatch = { "launchsettings.json" },
+ url = "https://json.schemastore.org/launchsettings.json",
+ },
+ {
+ description = "Schema for CMake Presets",
+ fileMatch = {
+ "CMakePresets.json",
+ "CMakeUserPresets.json",
+ },
+ url = "https://raw.githubusercontent.com/Kitware/CMake/master/Help/manual/presets/schema.json",
+ },
+ {
+ description = "Configuration file as an alternative for configuring your repository in the settings page.",
+ fileMatch = {
+ ".codeclimate.json",
+ },
+ url = "https://json.schemastore.org/codeclimate.json",
+ },
+ {
+ description = "LLVM compilation database",
+ fileMatch = {
+ "compile_commands.json",
+ },
+ url = "https://json.schemastore.org/compile-commands.json",
+ },
+ {
+ description = "Config file for Command Task Runner",
+ fileMatch = {
+ "commands.json",
+ },
+ url = "https://json.schemastore.org/commands.json",
+ },
+ {
+ description = "AWS CloudFormation provides a common language for you to describe and provision all the infrastructure resources in your cloud environment.",
+ fileMatch = {
+ "*.cf.json",
+ "cloudformation.json",
+ },
+ url = "https://raw.githubusercontent.com/awslabs/goformation/v5.2.9/schema/cloudformation.schema.json",
+ },
+ {
+ description = "The AWS Serverless Application Model (AWS SAM, previously known as Project Flourish) extends AWS CloudFormation to provide a simplified way of defining the Amazon API Gateway APIs, AWS Lambda functions, and Amazon DynamoDB tables needed by your serverless application.",
+ fileMatch = {
+ "serverless.template",
+ "*.sam.json",
+ "sam.json",
+ },
+ url = "https://raw.githubusercontent.com/awslabs/goformation/v5.2.9/schema/sam.schema.json",
+ },
+ {
+ description = "Json schema for properties json file for a GitHub Workflow template",
+ fileMatch = {
+ ".github/workflow-templates/**.properties.json",
+ },
+ url = "https://json.schemastore.org/github-workflow-template-properties.json",
+ },
+ {
+ description = "golangci-lint configuration file",
+ fileMatch = {
+ ".golangci.toml",
+ ".golangci.json",
+ },
+ url = "https://json.schemastore.org/golangci-lint.json",
+ },
+ {
+ description = "JSON schema for the JSON Feed format",
+ fileMatch = {
+ "feed.json",
+ },
+ url = "https://json.schemastore.org/feed.json",
+ versions = {
+ ["1"] = "https://json.schemastore.org/feed-1.json",
+ ["1.1"] = "https://json.schemastore.org/feed.json",
+ },
+ },
+ {
+ description = "Packer template JSON configuration",
+ fileMatch = {
+ "packer.json",
+ },
+ url = "https://json.schemastore.org/packer.json",
+ },
+ {
+ description = "NPM configuration file",
+ fileMatch = {
+ "package.json",
+ },
+ url = "https://json.schemastore.org/package.json",
+ },
+ {
+ description = "JSON schema for Visual Studio component configuration files",
+ fileMatch = {
+ "*.vsconfig",
+ },
+ url = "https://json.schemastore.org/vsconfig.json",
+ },
+ {
+ description = "Resume json",
+ fileMatch = { "resume.json" },
+ url = "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json",
+ },
+}
+
+local function extend(tab1, tab2)
+ for _, value in ipairs(tab2) do
+ table.insert(tab1, value)
+ end
+ return tab1
+end
+
+local extended_schemas = extend(schemas, default_schemas)
+
+local opts = {
+ settings = {
+ json = {
+ schemas = extended_schemas,
+ },
+ },
+ setup = {
+ commands = {
+ Format = {
+ function()
+ vim.lsp.buf.range_formatting({}, { 0, 0 }, { vim.fn.line "$", 0 })
+ end,
+ },
+ },
+ },
+}
+
+return opts
diff --git a/lua/user/lsp/settings/sumneko_lua.lua b/lua/user/lsp/settings/sumneko_lua.lua
new file mode 100644
index 0000000..d7e82b4
--- /dev/null
+++ b/lua/user/lsp/settings/sumneko_lua.lua
@@ -0,0 +1,16 @@
+return {
+ settings = {
+
+ Lua = {
+ diagnostics = {
+ globals = { "vim" }, -- teach about vim global variable
+ },
+ workspace = {
+ library = {
+ [vim.fn.expand("$VIMRUNTIME/lua")] = true,
+ [vim.fn.stdpath("config") .. "/lua"] = true,
+ },
+ },
+ },
+ },
+}