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 = { -- astro -- npm install -g @astrojs/language-server 'astro', -- 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 -- nvim-ufo capabilities.textDocument.foldingRange = { dynamicRegistration = false, lineFoldingOnly = true } for _, lsp in ipairs(servers) do nvim_lsp[lsp].setup { on_attach = on_attach, capabilities = capabilities, flags = {debounce_text_changes = 150} } end -- nvim-ufo require('ufo').setup() vim.keymap.set('n', 'gH', function() local winid = require('ufo').peekFoldedLinesUnderCursor() 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 require('rust-tools').setup({ server = { on_attach = on_attach, capabilities = capabilities, flags = {debounce_text_changes = 150}, settings = {["rust-analyzer"] = {checkOnSave = {command = "clippy"}}} } }) -- inlay hints require('rust-tools').inlay_hints.enable() ------ -- null-ls local null_ls = require("null-ls") local null_ls_utils = require("null-ls.utils") local root = null_ls_utils.get_root() local eslint_command = root .. "/node_modules/eslint/bin/eslint.js" -- print(eslint_command); local sources = { null_ls.builtins.formatting.prettierd, null_ls.builtins.diagnostics.eslint.with({ condition = function(utils) local has_file = utils.root_has_file({ "node_modules/@wordpress/scripts/config/.eslintrc.js" }) -- print("condition") -- print(has_file) return has_file end, extra_args = { "--no-eslintrc", "--config ", root .. "/node_modules/@wordpress/scripts/config/.eslintrc.js", "--ignore-path ", root .. "/node_modules/@wordpress/scripts/config/.eslintignore" } }), -- null_ls.builtins.diagnostics.eslint, -- null_ls.builtins.diagnostics.eslint.with({ -- condition = function(utils) -- local has_file1 = utils.root_has_file({".eslintrc.js"}) -- local has_file2 = utils.root_has_file({"gatsby-config.js"}) -- print("condition") -- print(has_file1) -- print(has_file2) -- return has_file1 and has_file2 -- end -- }), -- 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", "-"} }), -- 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})