僕が初めてソースコードというものを触ったのは小学生か中学生の時でした。それから現在までプライベートでコードを書いたり、仕事をしたりという中でこ使用しているエディタは変化してきました。今まではあまり「これだ」というものに巡り会えていなかったのですが、Language Server Protocol (以下LSP) の出現により、最近ようやく手に馴染むエディタが定まりつつあります。そこでエディタ遍歴を振り返りつつLSPについても少し触れたいと思います。
初めてのコード
僕が初めてコードを書いたのは、初心者向けのパソコン雑誌の後ろの方に書かれていた"ホームページ"作成入門の記事でした。そこにはWindowsのメモ帳を開き、何やら英語っぽいものを記述して .htm
という名前をつけて保存するということが書かれていました。ちなみにその時のソースコートはこんな感じだったと思います。今では見ることのないタグが並んでいますが、人によっては懐かしいのではないでしょうか。
<html><head><title>ようこそ!</title></head><bodybgcolor="pink"><center><fontsize="7">ようこそ!</font><br><br><marquee>ここは<fontcolor="darkgreen"><b>〇〇〇〇</b></font>のホームページです!
</marquee><br><br><i>メニュー</i><tableborder="5"style="text-align: center;"><tr><td><ahref="#">日記</a></td><tdrowspan="4"><imgsrc=""alt="トップ画像"width="150px"height="150px"></td></tr><tr><td><ahref="#">イラスト</a></td></tr><tr><td><s>掲示板</s> (工事中)</td></tr><tr><td><ahref="#">リンク集</a></td></tr></table><br><br><hr><small>Copyright © 20xx ○○○○ All Rights Reserved.</small></center></body></html>
初めて書いたソースコードであったと同時に、僕が初めてテキストエディタに触れたときでした。ただのメモ帳に書かれた文字の羅列がホームページになったという体験が、プログラミングの仕事に就こうと思った最初のきっかけです。実際に動くコードはこちら。懐かしいですね。
空白期間
中学生くらいでソースコードを書くことを覚えましたが、高校に入ると部活が忙しく、大学でも文系に進学したのでほとんどソースコードを触ることがありませんでした。少しだけJavaScriptを書くのにDreamweaverは触りましたが、なにか書くときは主にメモ帳で書いていたのでシンタックスハイライトのあるエディタは逆に使いにくかった記憶があります。
IDE入門
新卒で入った会社の新人研修でJavaを学ぶときに初めてIDEであるEclipseを触りました。そこでIDEによる開発を知り、しばらくはIDEを使っていました。この頃はIDEが便利というよりはIDEが必須だと考えていました。
IDEでの開発
ゲーム会社でPythonを書くようになりますが、IDEに慣れていたためEclipseにPyDevプラグインを入れて開発していました。新しいMacを使い始めたのをきっかけに、ここ最近はPyCharmを使っていました。PythonのようなLLでもIDEを使っている理由は、最初の設定が楽だからです。とくにPyCharmのように言語に特化したIDEでは、自動補完やメソッド定義へのジャンプなど、特に設定せずに使えます。
Vim入門
開発はIDEですが、ちょっとしたテキストの編集はテキストエディタを使用していました。Windowsではメモ帳、MacではCotEditorを使っていました。それが一番慣れているキーバインドを使用できたからです。
そのうち少しだけVimも触るようになりました。はじめは git commit
のときはデフォルトでVimが起動するので仕方なく使っていた程度でした。前職のCTOの下で働いているときに、彼がVimを便利そうに使っていて、その憧れもありMarkdownやYamlなどちょっとしたファイルの編集や、ちょっとPythonの修正するときにVimを使うようになりました。
途中、Emacsも経由しましたが常用エディタにするのは挫折しました。でもMacを使う上ではEmacsのキーバインドは練習してよかったと思ってます。
Vimでの開発
IDEでの開発は便利なのですが、ちょっとコードを書きたいだけなのにわざわざプロジェクトを作らなければいけなかったり、違う言語を書くときにそのためのIDEをインストールしたりというのが面倒になってきました。
ただ、Vimでの開発も、言語に合わせてプラグインを探してvimrcに変更を加えて…というのが必要でした。特にPythonを書くときには pythonbrew
virtualenv
pyenv
venv
などで仮想環境を作ることが多いし、Python2とPython3の違いによって動かないプラグインがあったりと、一つ一つ解決するのも面倒でした。とくにWindowsも使い始めて、Windows Subsystem for Linux を使っていると特に設定が面倒でした。
迷走
Vimのキーバインドに慣れて、手に馴染んでいたのですが、Pythonを書くときに色々設定が面倒だったのでPyCharmにVimキーバインドのプラグインを入れて開発していました。そこから手に馴染み、設定の楽なエディタを探してAtomや Visual Studio Code なども触りましたが、結局 PyCharm + Vimプラグイン を使っていました。
Language Server Protocol との出会い
VimConf2018に参加したときに Language Server Protocol (以下LSP) という言葉を知りました。
Language Server Protocol とは
あまり詳しくはないので詳細についてはその他の記事に譲ります。IDEでは定義ジャンプ・自動補完・エラー分析…などの機能を提供していると思いますが、各言語に合わせてプラグインを作成するなど、IDE側が対応する必要があります。LSPは簡単に言うと、言語側がサーバーを起動し、共通のプロトコルを提供することでIDEと同様の機能を実現する仕組みです(…と理解しています)。LSPのない世界で完全に言語対応しようとすると、エディタや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に移行した話」を参考にしました。
Language Server 導入
LSPを利用するためにその言語用の Language Server をインストールします。現在対応しているのはこちら。
https://microsoft.github.io/language-server-protocol/implementors/servers/
Pythonの場合はpipでインストールできます
pip install python-language-server
これで pyls
というサーバーが実行できるようになるので、vim-lspを使ってPythonによる開発をする準備ができました。なお、 venv
や pyenv-virtualenv
、グローバルなPython環境で試してみましたが今の所それぞれの環境で問題なく動いています。
動き
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を使うというのは良いと思います。