ottijp blog

XcodeのプロジェクトをVimでLSPする方法

  • 2023-11-08

※ 「LSPする」というのはLanguage Serverを使ってIDEのように補完や定義参照する,という意味です.(それを表す適切な動詞がわかりませんでした.)

モチベーション

Vimでswiftのコードに対してLSP(Language Server Protocol)するにはvim-lspsourcekit-lspを使えば可能です. ただし,それだけではSPM(Swift Package Manager)で追加してimportしている依存ライブラリや,ワークスペース内の他のフレームワークについては補完や定義参照ができません.

Xcode自体にもVim Modeがありますが,あまりにも貧弱でコードを書くのがしんどいので, xcode-build-serverというものを使ってXcodeのプロジェクトをVimでLSPできるようにしてみました.

cf. SolaWing/xcode-build-server: a build server protocol implementation for integrate xcode with sourcekit-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.

cf. https://github.com/apple/sourcekit-lsp/blob/8f53d08b503435ac787ca65461baf03eccb5c86f/Sources/SKCore/BuildServerBuildSystem.swift#L44C69-L44C69

lspの起動

あとはvimでLSPを起動すれば,SPMで追加してimportしている依存ライブラリや,ワークスペース内の他のフレームワークが参照されるようになり,補完や定義参照が効くようになりました. 生成されたbuildServer.jsonをsourcekit-lspが読んで,内部的にxcode-build-serverを起動してるようです.

問題

vimの設定の問題かもしれませんが,いくつか気になっている問題があります.

  • hoge(をタイプした時に補完が表示されず,C-x C-oする必要がある.
  • C-x C-oしても補完が表示されない時や,時間がかかる時がある.

ottijp
都内でアプリケーションエンジニアをしています
© 2024, ottijp