Recently I've been working on a project in a monorepo were I've got nodejs/typescript and deno projects. This is notoriously annoying because any ts
file will start both tsserver
and denols
language services.
If you've got here you know what I'm talking about 😓
I'm setting up my lsp with lspconfig
.
This is how denols
is configured
lspconfig.denols.setup({ root_dir = lspconfig.util.root_pattern("deno.json", "deno.jsonc"), init_options = { lint = true, unstable = true, suggest = { imports = { hosts = { ["https://deno.land"] = true, ["https://cdn.nest.land"] = true, ["https://crux.land"] = true, }, }, }, }, on_attach = on_attach, })
And this is the hack to avoid tsserver
to start on a file that belongs to a deno project.
spconfig.tsserver.setup({ on_attach = function (client, bufnr) on_attach(client, bufnr); vim.keymap.set('n', '<leader>ro', function() vim.lsp.buf.execute_command({ command = "_typescript.organizeImports", arguments = { vim.fn.expand("%:p") } }) end, { buffer = bufnr, remap = false }); end, root_dir = function (filename, bufnr) local denoRootDir = lspconfig.util.root_pattern("deno.json", "deno.json")(filename); if denoRootDir then -- print('this seems to be a deno project; returning nil so that tsserver does not attach'); return nil; -- else -- print('this seems to be a ts project; return root dir based on package.json') end return lspconfig.util.root_pattern("package.json")(filename); end, single_file_support = false, })
This leverage the fact that if root_dir
function returns nil
then lspconfig
wont's start a language service for that file. 🎉
Top comments (0)