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 -- is now automatically started/configured by rust-tools -- sudo pacman -Syu rust-analyzer -- 'rust_analyzer' } -- 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 == 'phpactor' then client.resolved_capabilities.find_references = false; end if client.name == 'tsserver' or client.name == 'intelephense' then client.resolved_capabilities.document_formatting = false; print(vim.inspect(client.resolved_capabilities)); 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} } } } -- toml -- 'taplo' -- -- sudo pacman -Syu taplo-cli require'lspconfig'.taplo.setup { on_attach = on_attach, capabilities = capabilities, flags = {debounce_text_changes = 150}, cmd = {"taplo", "lsp", "stdio"} } -- rust-tools -- evaluating require('rust-tools').setup({ server = { on_attach = on_attach, capabilities = capabilities, flags = {debounce_text_changes = 150}, settings = {["rust-analyzer"] = {checkOnSave = {command = "clippy"}}} } }) -- set inlay hints require('rust-tools.inlay_hints').set_inlay_hints() -- disable inlay hints require('rust-tools.inlay_hints').disable_inlay_hints() -- toggle inlay hints require('rust-tools.inlay_hints').toggle_inlay_hints() ------ -- null-ls local null_ls = require("null-ls") local sources = { null_ls.builtins.formatting.prettierd, -- -- phpcs - standards wordpress -- in project directory must -- composer require friendsofphp/php-cs-fixer -- as in https://github.com/FriendsOfPHP/PHP-CS-Fixer -- I think so anyway - not totally sure any more 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", "-"} -- }), null_ls.builtins.formatting.black, -- black null_ls.builtins.diagnostics.shellcheck, -- shellcheck, null_ls.builtins.diagnostics.flake8, -- flake8 null_ls.builtins.formatting.lua_format -- luaFormatter } null_ls.setup({sources = sources, on_attach = on_attach})