vim.cmd [[ sign define LspDiagnosticsSignError text= texthl= linehl= numhl=LspDiagnosticsLineNrError sign define LspDiagnosticsSignWarning text= texthl= linehl= numhl=LspDiagnosticsLineNrWarning sign define LspDiagnosticsSignInfo text= texthl= linehl= numhl=LspDiagnosticsLineNrInformation sign define LspDiagnosticsSignHint text= texthl= linehl= numhl=LspDiagnosticsLineNrHint ]] -- -- lspconfig local nvim_lsp = require('lspconfig') -- Use a loop to conveniently call 'setup' on multiple servers and -- map buffer local keybindings when the language server attaches local servers = { -- npm i -g bash-language-server -- no formatting support 'bashls', -- npm i -g vscode-langservers-extracted -- no formatting support 'cssls', -- npm install -g intelephense -- suports formatting 'intelephense', -- https://phpactor.readthedocs.io/en/master/usage/standalone.html 'phpactor', -- npm install -g pyright -- static type checker 'pyright', -- https://github.com/neovim/nvim-lspconfig/wiki -- 'tailwindcss', -- npm install -g typescript typescript-language-server -- supports formatting 'tsserver', -- npm install -g vim-language-server -- no formatting support 'vimls', -- vue -- use vetur 'yamlls', -- no formatting support } -- Use an on_attach function to only map the following keys -- after the language server attaches to the current buffer local on_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 -- Enable completion triggered by buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') -- Mappings. local opts = { noremap=true, silent=true } -- See `:help vim.lsp.*` for documentation on any of the below functions buf_set_keymap('n', '[d', 'lua vim.diagnostic.goto_prev({float = {...}})', opts) buf_set_keymap('n', ']d', 'lua vim.diagnostic.goto_next({float = {...}})', opts) buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) buf_set_keymap('n', 'gl', 'lua vim.diagnostic.open_float(buffer, {{opts}, scope="line"})', opts) buf_set_keymap('n', 'gh', 'lua vim.lsp.buf.hover()', opts) buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) buf_set_keymap('n', 'T', 'lua vim.lsp.buf.type_definition()', opts) buf_set_keymap('n', 'l', 'lua vim.diagnostic.setloclist()', opts) buf_set_keymap('n', 'q', 'lua vim.diagnostic.setqflist()', opts) buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) -- buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) -- buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) -- buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) if client.name == 'tsserver' or client.name == 'intelephense' then client.resolved_capabilities.document_formatting = false; end if client.resolved_capabilities.document_formatting then vim.cmd [[augroup lsp_formatting]] vim.cmd [[autocmd!]] vim.cmd [[autocmd BufWritePre :lua vim.lsp.buf.formatting_seq_sync({}, 3000)]] vim.cmd [[augroup END]] end if client.resolved_capabilities.document_highlight then vim.cmd [[ augroup lsp_document_highlight autocmd! * autocmd CursorHold lua vim.lsp.buf.document_highlight() autocmd CursorMoved lua vim.lsp.buf.clear_references() augroup END ]] end end local capabilities = vim.lsp.protocol.make_client_capabilities() capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) capabilities.textDocument.completion.completionItem.snippetSupport = true for _, lsp in ipairs(servers) do nvim_lsp[lsp].setup { on_attach = on_attach, capabilities = capabilities, flags = { debounce_text_changes = 150, } } end 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 { 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, }, }, }, } -- null-ls local null_ls = require("null-ls") local sources = { null_ls.builtins.formatting.prettierd, -- phpcs - standards wordpress null_ls.builtins.diagnostics.phpcs.with({ condition = function(utils) return utils.root_has_file({ "vendor/bin/phpcs" }) end, command = "vendor/bin/phpcs", args = { "--standard=WordPress", "--report=json", "-s", "-" }, }), -- phpcbf - standards wordpress null_ls.builtins.formatting.phpcbf.with({ condition = function(utils) return utils.root_has_file({ "vendor/bin/phpcbf" }) end, command = "vendor/bin/phpcbf", args = { "--standard=WordPress", "-" }, }), -- phpcs null_ls.builtins.diagnostics.phpcs.with({ condition = function(utils) return not utils.root_has_file({ "vendor/bin/phpcs" }) end, args = { "--standard=PSR12", "--report=json", "-s", "-" }, }), -- phpcbf null_ls.builtins.formatting.phpcbf.with({ condition = function(utils) return not utils.root_has_file({ "vendor/bin/phpcbf" }) end, args = { "--standard=PSR12", "--report=json", "-s", "-" }, }), -- black null_ls.builtins.formatting.black, -- shellcheck, null_ls.builtins.diagnostics.shellcheck, -- flake8 null_ls.builtins.diagnostics.flake8, -- luaFormatter null_ls.builtins.formatting.lua_format, } null_ls.setup({ sources = sources, on_attach = on_attach, })