require'nvim-treesitter.configs'.setup { ensure_installed = "maintained", -- one of "all", "maintained" (parsers with maintainers), or a list of languages ignore_install = { "c" }, -- List of parsers to ignore installing highlight = { enable = true, -- false will disable the whole extension disable = { "c", "rust" }, -- list of language that will be disabled -- Setting this to true will run `:h syntax` and tree-sitter at the same time. -- Set this to `true` if you depend on 'syntax' being enabled (like for indentation). -- Using this option may slow down your editor, and you may see some duplicate highlights. -- Instead of true it can also be a list of languages additional_vim_regex_highlighting = false, }, } --[efm-langserver] -- " npm install -g eslint_d local eslint = { lintCommand = "eslint_d -f unix --stdin --stdin-filename ${INPUT}", lintStdin = true, lintFormats = {"%f:%l:%c: %m"}, lintIgnoreExitCode = true, formatCommand = "eslint_d --fix-to-stdout --stdin --stdin-filename=${INPUT}", formatStdin = true } local shellcheck = { lintCommand = "shellcheck -f gcc -x", lintSource = "shellcheck", lintFormats = { "%f:%l:%c: %trror: %m", "%f:%l:%c: %tarning: %m", "%f:%l:%c: %tote: %m", } } local flake8 = { lintCommand = "flake8 --stdin-display-name ${INPUT} -", lintStdin = true, lintFormats = {"%f:%l:%c: %m"} } local black = { formatCommand = "black --quiet -", formatStdin = true } -- sudo pacman -Syu jq local jq = { lintCommand = "jq ." } -- npm install -g fixjson local fixjson = { formatCommand = "fixjson" } -- https://aur.archlinux.org/packages/lua-format/ local luaformat = { formatCommand = 'lua-formatt -i', formatStdin = true } local util = require "lspconfig".util local on_attach_efm = function(client) 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({}, 1000)]] vim.cmd [[augroup END]] end end require "lspconfig".efm.setup { init_options = {documentFormatting = true}, on_attach = on_attach_efm, filetypes = {"javascript", "typescript", "json", "sh", "python", "lua"}, root_dir = function(fname) return util.root_pattern("tsconfig.json")(fname) or util.root_pattern(".eslintrc.js", ".git")(fname); end, settings = { rootMarkers = {".eslintrc.js", ".git/"}, languages = { javascript = {eslint}, typescript = {eslint}, json = {jq, fixjson}, python = {flake8, black}, sh = {shellcheck}, lua = {luaformat} } } } -- [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 -- TODO - don't run for sh files but have something else instead - shellcheck? 'bashls', -- npm i -g vscode-langservers-extracted 'cssls', -- npm install -g intelephense 'intelephense', -- https://phpactor.readthedocs.io/en/master/usage/standalone.html 'phpactor', -- npm install -g pyright 'pyright', -- npm i -g stylelint-lsp 'stylelint_lsp', -- https://github.com/neovim/nvim-lspconfig/wiki 'tailwindcss', -- npm install -g typescript typescript-language-server 'tsserver', -- npm install -g vim-language-server 'vimls', -- npm install -g vls 'vuels', -- npm i -g stylelint-lsp 'yamlls', } -- 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', 'gD', 'lua vim.lsp.buf.declaration()', opts) buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) buf_set_keymap('n', 'l', 'lua vim.lsp.diagnostic.set_loclist()', 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', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', 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) end local capabilities = vim.lsp.protocol.make_client_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 cmp = require'cmp' cmp.setup({ completion = { keyword_length = 4, -- autocomplete = false }, -- snippet = { -- expand = function(args) -- vim.fn["vsnip#anonymous"](args.body) -- end, -- }, mapping = { [''] = cmp.mapping.complete(), [''] = cmp.mapping.confirm({ select = true }), [''] = cmp.mapping.abort(), }, sources = { { name = 'buffer' }, { name = 'nvim_lsp' }, { name = 'path' }, { name = 'ultisnips' }, ... } }) -- nvim-autopairs require('nvim-autopairs').setup{} -- you need setup cmp first put this after cmp.setup() require("nvim-autopairs.completion.cmp").setup({ map_cr = true, -- map on insert mode map_complete = true, -- it will auto insert `(` after select function or method item auto_select = true -- automatically select the first item }) --nvim-ts-autotag require'nvim-treesitter.configs'.setup { autotag = { enable = true, } }