XcodeのプロジェクトをVimでLSPする方法
※ 「LSPする」というのはLanguage Serverを使ってIDEのように補完や定義参照する,という意味です.(それを表す適切な動詞がわかりませんでした.)
モチベーション
Vimでswiftのコードに対してLSP(Language Server Protocol)するにはvim-lspとsourcekit-lspを使えば可能です. ただし,それだけではSPM(Swift Package Manager)で追加してimportしている依存ライブラリや,ワークスペース内の他のフレームワークについては補完や定義参照ができません.
Xcode自体にもVim Modeがありますが,あまりにも貧弱でコードを書くのがしんどいので, xcode-build-serverというものを使ってXcodeのプロジェクトをVimでLSPできるようにしてみました.
環境
- mac: Mac mini 2023 (Apple M2 Pro)
- macOS: 13.5 (Ventura)
- Xcode: 15.0
- vim-lsp: c58edb9
- xcode-build-server: 1d03ce9
前提
vim-lspとsourcekit-lspでswiftのLSPが使えていることが前提です.これには,mattnさんのvim-lsp-settingsを使うと楽です.(感謝!)
cf. mattn/vim-lsp-settings: Auto configurations for Language Server for vim-lsp
buildConfig.json の作成
xcode-build-serverをクローンして./xcode-build-server/xcode-build-server
にパスを通します.
git clone https://github.com/SolaWing/xcode-build-server.git
sudo ln -s $PWD/xcode-build-server/xcode-build-server /usr/local/bin
Xcodeのプロジェクトリポジトリで以下のようなコマンドを実行します.
すると,buildServer.json
というファイルが生成されます.
xcode-build-server config -scheme YOUR_SCHEME_NAME -workspace YOUR_WORKSPACE_NAME.xcworkspace
# もしくは
# xcode-build-server config -scheme YOUR_SCHEME_NAME -project YOUR_PROJECT_NAME.xcodeproj
ls buildServer.json
注意点として,.git
のあるリポジトリルートで実行する(buildServer.json
が生成される)必要がある点です.
私の場合,次のようなディレクトリ構成で,リポジトリルートの1つ下の階層にXcodeワークスペースがありました.
./
├── .git/
├── CopyAsLink/
│ ├── CopyAsLink/
│ ├── CopyAsLink.xcodeproj/
│ ├── CopyAsLink.xcworkspace/
│ └── EmbededFramework/
├── README.md
└── assets/
そこで,リポジトリルートで次のようにコマンドを実行しました.
xcode-build-server config -scheme CopyAsLink -workspace CopyAsLink/CopyAsLink.xcworkspace
このことはxcode-builder-serverのREADMEには書いていないのですが,sourcekit-lspのコードに次のようにコメントがあって気づきました.
/// Provides build settings from a build server launched based on a
/// `buildServer.json` configuration file provided in the repo root.
lspの起動
あとはvimでLSPを起動すれば,SPMで追加してimportしている依存ライブラリや,ワークスペース内の他のフレームワークが参照されるようになり,補完や定義参照が効くようになりました.
生成されたbuildServer.json
をsourcekit-lspが読んで,内部的にxcode-build-serverを起動してるようです.
問題
vimの設定の問題かもしれませんが,いくつか気になっている問題があります.
hoge(
をタイプした時に補完が表示されず,C-x C-o
する必要がある.C-x C-o
しても補完が表示されない時や,時間がかかる時がある.