diff options
Diffstat (limited to 'lua/lsp')
-rw-r--r-- | lua/lsp/angular-ls.lua | 2 | ||||
-rw-r--r-- | lua/lsp/emmet-ls.lua | 2 | ||||
-rw-r--r-- | lua/lsp/init.lua | 72 | ||||
-rw-r--r-- | lua/lsp/svelte-ls.lua | 2 | ||||
-rw-r--r-- | lua/lsp/tailwindcss-ls.lua | 2 | ||||
-rw-r--r-- | lua/lsp/ts-fmt-lint.lua | 38 | ||||
-rw-r--r-- | lua/lsp/tsserver-ls.lua | 26 |
7 files changed, 124 insertions, 20 deletions
diff --git a/lua/lsp/angular-ls.lua b/lua/lsp/angular-ls.lua index e1363731..818faf38 100644 --- a/lua/lsp/angular-ls.lua +++ b/lua/lsp/angular-ls.lua @@ -1,4 +1,4 @@ --- TODO find correct root filetype +-- TODO: find correct root filetype -- :LspInstall angular require("lspconfig").angularls.setup { cmd = { DATA_PATH .. "/lspinstall/angular/node_modules/@angular/language-server/bin/ngserver", "--stdio" }, diff --git a/lua/lsp/emmet-ls.lua b/lua/lsp/emmet-ls.lua index a671ff88..e38747ac 100644 --- a/lua/lsp/emmet-ls.lua +++ b/lua/lsp/emmet-ls.lua @@ -10,7 +10,7 @@ capabilities.textDocument.completion.completionItem.snippetSupport = true configs.emmet_ls = { default_config = { cmd = { "emmet-ls", "--stdio" }, - filetypes = { "html", "css", "javascript", "typescript" }, + filetypes = { "html", "css", "javascript", "typescript", "vue" }, root_dir = function() return vim.loop.cwd() end, diff --git a/lua/lsp/init.lua b/lua/lsp/init.lua index 096ceabf..01f82737 100644 --- a/lua/lsp/init.lua +++ b/lua/lsp/init.lua @@ -1,4 +1,4 @@ --- TODO figure out why this don't work +-- TODO: figure out why this don't work vim.fn.sign_define( "LspDiagnosticsSignError", { texthl = "LspDiagnosticsSignError", text = "ï™™", numhl = "LspDiagnosticsSignError" } @@ -20,6 +20,7 @@ vim.cmd "nnoremap <silent> gd <cmd>lua vim.lsp.buf.definition()<CR>" vim.cmd "nnoremap <silent> gD <cmd>lua vim.lsp.buf.declaration()<CR>" vim.cmd "nnoremap <silent> gr <cmd>lua vim.lsp.buf.references()<CR>" vim.cmd "nnoremap <silent> gi <cmd>lua vim.lsp.buf.implementation()<CR>" +vim.cmd "nnoremap <silent> gp <cmd>lua require'lsp'.PeekDefinition()<CR>" vim.cmd "nnoremap <silent> K :lua vim.lsp.buf.hover()<CR>" -- vim.cmd('nnoremap <silent> <C-k> <cmd>lua vim.lsp.buf.signature_help()<CR>') vim.cmd "nnoremap <silent> <C-p> :lua vim.lsp.diagnostic.goto_prev({popup_opts = {border = O.lsp.popup_border}})<CR>" @@ -103,7 +104,72 @@ local function documentHighlight(client, bufnr) end local lsp_config = {} -if O.document_highlight then +-- Taken from https://www.reddit.com/r/neovim/comments/gyb077/nvimlsp_peek_defination_javascript_ttserver/ +function lsp_config.preview_location(location, context, before_context) + -- location may be LocationLink or Location (more useful for the former) + context = context or 15 + before_context = before_context or 0 + local uri = location.targetUri or location.uri + if uri == nil then + return + end + local bufnr = vim.uri_to_bufnr(uri) + if not vim.api.nvim_buf_is_loaded(bufnr) then + vim.fn.bufload(bufnr) + end + + local range = location.targetRange or location.range + local contents = vim.api.nvim_buf_get_lines( + bufnr, + range.start.line - before_context, + range["end"].line + 1 + context, + false + ) + local filetype = vim.api.nvim_buf_get_option(bufnr, "filetype") + return vim.lsp.util.open_floating_preview(contents, filetype, { border = O.lsp.popup_border }) +end + +function lsp_config.preview_location_callback(_, method, result) + local context = 15 + if result == nil or vim.tbl_isempty(result) then + print("No location found: " .. method) + return nil + end + if vim.tbl_islist(result) then + lsp_config.floating_buf, lsp_config.floating_win = lsp_config.preview_location(result[1], context) + else + lsp_config.floating_buf, lsp_config.floating_win = lsp_config.preview_location(result, context) + end +end + +function lsp_config.PeekDefinition() + if vim.tbl_contains(vim.api.nvim_list_wins(), lsp_config.floating_win) then + vim.api.nvim_set_current_win(lsp_config.floating_win) + else + local params = vim.lsp.util.make_position_params() + return vim.lsp.buf_request(0, "textDocument/definition", params, lsp_config.preview_location_callback) + end +end + +function lsp_config.PeekTypeDefinition() + if vim.tbl_contains(vim.api.nvim_list_wins(), lsp_config.floating_win) then + vim.api.nvim_set_current_win(lsp_config.floating_win) + else + local params = vim.lsp.util.make_position_params() + return vim.lsp.buf_request(0, "textDocument/typeDefinition", params, lsp_config.preview_location_callback) + end +end + +function lsp_config.PeekImplementation() + if vim.tbl_contains(vim.api.nvim_list_wins(), lsp_config.floating_win) then + vim.api.nvim_set_current_win(lsp_config.floating_win) + else + local params = vim.lsp.util.make_position_params() + return vim.lsp.buf_request(0, "textDocument/implementation", params, lsp_config.preview_location_callback) + end +end + +if O.lsp.document_highlight then function lsp_config.common_on_attach(client, bufnr) documentHighlight(client, bufnr) end @@ -131,7 +197,7 @@ function lsp_config.tsserver_on_attach(client, bufnr) -- formatting enable_formatting = O.lang.tsserver.autoformat, - formatter = O.lang.tsserver.formatter, + formatter = O.lang.tsserver.formatter.exe, formatter_config_fallback = nil, -- parentheses completion diff --git a/lua/lsp/svelte-ls.lua b/lua/lsp/svelte-ls.lua index 9d7b8973..e5ddb3b3 100644 --- a/lua/lsp/svelte-ls.lua +++ b/lua/lsp/svelte-ls.lua @@ -1,4 +1,4 @@ --- TODO what is a svelte filetype +-- TODO: what is a svelte filetype require("lspconfig").svelte.setup { cmd = { DATA_PATH .. "/lspinstall/svelte/node_modules/.bin/svelteserver", "--stdio" }, on_attach = require("lsp").common_on_attach, diff --git a/lua/lsp/tailwindcss-ls.lua b/lua/lsp/tailwindcss-ls.lua index 4c90ebd0..38c1e7cc 100644 --- a/lua/lsp/tailwindcss-ls.lua +++ b/lua/lsp/tailwindcss-ls.lua @@ -1,4 +1,4 @@ --- TODO what is a tailwindcss filetype +-- TODO: what is a tailwindcss filetype local lspconfig = require "lspconfig" lspconfig.tailwindcss.setup { diff --git a/lua/lsp/ts-fmt-lint.lua b/lua/lsp/ts-fmt-lint.lua index 8a6c366c..a73b817e 100644 --- a/lua/lsp/ts-fmt-lint.lua +++ b/lua/lsp/ts-fmt-lint.lua @@ -5,30 +5,42 @@ local M = {} M.setup = function() local tsserver_args = {} - local prettier = { - formatCommand = "prettier --stdin-filepath ${INPUT}", - formatStdin = true, - } - - if vim.fn.glob "node_modules/.bin/prettier" ~= "" then - prettier = { - formatCommand = "./node_modules/.bin/prettier --stdin-filepath ${INPUT}", + if O.lang.tsserver.linter == "eslint" or O.lang.tsserver.linter == "eslint_d" then + local eslint = { + lintCommand = O.lang.tsserver.linter .. " -f unix --stdin --stdin-filename {INPUT}", + lintStdin = true, + lintFormats = { "%f:%l:%c: %m" }, + lintIgnoreExitCode = true, + formatCommand = O.lang.tsserver.linter .. " --fix-to-stdout --stdin --stdin-filename=${INPUT}", formatStdin = true, } + table.insert(tsserver_args, eslint) end require("lspconfig").efm.setup { -- init_options = {initializationOptions}, cmd = { DATA_PATH .. "/lspinstall/efm/efm-langserver" }, init_options = { documentFormatting = true, codeAction = false }, - filetypes = { "html", "css", "yaml", "vue", "javascript", "javascriptreact", "typescript", "typescriptreact" }, + root_dir = require("lspconfig").util.root_pattern(".git/", "package.json"), + filetypes = { + "vue", + "javascript", + "javascriptreact", + "typescript", + "typescriptreact", + "javascript.jsx", + "typescript.tsx", + }, settings = { rootMarkers = { ".git/", "package.json" }, languages = { - html = { prettier }, - css = { prettier }, - json = { prettier }, - yaml = { prettier }, + vue = tsserver_args, + javascript = tsserver_args, + javascriptreact = tsserver_args, + ["javascript.jsx"] = tsserver_args, + typescript = tsserver_args, + ["typescript.tsx"] = tsserver_args, + typescriptreact = tsserver_args, }, }, } diff --git a/lua/lsp/tsserver-ls.lua b/lua/lsp/tsserver-ls.lua index d7c4ec3c..8ed801e8 100644 --- a/lua/lsp/tsserver-ls.lua +++ b/lua/lsp/tsserver-ls.lua @@ -1,3 +1,29 @@ +vim.cmd "let proj = FindRootDirectory()" +local root_dir = vim.api.nvim_get_var "proj" + +-- use the global prettier if you didn't find the local one +local prettier_instance = root_dir .. "/node_modules/.bin/prettier" +if vim.fn.executable(prettier_instance) ~= 1 then + prettier_instance = O.lang.tsserver.formatter.exe +end + +O.formatters.filetype["javascriptreact"] = { + function() + return { + exe = prettier_instance, + -- TODO: allow user to override this + args = { "--stdin-filepath", vim.api.nvim_buf_get_name(0), "--single-quote" }, + stdin = true, + } + end, +} +O.formatters.filetype["javascript"] = O.formatters.filetype["javascriptreact"] + +require("formatter.config").set_defaults { + logging = false, + filetype = O.formatters.filetype, +} + if require("lv-utils").check_lsp_client_active "tsserver" then return end |