GNU Emacsのfeature/androidを使ってみたい
2022年の大晦日に、Emacs開発者Po Luさんによってfeature/androidブランチが立ち上がりました。
以前からAndroid上で動作するLinuxクローンであるTermuxでEmacsは使っていたんですが、AndroidネイティブなアプリとしてEmacsが使えるとなるとユーザーとしてはとてもありがたい話しです。
このfeature/androidポートですが、既にF-Droidでバイナリが配布されています。ただAndroidの制約上、アプリが別アプリのデータを参照したり実行することはできないらしく、termuxのコマンドやファイルを参照できません(root化した端末であればAndroidのネイティブコマンドを叩けると思います)。これでは松山朋洋さんの良記事、Emacsは死んだで示されている外部コマンドの使用という特性を活かせません。
そんな折、redditのr/emacs経由でTermuxと色々シェア可能(以下面倒くさいので共存可と略)なEmacsの-記事を見つけました。
私はこの記事の手順では実際に共存はできなかったんですが、この記事で入手した情報に触発されて色々と試行して、とりあえず共存可能なバージョンを作れたので紹介します。
前提
-
Androidの開発スキルやEmacs開発スキルは持ち合わせていません(Emacsの野良ビルド経験だけは豊富)ので、その点を踏まえて(ry
-
以下手順では独自に署名を行いますが、同一アプリ別者署名アプリは弾かれる( ´_ゝ`)当然だろ?)ので、ここで作るTermuxと元々インストールされていたTermux(Google Play StoreやF-Droidからインストールしたもの)は共存できず、故にアンインストールして再インストールすることになります (; ・`д・´)ナン…ダト!? …ご利用は計画的に
-
上流を取り込めるようになるべくソース(ビルド用スクリプト類含む)を変えずに主にGithub Actionsのworkflow内で書き換えを行っているので、保安上の不安がある方は上流とのソースのdiffだけではなくworkflowの中も確認してください(foo.ymlを元としたmy_foo.ymlで色々やっています)。
やっている事の概要
自分で色々やってみたところ、共存するためにいくつかの要件を満たす必要があることがわかりました。
-
パッケージ名(javaのclasspath)は共通していること
GNU Emacsはorg.gnu.emacs、Termuxはcom.termux.*なので、org.gnuかcom.termuxのいずれかに統一する必要があります。help-gnu-emacsの回答によると、com.termux.*側をorg.gnu.emacsに寄せる方法が紹介されていますが、termux側のprefixを変えるとpkg installでインストールできるパッケージをリビルドしてアーカイブをローカルなりリモートなりに別建てしなければならないので、今回はTermux側に寄せました。 -
共有ユーザーID(sharedUserID)は共通していること
これもTermux側に寄せてcom.termuxに。 -
署名に使うキーは共通していること
こちらはfeature/androidに含まれるemacs.keystoreを使いました(Google Play StoreやF-Droidのキーが入手できればTermux関連の手順はいらなくなりますが、入手できませんよねえ)。
手順
Emacs
サンプルは https://github.com/ayatakesi/termux-emacs です。
-
レポジトリをfork
本家はsavannahですが、こちらからだとgithubのウェブUI上で上流を取り込めないので、emacs-mirrorのemacsをforkします。 -
feature/androidブランチから自分用のブランチをcut
ローカルにcloneしたらfeature/branchをcheckoutして、そこからmy/feature/androidをcut。 -
patchを当ててワークフロー作成およびソース修整
patch -p1<my_feature_android.patchでpatchを当てる。 -
Github Actionsに書き込み権限を付与
githubのレポジトリのsettingのactionsのgeneralでread and write permissionsを選択。 -
pushすればリリースが作成される筈
Termux
基本的にEmacs側と同じです。サンプルは https://github.com/ayatakesi/ のemacs-compat-termux-app(本体)とemacs-compat-termux-*(プラグイン)です。
- レポジトリをfork
- masterブランチからmy/masterブランチをcut
- patchを当ててワークフロー作成およびソース修整
- Github Actionsに書き込み権限を付与
- pushすればリリースが作成される筈
以上です。