Crystalのエディタサポート状況まとめ (著者: Yoshiyuki Tsuchida1)
こんにちは。 @at_grandpa と申します。第2回技術書典に引き続き、今回も参加させていただきます。
早速ですが、みなさん、普段の開発にはどのエディタを使用していますか?この質問自体が宗教論争を生みそうですが、エンジニアにとって重要なツールであるエディタは、日々の生産性を左右する重要な部分でもあります。(恐れずに言いますと)以前私はVimを使っていましたが、最近は Visual Studio Code に移行しました。とはいえまだ、他にも使用したことのないエディタもあるので、今後機会があれば触ってみたいと考えています。
エディタの設定はどのようにしているでしょうか。私がVimから移行した理由の一つに、「設定が複雑になりすぎて管理しづらくなった」というものがあります。.vimrc
がどんどん肥大化し、どこに何の設定が書かれているかがわかりにくく、次第にVimの応答速度も遅くなっていきました(私の管理の問題もあります)。普段はPHPとRubyを書いているのですが、あるときGoを触る機会があり、その際のVimの設定をしていたのですがどうも煩雑です。そこで思い切って「別のエディタに乗り換えてみよう」と思い、Visual Studio Code を触ってみました。Goの拡張機能を探しサクッとinstallしました。それだけの設定で、自分の思ったとおりのコーディングができるようになりました。自動フォーマット、充実したスニペット、リアルタイムなエラー検知、定義位置へのジャンプ、デバッグ、などなど。しっくりくるサポートで、どんどんGoを書くことができました。このときふと思い返してみると、「エディタの設定を変えることで、その言語が好きになっていく」と感じたのです。私はいつの間にかGoが好きになっていました。明らかにこれはエディタ設定のおかげです。とはいえ、「言語そのものを好きになるべき」とのご意見もあるかもしれませんが、私は「書いていて楽しい言語が好き」なので、それにはエディタの影響も大きいなと感じたのでした。みなさんもこういう経験はありませんでしょうか。
今回はCrystalの本ということで「Crystalのエディタサポート状況」について書かせていただきます。私の場合、Crystalはエディタの恩恵を受けずとも好きになった言語ですが、今後Crystalを触る方々に「Crystalって書きにくいな」と思われることがないよう、エディタ周りの情報をご提供できればと思います。
さて、(恐れ多いのですが)今回は勝手に、下記のエディタに限定させていただきました。時間の都合上、他のエディタは難しかったので、追ってブログなどで発信できればと思います。
- Vim
- Emacs
- Atom
- Visual Studio Code
これらについて、以下の項目を見ていきます。
- シンタックスハイライト
- 自動インデント
- スニペット
- 自動フォーマット
- エラー検知
- 定義ジャンプ
- Spec実行
- Macro expand
- デバッグ
これらが揃えばCrystalの開発はスムーズに行えるのではないでしょうか。各項目では、以下の記述で対応/未対応を表します。
記号 | 説明 |
---|---|
◯ | 簡単にエディタ対応可能 |
△ | 対応させるには多少設定が必要 |
× | 対応させるには労力が必要 |
では早速見ていきましょう。なお、個人で調べた程度の知識ですので、「こんなサポートもあるよ」などのご意見がある場合は、 @at_grandpa まで教えていただけますと幸いです。
言わずと知れたエディタです。最近は私の周りでもIDE勢が多くなってきたものの、Vimを使っている方もまだまだ多くいらっしゃいます。VimのCrystalサポートは rhysd/vim-crystalが使いやすかったです。このプラグインを基本とし、デバッグやスニペットなどに必要なプラグインを追加すれば、ほぼ完璧なCrystal環境を構築することができます。さすがvimですね。(プラグイン紹介は一例です。最近だといろいろvim周りも変わってきていて古い情報かもしれません。ご容赦ください。)
項目 | 対応 | 備考 |
---|---|---|
シンタックスハイライト | ◯ | vim-crystal |
自動インデント | ◯ | vim-crystal |
スニペット | △ | 独自定義が必要(neosnippet.vim など) |
自動フォーマット | ◯ | 保存時フォーマット(vim-crystal) |
エラー検知 | ◯ | syntastic |
定義ジャンプ | ◯ | vim-crystal |
Spec実行 | ◯ | vim-crystal |
Macro expand | △ | vimscriptの記述が必要 |
デバッグ | △ | vimgdbというものがあるが情報が古め |
以下、いくつかピックアップして説明します。
今回の取り組みでいろいろエディタを触りましたが、Vimのspec周りの操作が非常に便利でした。rhysd/vim-crystalは、コマンドひとつでspecファイルに飛ぶことができたり、「全spec実行」「カーソル位置のspecを実行」が簡単に行なえます。テストを書きつつ、小規模な修正を繰り返し行なっていくスタイルの方は良いのではないでしょうか。操作感も良かったです。
さすがvimです。viscriptを書けば、カーソル上のmacro展開を確認できるcrystal expand
にも対応できます。下記を.vimrc
に記述すれば、カーソル上のmacro展開を確認できます。
command! -buffer -nargs=0 CrystalExpand echo s:crystal_expand(expand('%'), getpos('.'))
function! s:crystal_expand(file, pos)
echo getcwd()
let l:cmd = printf('crystal tool expand --no-color -c %s:%d:%d %s', a:file, a:pos[1], a:pos[2], a:file)
return system(l:cmd)
endfunction
NeoBundle 'dbakker/vim-projectroot'
nnoremap ce :ProjectRootExe CrystalExpand<Return>
dbakker/vim-projectrootを使用していますので、そちらもインストールしてください。これでmacro上にカーソルを持っていきce
とタイプすると、macro展開後のコードを確認することができます。
こちらも言わずと知れたエディタですね。Vimと双璧をなすエディタとして知られています。公式でも紹介されているのは、dotmilk/emacs-crystal-modeです。
項目 | 対応 | 備考 |
---|---|---|
シンタックスハイライト | ◯ | emacs-crystal-mode |
自動インデント | ◯ | emacs-crystal-mode |
スニペット | △ | 独自定義が必要(yasnippetなど) |
自動フォーマット | ◯ | M-x crystal-format (emacs-crystal-mode) |
エラー検知 | ◯ | |
定義ジャンプ | △ | TAGS生成(crystal-ctagsなど) |
Spec実行 | △ | elispでシェル実行できるので、specを叩く |
Macro expand | △ | elispでシェル実行できるので、expandを叩く |
デバッグ | ◯ | M-x gdb でemacs内からgdbを直接呼べる |
普段Emacsを触っていないので、今回の機会に調べてみたのですが、必要な機能は揃っていて十分サポートしてくれるプラグインです。key-mappingを指定すれば、ガシガシ書いてformatして、syntaxチェックして、、、を繰り返せると思います。ただ、定義ジャンプがtags
頼りになってしまうので、多少設定のハードルは上がります。また、spec実行やexpandもサポートされていないので、elispが書けないとそれらの機能の実現は難しいかもしれません。
Emacsはデフォルトでgdb
の呼び出しがサポートされていました。M-x gdb
の後にバイナリの指定すれば、Emacsのウィンドウ内でgdbを触ることができます。簡単にデバッグしたい方は有用だと思います。
GitHub製エディタです。周りでの使用者も増えてきたように思います。人気のエディタなので有志によってCrystalのライブラリも作成されています。しかし、まだ製作中のものであったり、機能が不十分だったりします。例えば、ide-crystalは、将来実装される予定も含め、機能としては一番充実していますが、現在は修正中であり、実際にダウンロードしても十分に使えません(2017/10/03現在)。これらの現状も含め、今回は「現在のAtomでできるCrystal環境」について書いていきます。
項目 | 対応 | 備考 |
---|---|---|
シンタックスハイライト | ◯ | language-crystal-actual |
自動インデント | ◯ | language-crystal-actual |
スニペット | ◯ | language-crystal-actual |
自動フォーマット | × | (ide-crystalで実装予定) |
エラー検知 | × | (ide-crystalで実装予定) |
定義ジャンプ | × | (ide-crystalで実装予定) |
Spec実行 | × | (ide-crystalで実装予定) |
Macro expand | × | |
デバッグ | ◯ | dbg-gdbなど |
冒頭でも述べましたが、ide-crystalは現在開発中です。このパッケージはcrystal-lang-toolsという公式のOrganizerが開発を進めています。公式READMEを見ても機能的には充実しており、今後の公開が期待されています。
ide-crystalが使えない現在、どのパッケージが有用かというとlanguage-crystal-actualとなります。こちらはシンタックスハイライトとスニペットのパッケージであるため、フォーマッターや定義ジャンプなどの機能は搭載されていません。
デバッグに関してはgdbのプラグインがあるため(dbg-gdbなど)、そちらを活用すればGUIでデバッグができるでしょう。ただ、後述しますが、gdbは Mac OS X Sierra ではうまく動作しないので注意が必要です。
IDEの中では機能が充実している方だと思います。実際に自分はVSCodeを使用していますが、設定も簡単で機能も十分だと思います。検索すると複数のプラグインが出てきますが、現在最も開発が盛んなプラグインはcrystal-lang-tools/vscode-crystal-langです。このパッケージもCrystal公式のcrystal-lang-toolsによって開発されています。当初は個人開発プロジェクトだったのですが昇格した形です。
項目 | 対応 | 備考 |
---|---|---|
シンタックスハイライト | ◯ | vscode-crystal-lang |
自動インデント | ◯ | vscode-crystal-lang |
スニペット | ◯ | vscode-crystal-lang |
自動フォーマット | ◯ | コマンド実行で可能(vscode-crystal-lang) |
エラー検知 | ◯ | |
定義ジャンプ | ◯ | |
Spec実行 | ✕ | |
Macro expand | ✕ | |
デバッグ | ◯ | code-debugなど |
私が今一番使っているのはVSCodeです。使い勝手としては現状一番良いと思います。VSCodeをインストールしたあとに、VSCode上でCrystalのプラグインを探し、上記のプラグインをインストールするだけです。それだけで、シンタックスハイライト、インデント、スニペット、フォーマッター、エラー検知、定義ジャンプの機能が得られます。サクサクとCrystalのコードが書けますし、気になったら定義へジャンプできます。Crystalのライブラリをshardsでinstallしたときなど、ライブラリの定義を読みに行く手間が圧倒的に減ります。
ただ、spec周りのサポートが欲しいところです。Vimの項目でも書きましたが、全体specの実行とカーソル上のspec実行が欲しいところです。現状だと、VSCode上でシェルを開き、そこでcrystal spec
を実行しています。あと、crystal expand
もあるともっと充実するでしょう。私は、ライブラリを書いている時はmacroを多用するのですが、その時はとても重宝していました。Vim時代は良かったのですが、現状のVSCodeだとなかなか厳しいので、自分で Pull Request を出してみようと考えています。
以上で、各エディタの現状の説明を終わります。ここではcrystalのデバッグについてお話します。Crystalのデバッグにはlldb
やgdb
を使うのが一般的かと思います。しかし、まだCrystal側のでのサポートが十分ではなく、オブジェクトの詳細までは細かく確認することが難しいようです。簡単なプログラムなら可能ですが、複雑化してくると、いくつかの引数の表示がされなかったりします。
また、gdb
がMac OX X Sierra
に完全に対応しているようではなく、Sierra
でのgdbを使用したデバッグでは、変数の情報を取得できませんでした。El Capitan
の場合はgdbで変数情報を取得できることは確認しました。Sierra
でCrystalのデバッグを行うには、VirtualBoxでUbuntuを入れるなどの対応が必要そうです。
駆け足で「Crystalのエディタサポート状況まとめ」について書きましたが、いかがでしたでしょうか。使用したことのないエディタについて調べることは、なかなか大変な部分もありましたが、逆にそれは「今からCrystalを触ろうとする人」の気持ちになって調べられたのかなと思います。
エディタは「その言語を好きになるか」にとって重要なファクターだと考えています。これから広まっていこうとする言語にとっては特に重要でしょう。インストールが簡単で機能が充実していることが大切です。私もCrystalプラグインには恩恵をいただいているので、「もうちょっとこの機能がほしいな」と思う部分については Pull Request を出していこうと思います。好きな言語への貢献は、こういった方法もあるのだと気付かされました。
ぜひみなさんも、自分の好きなエディタでCrystalを好きなだけ書けるように設定してみてください。
Footnotes
-
Twitter: @at_grandpa ↩