2025-02-28

Android版のEmacsを試す

Android版のEmacsがリリースされたので初めて使ってみました。

参考資料

apkのダウンロード

端末や使い方によってダウンロードするapkが異なる(今回私が使った端末はPixel7/Android 15なので -29-arm64-v8a を選ぶ)。

Emacsを単体で使う場合:

Emacsと一緒に配布されているtermux-appと連携させる場合:

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上でのコマンドライン。環境毎に適宜読み替えること。
  1. 署名の削除

    zip -d emacs-30.1-29-arm64-v8a.apk "META-INF/*"
    

    (unzipしてからzipしてもよい?)

    (termux-app_v0.118.1+github-debug_arm64-v8a.apkの方は削除しなくてもよい?)

  2. 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
    
  3. 署名

    予め鍵を生成して <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-alisttool-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>") として指定してやるか。

~/fontsディレクトリを表示しているところ(dired-details-rとnerd-icons-dired)
図1: ~/fontsディレクトリを表示しているところ(dired-details-rとnerd-icons-dired)

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との切り替えは画面右下に切り替えボタンが出るのでそれで十分かなと(端末に依って異なるかも)。

おしまい

子フレームで補完候補を表示しているところ(ちなみにこの補完候補はタッチで選択出来ない)
図2: 子フレームで補完候補を表示しているところ(ちなみにこの補完候補はタッチで選択出来ない)

というわけで普段PCで使っているのとほとんど同じ物がAndroid上に現れてしまいました。GUI版のEmacsがそのまま動いているのはすごいですね。設定もPCで使っている物からほとんど変えていません。

後はどうやって使いやすくするか、あるいは慣れるか。

私としては今は軽いノートPCを持っているのでわざわざキーボードを繋げて使うことはあまりないと思います。あくまでタッチ操作で色々出来るようにしたいところ。

とりあえずタッチイベントを調べてみようかな。

作図ツール(少し問題あり)
図3: 作図ツール(少し問題あり)