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)