MacのUnityでLSPが適切に働くようにNeovimをセットアップする

こんにちは!バックエンドコースのamaです。最近は案件やバイオリンづくめで個人開発が滞っています。

UnityでLSPを設定する際に嵌ったので備忘録として書き残しておきます。

やりたいこと

UnityはC#をスクリプト言語とするゲームエンジンです。ゲームエンジンは比較的ガラパゴスなシステムになりがちで、組み込みのエディタやプロプライエタリなIDEでないと中々快適な開発環境を整えられないです。特に一昔前はエディタごとに開発者支援の方法が分かれていたため、開発環境は公式が提供する方法以外ではほぼ無理に近い環境でした。

ですが、今はLanguage Server Protocol(LSP)という仕組みが開発されており、エンジニアは様々な言語環境で好みの方法で開発することができるようになっています。

LSPとはマイクロソフトが開発したプロトコルであり、言語処理ツールや統合開発環境(IDE)を統一的に接続するための枠組みです。
LSPは、言語処理機能をIDEやエディタそれぞれで実装する必要がなくなるため、エディタ開発の効率性を高めることができます。

今回はLSPを用いて、NeovimでUnityについての補完やDiagnostics表示ができるようにセットアップしていきます。

方法

Neovimに csharp-language-server を導入する

Neovimにcsharp-language-serverを導入します。
csharp-language-serverは omnisharp-roslyn
を元につくられたC#のLSP実装のひとつです。

そもそもOmnisharpとは何か、という話ですが、MicrosoftがLSPを開発する以前につくっていたもので、C#の言語処理機能をOSS化したものらしいです。
Omnisharpを元にLSPがつくられたという噂を聞いたことがありますが、真偽は知らないです。

Omnisharp-vimというVimプラグインもあり、これを用いて開発環境を整えることもできると思います。
ですが今回はNeovim組みこみの nvim-lsp
を用いて他の言語処理機能と統一的に扱うため Omnisharp-vim は使いません。

csharp-language-serverの導入方法は各自好みの方法をとってください。
私はプラグインマネージャにlazy.nvimを用い、mason.nvimで csharp-language-server をインストールしています。

-- lazy.nvimでmason.nvimをインストールする設定
{
    "williamboman/mason.nvim", -- LSP Installer
    dependencies = {
        "williamboman/mason-lspconfig.nvim",
        "neovim/nvim-lspconfig",
        "nvim-lua/plenary.nvim",
    },
    event = "VeryLazy",
    config = function()
        require "mason".setup {}
        local mason_lspconfig = require("mason-lspconfig")
        local on_attach = function(_, bufnr)
            vim.api.nvim_buf_set_option(bufnr, "formatexpr",
                "v:lua.vim.lsp.formatexpr(#{timeout_ms:250})")
            -- _G.lsp_onattach_func(i, bufnr)
        end
        mason_lspconfig.setup_handlers({
            function(server_name)
                local opts = {
                    on_attach = on_attach,
                    settings = {
                        ["omniSharp"] = {
                            useGlobalMono = "always"
                        }
                    },
                }
                require("lspconfig")[server_name].setup(opts)
            end,
        })
        vim.cmd("LspStart") -- 初回起動時はBufEnterが発火しない
    end,
},

csharp-language-server:Mason コマンドから検索すればインストールすることができます。

Visual Studio for Macをインストールする(重要)

ここが嵌りポイントになったのですが、Visual Studio for Macをインストールする必要があります。
他の標準的なLSPでは大抵LSPサーバを導入してnvim-lspconfigを設定するのみで大抵補完が動くのですが、C#の場合はslnファイルを適切に設定し、依存するライブラリファイルが適切な位置にないと適切にライブラリや他クラスを認識してくれません。
Visual Studio for Macをインストールすることで解決してくれます。インストールはUnityから「モジュールを加える」ことでできます。Macの方は以下のようにHomebrew Caskを用いることもできます。

brew install visual-studio

dotnet-coreをインストールする

Visual Studio for Mac には dotnet-core が含まれていないようなので別途インストールしましょう。
公式 からダウンロードすることも、Macの方は以下のようにHomebrew Caskを用いることもできます。

brew install dotnet-sdk

完成!

以上で完成です!お疲れ様でした!