2024/3/20

LunarVimでtsserverとdeno_lsを切り替える方法

lvimで動的にLSP(言語サーバー)を切り替える方法を紹介します。

LunarVimのLSP設定方法

LunarVimには、デフォルトでLSPが設定されており、それを変えるにはドキュメントに書いてあります。

https://www.lunarvim.org/docs/configuration/language-features/language-servers

Use jedi_language_server instead of pyright

-- add `pyright` to `skipped_servers` list
vim.list_extend(lvim.lsp.automatic_configuration.skipped_servers, { "pyright" })
-- remove `jedi_language_server` from `skipped_servers` list
lvim.lsp.automatic_configuration.skipped_servers = vim.tbl_filter(function(server)
  return server ~= "jedi_language_server"
end, lvim.lsp.automatic_configuration.skipped_servers)

skipped_serversに追加することで、その言語サーバーを無効にすることができます。 jedi_language_serverをskipped_serversから排除することで、有効にすることができます。

しかし、この方法で適用するには設定を変更する度に:LvimCacheResetを実行する必要があります。

代替方法

LunarVimで、元々適用されてないLSPを追加するには、以下のようにします。

local lspconfig = require('lvim.lsp.manager')
lspconfig.setup('emmet_ls', {
  filetypes = {
    'typescript',
  },
})

これはemmet_lsをtypescriptファイルに適用する例です。

この2個の方法を組み合わせることで、実現できます。

tsserverとdeno_lsを切り替える

プロジェクトルートにpackage.jsonが存在する場合はtsserverを使い、 存在しない場合はdeno_lsを使うという設定をします。

local additional_servers = {
  'tsserver',
}

local server_list = vim.list_extend(lvim.lsp.automatic_configuration.skipped_servers, additional_servers)
lvim.lsp.automatic_configuration.skipped_servers = server_list

local function is_packagejson_present()
  if vim.fn.filereadable('package.json') == 1 then
    return true
  end
  return false
end

if is_packagejson_present() then
  lspconfig.setup('tsserver')
else
  lspconfig.setup('denols')
end

注意点としては、プロジェクトルートでlvimを開かないと package.jsonが認識されないのでdeno_lsが使われます。

また、この方法でも設定後一度だけ:LvimCacheResetを実行する必要があるので忘れずに。

最後に

LunarVimっていいですよね。

ではまた。

Last updated on