Vim + LSPで手に入れよう快適なRuby開発環境

こんにちはコンピテンシークラウド開発チームのkihaです。

Microsoftが策定したエディタやIDEによらないコーディング支援のためのプロトコルがイケてるらしいという噂を小耳に挟んだので仮想環境で試してみました。

github.com microsoft.github.io

まずはベースを整える

今回は、Ubuntu18.04の仮想マシンを作成してホストの環境を汚さない環境上で開発環境を整えます。

 $ vagrant version
Installed Version: 2.1.1
Latest Version: 2.2.4
 
To upgrade to the latest version, visit the downloads page and
download and install the latest version of Vagrant from the URL
below:

  https://www.vagrantup.com/downloads.html

If you're curious what changed in the latest release, view the
CHANGELOG below:

  https://github.com/hashicorp/vagrant/blob/v2.2.4/CHANGELOG.md

おもむろにvagrant initします、boxのイメージがホスト上にない場合には若干時間がかかりますが私の環境では既にadd済みなので一瞬でinitできました。

$ vagrant init ubuntu/bionic64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

おもむろにvagrant up && vagrant sshし、パッケージリポジトリを更新します。

vagrant@ubuntu-bionic:~$ sudo apt update

素のUbuntuだとrubyが入っていなかったりするので、普通にaptでruby ruby-devをインストールします(Canonical製のイケてるパッケージマネージャsnapを使うとrbenvを使わずとも異なるバージョンのrubyをインストールできたりしますが普通にということで)。Ruby用のLanguageServerのsolargraphがgem Nokogiriに依存するので依存するパッケージもインストールしておきます。

vagrant@ubuntu-bionic:~$ sudo apt install ruby
vagrant@ubuntu-bionic:~$ sudo apt install ruby-dev
Reading package lists... Don
vagrant@ubuntu-bionic:~$ sudo apt install build-essential
Reading package lists... Done
Building dependency tree
vagrant@ubuntu-bionic:~$ sudo apt install libxml2 libxml2-dev libxslt1-dev
Reading package lists... Done
Building dependency tree  

2.5系をインストールしました。

vagrant@ubuntu-bionic:~$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]
vagrant@ubuntu-bionic:~$ gem -v
2.7.6

gem solargraphのインストール

Ruby用のLanguage Serverであるsolargraphをインストールします。

異なる言語で開発したいよという方は他言語用のLanguage Serverを動かしておくだけでIDE並のコーディング支援が受けられます、すごい。

vagrant@ubuntu-bionic:~$ sudo gem install solargraph

help I want to use LSP. 下二つが重要でLSPはソケットモードと標準出力モードに対応していることがわかります。ソケットモードならLanguage Serverだけ隔離してネットワーク越しに動作させることもできるんですね、すごい。

vagrant@ubuntu-bionic:~$ solargraph help
Commands:
  solargraph --version, -v            # Print the version
  solargraph available-cores          # List available documentation versions
  solargraph clear-cores              # Clear the cached core documentation
  solargraph config [DIRECTORY]       # Create or overwrite a default configuration file
  solargraph download-core [VERSION]  # Download core documentation
  solargraph help [COMMAND]           # Describe available commands or one specific command
  solargraph list-cores               # List the local documentation versions
  solargraph reporters                # Get a list of diagnostics reporters
  solargraph socket                   # Run a Solargraph socket server
  solargraph stdio                    # Run a Solargraph stdio server

vim-plug LanguageClient-neovimのインストール

solargraphをインストールしただけではただLanguage Serverを用意しただけにすぎないので、vim側でサーバからhinting情報を受け取ってよしなに表示してくれるプラグインが必要になります。今回はプラグインを管理するために軽量そうなプラグインマネージャのvim-plugで、LanguageClinet-neovimをインストールしてvimをLSPに対応させます。neovimといいつつvimに対応させてくるニクいプラグインです。

github.com github.com

公式ドキュメントも参考にしつつ、vim-plugをインストールします。1ファイルだけで構成されているのがすごい。

vagrant@ubuntu-bionic:~$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
>     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 74434  100 74434    0     0  12829      0  0:00:05  0:00:05 --:--:-- 22679
vagrant@ubuntu-bionic:~$ ls ~/.vim/autoload/
plug.vim

.vimrcにLangugageClient-neovimをインストールするための設定を書き込んでインストールします。

vagrant@ubuntu-bionic:~$ cat << EOF > ~/.vimrc
> call plug#begin('~/.vim/plugged')
>    Plug 'autozimu/LanguageClient-neovim', { 'branch': 'next', 'do': 'bash install.sh' }
> call plug#end()
> EOF
vagrant@ubuntu-bionic:~$ vim #:PlugInstall

ここまででおおよそ設定はできたのですがソケット設定、キーマップ設定などを.vimrcに書き込んで完成です!

vagrant@ubuntu-bionic:~$ cat << EOF >> ~/.vimrc
> let g:LanguageClient_serverCommands = { 'ruby': ['tcp://localhost:7658'] }
> let g:LanguageClient_autoStart = 1
> let g:LanguageClient_autoStop = 0
> autocmd FileType ruby setlocal omnifunc=LanguageClient#complete
> nnoremap <silent> def :call LanguageClient#textDocument_definition()<CR>
> EOF

solargraphの起動

以下でバックグラウンドで起動、おもむろにvimを起動します。

vagrant@ubuntu-bionic:~$ solargraph socket &

ほら、クラス名・メソッド名の上でdefとタイプすると簡単にコードジャンプできます。ctrl+pでメソッド名などを補完できますが若干コード解析までに時間がかかるのか追加したクラスにジャンプできるようになるまでディレイがあります。

f:id:kiha12:20190228133847g:plain

株式会社あしたのチームではともに快適な開発環境を追い求めるエンジニアを募集しています。