Android版のEmacsがリリースされたので初めて使ってみました。
参考資料
- リリースを知らせるメール : Android binaries of Emacs 30.1 are available
- SourceForgeのAndroid ports for GNU Emacsプロジェクト
- バイナリ(apk)が置いてある場所(ファイル一覧の下に説明書きがある)
- マニュアルのAndroidについて書かれている場所 : Android (GNU Emacs Manual) (日本語訳)
- termux-app(Termux application)のGitHubページ : termux/termux-app
- 同リリースページ : Releases · termux/termux-app
- Android版のGNU Emacsについて #Termux - Qiita
apkのダウンロード
端末や使い方によってダウンロードするapkが異なる(今回私が使った端末はPixel7/Android 15なので -29-arm64-v8a を選ぶ)。
Emacsを単体で使う場合:
Emacsと一緒に配布されているtermux-appと連携させる場合:
- emacs-30.1-29-arm64-v8a.apk(SourceForge/termux用)
-
termux-app_apt-android-7-release_universal.apk(SourceForge)
(注: 私の環境では termux-setup-storage でエラーが出た。この辺りが原因? [Bug]: termux-setup-storage does not work on Android 14 · Issue #3647)
GitHub版のtermux-appと連携させる場合(再署名が必要):
- emacs-30.1-29-arm64-v8a.apk(SourceForge/termux用)
- termux-app_v0.118.1+github-debug_arm64-v8a.apk(GitHub/termux-app)
上記リンクはこの記事を書いた時点でのものなので、最新の状況はSourceForgeのfilesページ(Emacs)やGitHubのリリースページ(termux-app)を確認すると良い。
再署名
EmacsとTermuxを連携させたいなら(お互いのファイルにアクセスできるようにしたいなら)両者のapkを同じ鍵で署名する必要がある。
Emacsと一緒に配布されているtermux-app(termux-app_apt-android-7-release_universal.apk) を使う場合はすでに同じ鍵で署名されているので再署名は不要。
それ以外から入手したtermux-app(GitHub版の最新版や自分でビルドしたもの)を使う場合は再署名するのが手っ取り早い(正直Android版Emacsのビルドはやりたくないので)。
手順:
- 注1: 既に私のPCに入っていたAndroid Studio(とSDK)を使用。
- 注2: 署名に使う鍵は既に作成済み。
- 注3: 以下はMSYS2のBash上でのコマンドライン。環境毎に適宜読み替えること。
-
署名の削除
zip -d emacs-30.1-29-arm64-v8a.apk "META-INF/*"
(unzipしてからzipしてもよい?)
(termux-app_v0.118.1+github-debug_arm64-v8a.apkの方は削除しなくてもよい?)
-
zipalign
c:/Users/****/AppData/Local/Android/Sdk/build-tools/35.0.1/zipalign.exe -v -p 4 emacs-30.1-29-arm64-v8a.apk emacs-30.1-29-arm64-v8a-aligned.apk c:/Users/****/AppData/Local/Android/Sdk/build-tools/35.0.1/zipalign.exe -v -p 4 termux-app_v0.118.1+github-debug_arm64-v8a.apk termux-app_v0.118.1+github-debug_arm64-v8a-aligned.apk
-
署名
予め鍵を生成して
<keystore-path>
と<key-alias>
の部分に情報を埋めること。export JAVA_HOME="c:/Program Files/Android/Android Studio/jbr" c:/Users/****/AppData/Local/Android/Sdk/build-tools/35.0.1/apksigner.bat sign --ks <keystore-path> --ks-key-alias <key-alias> --out emacs-30.1-29-arm64-v8a-signed.apk emacs-30.1-29-arm64-v8a-aligned.apk c:/Users/****/AppData/Local/Android/Sdk/build-tools/35.0.1/apksigner.bat sign --ks <keystore-path> --ks-key-alias <key-alias> --out termux-app_v0.118.1+github-debug_arm64-v8a-signed.apk termux-app_v0.118.1+github-debug_arm64-v8a-aligned.apk
インストール
既に署名が異なるTermux関連アプリがインストールされている場合は先に全てアンインストールする。もちろん必要に応じてバックアップを取ること。
Android上でダウンロードしたapkをブラウザから直接インストールするか、再署名したのであればPCからadbでインストールするかAndroid上で動くファイル管理ソフト(MiXplorer等)を使ってコピーしてインストールする。先に身元不明のアプリをインストールできるようにする設定が必要かも。
基本的にストアを介さない野良アプリ扱いなので色々警告が出るが自己責任で。気になるなら専用端末に入れた方が良いかもしれない。どちらかと言えばTermuxの方が不安かも。Termuxが使いたくなければネットワーク越しのやりとりは全部url-retrieveで書けば良いと思う。
仮想キーボードのインストール
既に入っていたHacker's Keyboardを使用したが、こういうCtrl+何かのキーが押せるキーボードが無いとつらい。
もしくは物理キーボードを繋げるか。それはそれで配列のカスタマイズがつらい。(追記: 実際に繋げてみたが日本語IMEの起動方法が分からない)
Termuxの設定
pkg update pkg upgrade
SSH越しのGitリポジトリにアクセスするなら:
pkg install openssh pkg install git ssh-keygen -t ed25519 -C "your_name@example.com"
- ~/.ssh/id_ed25519.pub をサーバにセット
- .bashrcに
. source-ssh-agent
と書いておくと良いかも - GitリポジトリからEmacsの設定を取り出したり色々できる
Termuxから /sdcard にアクセスするなら:
termux-setup-storage
Emacsの設定
/sdcardへのアクセス
Emacsから /sdcard にアクセスできないようなら「設定→アプリ→特別なアプリアクセス→Emacs」が必要かも?
もしくは M-x android-request-storage-access ? (何回か入れ直したのでよく分からなくなってる)
Android判定
Emacs LispからAndroid版のEmacsで動いているかを判定するには次の式を使う。
(eq system-type 'android)
この式を使って、普段使っているearly-init.elやinit.elにAndroid専用の設定を追加していく。
環境変数の設定
Termux側のbinへPATHを通す。
(when (eq system-type 'android) ;; Android版 (let ((termux-bin "/data/data/com.termux/files/usr/bin")) (when (file-directory-p termux-bin) ;; 一応アクセスできるか確認する (setenv "PATH" (concat termux-bin ":" (getenv "PATH"))) (push termux-bin exec-path))))
これによって M-x shell から様々なコマンドが使えるようになった。gitも実行できるのでMagitも使えた(やけに遅かったけど)。
ちなみにHOMEの位置は:
- Termux側:
/data/data/com.termux/files/home
- Emacs側:
/data/data/org.gnu.emacs/files
同じ鍵で署名してあれば双方どちらにもアクセスできるはず。
ツールバーの表示
押せるものは何でも欲しい。
default-frame-alist
や tool-bar-mode
でツールバーを消していたので消さないようにした。
メニューバーは元々消さずに使っているが、Androidでは絶対あった方が良いと思う。「Buffers」を押すだけでバッファリストが出る。
default-frame-alist
をいじるついでに left-fringe と right-fringe を大きくしても良いかも。なぜか滅茶苦茶細いので。
modifier-bar-modeなんてのもあるらしい。secondary-tool-bar? え、global-window-tool-bar-mode? 何それ! M-xやC-x、C-x C-、C-cなどがワンボタンで押せると良いんだけど。その辺りは追々。
フォント
~/fonts/
(/data/data/org.gnu.emacs/files/fonts/
) に.ttfファイルを置くとそれを使えるようになる。認識していれば (font-family-list)
の評価結果に現れる。そのフォント名で (set-frame-font "<family-name>-<size>")
とするか、early-init.elあたりで default-frame-alist
に (font . "<family-name>-<size>")
として指定してやるか。

nerd-icons も M-x nerd-icons-install-fonts でこのディレクトリにインストールすれば普通に使える。
ただしSVG内からは参照できない気がする。というかSVGテキストが表示されないような気が。
仮想キーボードの表示
デフォルトだと読み取り専用の場所で仮想キーボードが消えてしまう。Dired等でHacker's Keyboardによる操作ができなくなってしまう。
(when (eq system-type 'android) (setq touch-screen-display-keyboard t))
これでも戻るボタンを押せば消せるのであまり邪魔にはならないと思う。とは言えスクロールして読むだけのバッファなら非表示の方が良いと思うので、モードによって切り替えた方が良いのかもしれない。
通常の日本語IMEとの切り替えは画面右下に切り替えボタンが出るのでそれで十分かなと(端末に依って異なるかも)。
その他の設定
おしまい

というわけで普段PCで使っているのとほとんど同じ物がAndroid上に現れてしまいました。GUI版のEmacsがそのまま動いているのはすごいですね。設定もPCで使っている物からほとんど変えていません。
後はどうやって使いやすくするか、あるいは慣れるか。
私としては今は軽いノートPCを持っているのでわざわざキーボードを繋げて使うことはあまりないと思います。あくまでタッチ操作で色々出来るようにしたいところ。
とりあえずタッチイベントを調べてみようかな。
