エディタ遍歴とLSP

僕が初めてソースコードというものを触ったのは小学生か中学生の時でした。それから現在までプライベートでコードを書いたり、仕事をしたりという中で使用しているエディタは変化してきました。今まではあまり「これだ」というものに巡り会えていなかったのですが、Language Server Protocol (以下LSP) の出現により、最近ようやく手に馴染むエディタが定まりつつあります。そこでエディタ遍歴を振り返りつつLSPについても少し触れたいと思います。

## 初めてのコード

僕が初めてコードを書いたのは、初心者向けのパソコン雑誌の後ろの方に書かれていた"ホームページ"作成入門の記事でした。そこにはWindowsのメモ帳を開き、何やら英語っぽいものを記述して `.htm` という名前をつけて保存するということが書かれていました。ちなみにその時のソースコートはこんな感じだったと思います。今では見ることのないタグが並んでいますが、人によっては懐かしいのではないでしょうか。

```html
<html>
  <head>
    <title>ようこそ！</title>
  </head>
  <body bgcolor="pink">
    <center>
      <font size="7">ようこそ！</font>
      <br>
      <br>
      <marquee>
        ここは<font color="darkgreen"><b>〇〇〇〇</b></font>のホームページです！
      </marquee>
      <br>
      <br>
      <i>メニュー</i>
      <table border="5" style="text-align: center;">
        <tr>
          <td><a href="#">日記</a></td>
          <td rowspan="4"><img src="" alt="トップ画像" width="150px" height="150px"></td>
        </tr>
        <tr>
          <td><a href="#">イラスト</a></td>
        </tr>
        <tr>
          <td>
掲示板
 (工事中)</td>
        </tr>
        <tr>
          <td><a href="#">リンク集</a></td>
        </tr>
      </table>
      <br>
      <br>
      <hr>
      <small>Copyright © 20xx ○○○○ All Rights Reserved.</small>
    </center>
  </body>
</html>
```

初めて書いたソースコードであったと同時に、僕が初めてテキストエディタに触れたときでした。ただのメモ帳に書かれた文字の羅列がホームページになったという体験が、プログラミングの仕事に就こうと思った最初のきっかけです。実際に動くコードは[こちら](https://itkr.github.io/classical/)。懐かしいですね。

## 空白期間

中学生くらいでソースコードを書くことを覚えましたが、高校に入ると部活が忙しく、大学でも文系に進学したのでほとんどソースコードを触ることがありませんでした。少しだけJavaScriptを書くのにDreamweaverは触りましたが、なにか書くときは主にメモ帳で書いていたのでシンタックスハイライトのあるエディタは逆に使いにくかった記憶があります。

## IDE入門

新卒で入った会社の新人研修でJavaを学ぶときに初めてIDEであるEclipseを触りました。そこでIDEによる開発を知り、しばらくはIDEを使っていました。この頃はIDEが便利というよりはIDEが必須だと考えていました。

## IDEでの開発

ゲーム会社でPythonを書くようになりますが、IDEに慣れていたためEclipseにPyDevプラグインを入れて開発していました。新しいMacを使い始めたのをきっかけに、ここ最近はPyCharmを使っていました。PythonのようなLLでもIDEを使っている理由は、最初の設定が楽だからです。とくにPyCharmのように言語に特化したIDEでは、自動補完やメソッド定義へのジャンプなど、特に設定せずに使えます。

## テキストエディタの併用

開発はIDEですが、ちょっとしたテキストの編集はテキストエディタを使用していました。Windowsではメモ帳、MacではCotEditorを使っていました。それが一番慣れているキーバインドを使用できたからです。

## Vim入門

そのうち少しだけVimも触るようになりました。はじめは `git commit` のときはデフォルトでVimが起動するので仕方なく使っていた程度でした。前職のCTOの下で働いているときに、彼がVimを便利そうに使っていて、その憧れもありMarkdownやYamlなどちょっとしたファイルの編集や、ちょっとPythonの修正するときにVimを使うようになりました。

途中、Emacsも経由しましたが常用エディタにするのは挫折しました。でもMacを使う上ではEmacsのキーバインドは練習してよかったと思ってます。

## Vimでの開発

IDEでの開発は便利なのですが、ちょっとコードを書きたいだけなのにわざわざプロジェクトを作らなければいけなかったり、違う言語を書くときにそのためのIDEをインストールしたりというのが面倒になってきました。

そこでVimでの開発を行っていこうと考えました。段々と手に馴染むようにはなってきたのですが、Vimでの開発もIDEと同様に言語に合わせてプラグインを探してvimrcに変更を加えて…というのはどうしても必要でした。特にPythonを書くときには `pythonbrew` `virtualenv` `pyenv` `venv` などで仮想環境を作ることが多いし、Python2とPython3の違いによって動かないプラグインがあったりと、一つ一つ解決するのも面倒でした。Windowsも使い始めて、Windows Subsystem for Linux を使っていると特に設定が面倒になりました。その面倒さから、メインで開発する環境はIDEと行ったり来たりしていました。

## 迷走

Vimのキーバインドに慣れて、手に馴染んでいたのですが、Pythonを書くときには色々設定が面倒だったので、PyCharmにVimキーバインドのプラグインを入れて開発することが多かったと思います。そこから手に馴染み、設定の楽なエディタを探してAtomや Visual Studio Code なども触りましたが、結局 PyCharm + Vimプラグイン が無難な選択肢でした。

## Language Server Protocol との出会い

VimConf2018に参加したときに Language Server Protocol (以下LSP) という言葉を知りました。

### Language Server Protocol とは

あまり詳しくはないので詳細についてはその他の記事に譲ります。

多くのIDEでは、定義ジャンプ・自動補完・エラー分析…などさまざまな機能を提供していると思います。これまでそれらの機能を実現するためには、各言語に合わせてプラグインを作成するなど、IDE側が対応する必要がありました。

LSPは簡単に言うと、言語側がサーバーを起動し、共通のプロトコルを提供することで定義ジャンプや自動補完などの機能を実現する仕組みです（…と理解しています）。LSPのない世界で完全に言語対応しようとすると、エディタやIDEの数✕言語の数の開発を行わなければなりません。しかし、エディタやIDE側がLSPにさえ対応すれば、LSPに対応している言語をサポートできるようになります。

## VimとLSPを使った開発

LSPを知った頃はあまり情報もなく、「こんなものもあるのか」くらいの感想でしたが、VimConf2019に参加した際に去年以上にLSPが盛り上がっていたので重い腰を上げてVimに導入することにしました。

### 導入したプラグイン

- https://github.com/prabirshrestha/vim-lsp (LSP用プラグイン)
- https://github.com/prabirshrestha/async.vim (vim-lspが依存)
- https://github.com/prabirshrestha/asyncomplete.vim (補完)
- https://github.com/prabirshrestha/asyncomplete-lsp.vim (LSP用補完)

### vimrcの設定

Python用の設定やマッピングは「[Pythonの補完環境をjedi-vimからvim-lspに移行した話](https://kashewnuts.github.io/2019/01/28/move_from_jedivim_to_vimlsp.html)」を参考にしました。

### Language Server 導入

LSPを利用するためにその言語用の Language Server をインストールします。現在対応しているのはこちら。
https://microsoft.github.io/language-server-protocol/implementors/servers/

Pythonの場合はpipでインストールできます

```sh
pip install python-language-server
```

これで `pyls` というサーバーが実行できるようになるので、vim-lspを使ってPythonによる開発をする準備ができました。なお、 `venv` や `pyenv-virtualenv` 、グローバルなPython環境で試してみましたが今の所それぞれの環境で問題なく動いています。

### 動き

![lsp.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14918/f4c1dca5-0990-7c41-ad81-4aad520937fe.gif)

## VimとLSPを使った開発の感想

### 補完や定義先の参照が早い

vim-lspや、その周辺のプラグインが優秀なので、補完や定義先の参照がとにかく早いです。言語特化のIDEと変わりない速さで動作します。IDEを立ち上げるような大きなプロジェクトじゃなくても、とくに設定もせずにこの速さでこれらの機能が使えることに感動すら覚えました。

### vimrcがスッキリ

今までpyenv対応やPython2用・3用の設定、あるいは他の言語の設定などでvimrcが膨らんでいましたが、それらはvim-lspの設定を入れ、各言語用のサーバーを走らせれば良いのでvimrcは少しスッキリしました。

## エンドゲームか？

今までのエディタをまとめてみると↓の用になりました。
この他にもPL/SQLやPowerbuilderというパッケージの言語？ Excel VBA などの開発も行っていましたがもはや何を使っていたか覚えていません。

|    | Name               | Plugin / (Remarks)    | Language              | OS                        | Type        |
|----|--------------------|-----------------------|-----------------------|---------------------------|-------------|
| 1  | メモ帳             |                       | HTML, CSS, JavaScript | Windows                   | Text Editor |
| 2  | Dreamweaver        |                       | HTML, CSS, JavaScript | Windows                   | Text Editor |
| 3  | Eclipse            |                       | Java                  | Windows                   | IDE         |
| 4  | NetBeans           |                       | Java                  | Windows                   | IDE         |
| 5  | RDE                |                       | Ruby                  | Windows                   | IDE         |
| 6  | Flash Builder ?    |                       | ActionScript          | Windows                   | IDE ?       |
| 7  | Processing ?       |                       | Processing            | Windows                   | IDE ?       |
| 8  | Arduino ?          |                       | Arduino ?             | Windows                   | IDE ?       |
| 9  | Eclipse            | ADT Plugin            | Java (Android)        | Windows                   | IDE         |
| 10 | Eclipse            |                       | PHP                   | Windows                   | IDE         |
| 11 | Eclipse            | PyDev                 | Python                | Mac OS X                  | IDE         |
| 12 | Aptana Studio      | PyDev                 | Python                | Mac OS X                  | IDE         |
| 13 | Eclipse            | Lua Development Tools | Lua                   | Mac OS X                  | IDE         |
| 14 | Emacs              | (挫折)                | いろいろ              | Mac OS X                  | Text Editor |
| 15 | LiteIDE            |                       | Go                    | Mac OS X                  | IDE         |
| 16 | RStudio            |                       | R                     | Mac OS X                  | IDE         |
| 17 | Gogland            | (Goland ではなく)     | Go                    | Mac OS X                  | IDE         |
| 18 | Vim                | jedi-vim, vim-go など | いろいろ              | Mac OS X                  | Text Editor |
| 19 | Android Studio     |                       | Kotlin (Android)      | Mac OS X                  | IDE         |
| 20 | PyCharm            |                       | Python                | Mac OS X, Ubuntu, Windows | IDE         |
| 21 | Atom               | (迷走)                | Python                | Mac OS X, Ubuntu, Windows | Text Editor |
| 22 | Visual Studio Code | (迷走)                | Python                | Mac OS X, Ubuntu, Windows | Text Editor |
| 23 | Vim                | vim-lsp               | いろいろ              | Mac OS X, Ubuntu, Windows | Text Editor |

いろいろ使ってきた中でそれぞれにいいところや不満があったのですが、今の所VimとLSPの組み合わせではストレスになるような不満はありません。もう少し手に馴染むような設定はできると思いますが、もしかしたらエディタ探しは一旦エンドゲームと言えるのかもしれません。

## 余談

いろいろ書きましたが、僕はIDE推奨派で、特にプログラミング初学者にはIDEが良いと考えています。理由は設定が楽だし、マウスも使えるのでプログラミング以外のことに時間を使うことが無いためです。すごい人の中には簡素なエディタを使っている人もいますしIDEを使っている人もいます。高価なキーボードじゃないと開発できない人もいるしMacの薄いキーボードで十分な人もいます。道具にこだわるかこだわらないかはスキルと相関がないと思っています。自分の使いやすい道具を使えばいいので、VimでなければとかEmacsでなければ…というのは気にしなくてもいいと思います。もちろんかっこいいからVimを使うというのは良いと思います。