emacs-ngとは何?その2
emacs-ngとは何?その1の続き。
emacs-ngをもっとよく見る
https://github.com/emacs-ng/emacs-ng
remacsのforkだと思っていたけど、このコミットを見るに、最新のemacsリポジトリにremacsのコードをパッチとして当てたものの模様
remacsから持ってきたままのコードが多数ある
masterブランチにWebRender機能やnative comp機能が取り込まれているが、configure時これらはデフォルトでオフ
nativecompとwebrenderはconfigure.acファイルでOPTION_DEFAULT_OFFに設定されている
つまり明示的に--with-nativecompとか--with-webrenderとかしないとその機能はビルドされない
逆に、Denoランタイム機能はOPTION_DEFAULT_ON
つまり明示的に--without-javascriptしないとその機能付きでビルドされる
いつの間にかGitHub ActionsによるCIが設定されていた
https://github.com/emacs-ng/emacs-ng/actions?query=workflow%3ACI
ビルドしてみる
docker コンテナ内で、README.mdに書かれていることに従って依存パッケージをダウンロードし、ビルドすることができた
以前ビルドできなかったと書いたが、前回はrequirementのlibclang-devをインストールしてなかった気がする
nativecompはオフなので、ビルドにありえない時間がかかるということはない
rust_src部分のcargoのビルドログが新鮮
試す
いつものごとく、src/emacsでビルドしたEmacsを起動
見た目は特に変わりない
せっかくなのでJavaScriptを評価してみる
eval-js-bufferやeval-ts-bufferなどのコマンドが存在するので、バッファにJavaScriptやTypeScriptを書いて、M-x ...すれば評価できる
スクリーンショット
https://scrapbox.io/files/6018262524d5a5001cfb2ece.png
JavaScriptなどを評価する前に、*scratch*バッファに書かれているようにまずjs-tick-event-loopをタイマーで実行しなければならない(?)
scratch.jsというバッファを作成し、README.mdのコードを参考にしたJavaScriptを書いた
fetchとDeno.readTextFileのPromiseをPromise.allで解決し、得られた文字列をhelloというバッファに書き込むコード(console.logで端末にも出力する)
lisp.でJavaScriptからEmacs Lispの関数を呼べる
M-x eval-js-bufferするとhelloバッファに書き込まれ、console.logにより端末にもプリントされている
Denoランタイムについて
emacs-ngにはDenoランタイムが統合されているので、使えるAPIはもちろんDenoのAPI
https://doc.deno.land/builtin/stable
Denoを触ったことがなかったので、Deno.readTextFileというAPIを見てなんだこれ?!になてり
DenoはNode.jsと違い、IOやネットワークを使用する際には明示的に利用を宣言する必要があるが、emacs-ngではデフォルトで全て許可されている状態なので特別宣言する必要はない
https://github.com/emacs-ng/emacs-ng/blob/1a8275f2e73022a2a1625e6b5e8872ba6190e3e6/rust_src/src/javascript.rs#L292
TypeScriptの評価にはeval-ts-bufferを使うが、JavaScriptの評価に比べて少し時間がかかる
トランスパイルに時間がかかってる?
他リソース
開発者のブログ
https://djddesimone.medium.com/writing-emacs-apps-in-javascript-9feb8c077a50
Getting Started
https://github.com/emacs-ng/emacs-ng/blob/master/getting-started.md
Subreddit
https://www.reddit.com/r/emacsng/