verilog書く人

自称ASIC設計者です。どなたかkaggle一緒に出ましょう。

自作している競技プログラミング用IDE for Rust進捗

大分動作は安定してきたので、もうAtomはやめてこちらに移りました。

ファイアーエムブレム由来でrujaionという名前にしました(暫定)

 

github.com

 

 

なぜIDEを自分で作ったのか?


私はEmacs, VimよりもIDE派である(一時期Emacs使っていたが、もうあのキーバインドは忘れたい。)。

AtomVisual Studioといった名高いIDEはあるものの、競技プログラミング用ではない。


具体的には競技プログラミングに特有の機能がない。
そして競技プログラミング中は不要な機能が多い、右クリックメニューも多い。

また、AtomVSCodeのRustプラグインはcargoでのビルドが前提になっているが、競技プログラミングでは単ファイルのみのビルドが多いため、rustcでビルドしたい。

 

世にIDEは多数あれど、競技プログラミングに特化した開発環境はあまりないんじゃないかと思う。

というわけでより競技プログラミング中のプログラミングフローにマッチしたものを望むようになった。

 

プログラマブルIDEという言い回しがあるが、自作したIDEこそ真にプログラマブルである。
Emacslispを書ければ十分プログラマブルだと思うけど、私はそんな高尚な言語は使えない。
Pythonで開発環境をガリガリこしらえたい。というのが作ったきっかけである。


競技プログラミング特有の機能とは

online-judge-tools連携

GUIでコンテストで与えられている入力、出力をダウンロードし、プログラムをテストし、提出することができる。
また、コンテストで与えられている入力を受けながらプログラムをブレークし、ステップ実行してデバッグすることも可能である。
この3つの機能はコンテスト中によく使う重要な機能なので、一等地にボタンとして置いている。(キーバインドも割り当てている。)

 

f:id:segafreder:20190211233021p:plain

また、テスト結果は、

f:id:segafreder:20190211232924p:plain

↑このように画面の遷移なくコンソールでテスト結果を確認できる。

逆に普通のIDEでよく使われるであろう、RunとかDebugはProgramメニューで辿らないとできません。


コンテスト中使わない機能は極力目立つ場所に置かないことで、迷いをなくしていくという考え方です。

New Fileでテンプレートを呼ぶ。

f:id:segafreder:20190211233153p:plain

競技プログラミング中は本当のフルスクラッチで書き始めることはなく、毎度テンプレから書き出すはずである。
だから、New Fileは空ではなく、テンプレがペーストされた状態で始める。

 

セーブする度、rustfmt

競技プログラミング中といえど、インデント幅やスペーシングは気になる、以前は手で直していたが、rustfmtに任せることにした。
これにより、スペースを打たず、formatter任せでガンガンコードをかけるようになった。

REPL(ecvxr)

競技プログラミングに限らないが、REPLは開発を高速化する上で有効である。
あれ?これ打ったらどうなるんだっけ?みたいなのをさっと試せる。
Pythonだったら、IDLEのコンソールがあるが、RustにはREPLがない。
と思いきやecvxrなるものがあった。

f:id:segafreder:20190211235321p:plain

このように、console上でRustで書かれた文を打つと、評価値が出力される。letで変数を定義して使うことも可能。

その他


また、普通のIDEとしての機能もサポートしている
- シンタックスハイライト
- 定義ジャンプ
- ファイル内検索、置換

 

使い方

まず、rustはnightlyを入れてracer, rustfmt, evcxrをインストールする。

cargo install racer rustfmt evcxr_repl

 

Qtは公式からインストーラを落としてインストールする。

あとは、rujaionをインストールする。

$ git clone https://github.com/fukatani/rujaion.git
$ cd rujaion
$ python3 setup.py install

 でインストールされる。

$ rujaion_main.py

で起動できる。

今後作りたい所

テスト


現在全く存在しない、pytest-qtなるものを見つけたのでこれでこしらえたい。


LSP (Language Server Protocol)のサポート


シンタックスハイライトのメンテが面倒なので、RLSが提供している機能を使いたい。


スキャナ部の自動生成


これは現在atcoder-toolsにPR入れているので(そしてマージされました)、通ったら連携を検討します。

 

データ構造の表示

 

DPテーブルがステップ実行の度に更新されるとか、木構造の表示とかそういうのもやりたい。

 

他言語対応

C++デバッグのバックエンドがGDBでほぼ共通化できるのでやりたいという思いがある。LSPサポートしてれば楽にできたんですが、、

 

キーバインド設定など

正直そこまで手が回る気がしません。VimとかEmacsとか言い出したらキリがない。 

凄腕コントリビュータ待ちです。

 

コントリビューションウェルカムです。