自作言語用に簡単なエディタを作る
いきなりタイトル違うことを書きますが、自作言語の JavaScript への変換もできました。プロパティやインデクサを関数に変換しないといけないなど、いくらか厄介なこともありましたが、とりあえずできました。あんまりデバッグしてないので、バグはあるでしょう。
できたのものは、こちらです。グローバル関数は、グローバルに変換するようにしたのですが、名前がぶつかったりするので、C# でやったときのように、なにかのオブジェクトのメンバにしたほうが良いかもしれません。また、名前空間もないので、真面目にこの方針でやるのであれば、その他の関数名にかぶらないように注意が必要そうですが、とりあえずのところ、事足りそうですので、コード変換や言語の実装は、このあたりで一旦終了します。
簡易エディタをつくる
さて、言語はできたのですが、テキストエディタで書くのは大変ですので、簡単なエディタを作ろうと思います。方針としては、以下の 2 つが考えられます。
ちなみに、最終的には 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" を適当に編集し、指定したファイル名のファイルを作成します。
エントリポイント(main.js)には、ウィンドウを作って表示するコードを書きます。表示内容には HTML が指定できます。テストでは、同じディレクトリに 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 でのファイル操作などをやってみようと思います。