こんにちは
みなさん, Vim(NeoVim)やってらっしゃいますでしょうか.
私は最近になってようやくvimを真面目に触り始めました.
普段(?)swiftを書いているのですが,vimでもXcodeばりに補完やハイライトができると嬉しいなと思い,設定してみました.deoplete
を使った記事はあったのですが,coc.nvim
を使ったものはなさそうなので,記事にしました.
環境
- OS: macOS Mojave 10.14.6
- NeoVim: NVIM v0.4.2, Build type: Release, LuaJIT 2.0.5
- Swift: Apple Swift version 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7)
- Xcode: Version 11.0 (11A420a)
プラグインマネージャはvim-plugを使っています.
シンプルで使いやすいです.
vim-plugの導入方法はググるとすぐ出てくるので割愛します.
シンタックスハイライト
swiftはデフォルトではハイライトされないため,構文ファイルを作る,またはプラグインを導入する必要があります.
今回は以下のプラグインを使います.
keith/swift.vim
インストール
init.vimに以下を記述します.
call plug#begin('~/.vim/plugged'):" 👇これを記述
Plug 'keith/swift.vim':call plug#end()
セーブしてneovimを起動, :PlugInstall
でインストールされます.
これでシンタックスハイライトが効くようになりました.
補完
vimで補完機能を有効にするに当たって,いくつか選択肢があります.
- deoplete
- coc.nvim
- vim-lsp
精査はしていないですが,coc.nvim
がスター数も多く,設定も直感的であったため,coc.nvim
を使うことにしました.
coc.nvim
deopleteはよくわかりませんが,coc.nvimとvim-lspはLanguage-Server-Clientという点で,補完のアプローチはほとんど同じだと思います.
coc.nvimはtypescriptで実装されており,vim-lspはvimscriptで実装されています.
vimだけで完結させたい方はvim-lspの方が良いかもしれません.
coc.nvimのインストール
init.vimに以下を記述します.
call plug#begin('~/.vim/plugged'):" 👇これを記述
Plug 'neoclide/coc.nvim',{'branch':'release'}
Plug 'keith/swift.vim':call plug#end()
セーブしてneovimを起動, :PlugInstall
でインストールされます.
インストール後は:Coc*
系のコマンドが使えるようになります.:CocConfig
でcocの設定ファイルを開き,そこに設定を書いていくといった流れになります.
Language-Server-Protocolの導入
coc.nvimはlanguage-server-clientであるため,単体では意味をなさず,言語ごとのlanguage-server-protocol(以下LSP)を動かす必要があります.
swiftのLSPとしてSourceKit-LSPがあるのでそれを利用します.
sourcekit-lspのインストール
ソースからbuildします.(Swift5.1以上が必要)
適当なディレクトリでhttps://github.com/apple/sourcekit-lsp.gitをcloneします.
その後sourcekit-lspに移動し,buildします.
実行ファイルのあるディレクトリに移動し,./sourcekit-lsp
を実行してエラーが起きなければインストール完了です.sourcekit-lsp
の実行ファイルをpathが通っているディレクトリに置いておく方が良いかもしれません.
以下は実行するコマンドです.
$ git clone https://github.com/apple/sourcekit-lsp.git
$ cd sourcekit-lsp
$ swift build -c release 👈 そこそこ時間がかかります
$ mv .build/release/sourcekit-lsp /usr/local/bin 👈 やらなくてもヨシ
cocの設定
neovimを起動します.:CocConfig
でcocの設定ファイルを開き以下を記述します.
{"suggest.enablePreselect":true,"languageserver":{"swift":{"command":"<sourcekit-lspの絶対パス>","filetypes":["swift"]}}}
お疲れ様でした!
これでswiftの補完が効くようになりました👍
また,他の言語でもLSPを用意すれば補完やコードジャンプなどができるようになります.
LSPの例として
- ruby: solargraph
- python: pyls
などがあります.
閑話
設定したのはいいものの,果たしてVimでSwiftを書くタイミングはくるのか?
iOSアプリ開発であればXcode一択なのでは...