自作言語用に簡単なエディタを作る


いきなりタイトル違うことを書きますが、自作言語の JavaScript への変換もできました。プロパティやインデクサを関数に変換しないといけないなど、いくらか厄介なこともありましたが、とりあえずできました。あんまりデバッグしてないので、バグはあるでしょう。

できたのものは、こちらです。グローバル関数は、グローバルに変換するようにしたのですが、名前がぶつかったりするので、C# でやったときのように、なにかのオブジェクトのメンバにしたほうが良いかもしれません。また、名前空間もないので、真面目にこの方針でやるのであれば、その他の関数名にかぶらないように注意が必要そうですが、とりあえずのところ、事足りそうですので、コード変換や言語の実装は、このあたりで一旦終了します。

簡易エディタをつくる

さて、言語はできたのですが、テキストエディタで書くのは大変ですので、簡単なエディタを作ろうと思います。方針としては、以下の 2 つが考えられます。

  • CodeMirror を使って、Electron で作る
    • ○ シンタックスハイライトは簡単
    • ○ コード補完も、そこそこ簡単そう
    • ☓ ファイルの読み書き周りや、ウィンドウシステムを最初から作らないといけない
  • Visual Studio Code の Extension を作る
    • ○ シンタックスハイライトだけなら簡単そう
    • ☓ コード補完をつくるなら、言語サーバーを実装しないといけなさそう
    • ○ ファイル管理やウィンドウシステムは良いものが使える

ちなみに、最終的には Visual Studio Code やりたいです。しかしながら、言語サーバーづくりはなかなか大変そうです。一方の CodeMirror は、Visual Studio Code には快適性で劣るものの、実装は言語サーバーを作るよりは簡単そうです。Electron を覚えたかったこともありますし、CodeMirror + Electron でやってみようかと思います。

CodeMirror のキーマップをいじる

Electron の前に、(自分にとって)若干使いづらい CodeMirror のキーマップを直します。主に以下の機能がほしいです。

  • Shift+Tab でインデントを戻す
  • Ctrl+E Ctrl+C でコメント

調べてみたところ、キーマップを sublime にするのが一番近そうでした。そこで、sublime のキーマップを当て、key/sublime.js の keyMap.pcSublime をちょっといじりました。これで、なかなか快適なエディタになりそうです。

SimpleMode でシンタックスハイライトだけ作る

とりあえず、コメントとキーワードだけハイライトしてくれれば良いので、そこだけ Simple Mode を使って作りました。

型名は別の色とかにしたいのですが、とりあえずはこのままにしておきます。(多分、regex にグローバル変数か何かを当てれば良さそうです)

このモードを設定すると、コメントのショートカットキーもちゃんと効きました。これで十分そうです。

Electron をやってみる

この辺りは、そのうち記事にまとめようと思いますが、メモとして。色々と記事は見つかりましたが、読みやすかったこちらこちらの記事を参考にしました。

まずは、Node.js と npm を最新版にしておきます。Windows の場合は、インストーラを落としてくるのが早いようです。そのあと、npm コマンドで npm を最新版にします。

次に、Electron のインストールです。こちらも npm から

で、インストール完了です。

テストアプリを作ってみる

ウィンドウを表示して、Hello World を表示するアプリを作ってみます。

適当なフォルダを作って、そこへディレクトリを移動し、以下のコマンドで初期化します。

ディレクトリ下に package.json が作成されますので、エントリポイントとなる "main" を適当に編集し、指定したファイル名のファイルを作成します。

コード1: package.json

エントリポイント(main.js)には、ウィンドウを作って表示するコードを書きます。表示内容には HTML が指定できます。テストでは、同じディレクトリに test.html を作り、それを指定します。

コード2: main.js
コード3: test.html

あとは、electron コマンドで実行できます。作業ディレクトリに移動して、以下のコマンドで起動します。

配布の形式を作ってみる

作ったアプリを配布する場合は、asar というツールでアーカイビングし、こちらから Electron を落としてきて、一緒に配布すればよいようです。配布時に起動するアプリ名やアイコンを変更したい場合は、Electron の起動プログラムを編集します(例えば、Windows では、electron.exe の名前を変えて、アイコンはリソースエディタでイジれとのことでした)。

asar のインストールと利用方法は以下のとおりです。

出力ファイル名前は app.asar にします。また、出力先はアプリのディレクトリ外になるようにします。

アーカイブした asar ファイルを、落としてきた Electron の resources フォルダ下におき、electron.exe を起動すればアプリが立ち上がります。(ファイル名が app.asar でないと起動しないので注意です。)

そのほか、electron-packager など、パッケージング用のツールもあるようです。そのうち、試してみようと思います。

Visual Studio Code でデバッグ

こちらの記事を参考にしました。メインプロセスのデバッグは node のデバッグ設定で、レンダープロセスは Chrome のデバッグ設定でできます。

メインプロセスのデバッグ設定

デバッグから node.js の構成を選択し、実行プログラムの設定を行います。electron の場所を

where electron
で調べ、その実行パスを runtimeExcutable に設定します。

この設定で、メインプロセスのブレークポイント設置などが動きます。

レンダープロセスのデバッグ設定

Visual Studio Code に Chrome 用のデバッグエクステンションを導入しておき、デバッグ構成から「Chrome launch」を追加します。そして、runtimeExcutable と引数の設定を行います。

レンダープロセスでのデバッグでは以下のような注意点があります。

  • 起動直後に走るような箇所のブレークポイントにはヒットしない(Chrome でデバッグする場合と同様)
  • Visual Studio Code 側でデバッグを停止しても、プログラムのほうは終了しない

まとめ

エディタ作成の下準備を諸々行いました。次は、Electron でのファイル操作などをやってみようと思います。