m13o

2023-11-16 Thu 22:41
iSH SHELLを使ってEmacsをiPhone14Proで使えるようにするiOS Emacs

諸事情により、あまりPCの前に座って作業をする時間を取りにくくなったので、軽く文章を認めたりコードを読んだりするために、iPhoneからiSH SHELL経由でEmacsを扱えるようにしました。

App StoreからiSH SHELLをインストールして起動したら、まずはパッケージの設定をします。

echo "https://dl-cdn.alpinelinux.org/alpine/v3.18/main/" > /etc/apk/repositories
echo "https://dl-cdn.alpinelinux.org/alpine/v3.18/community/" >> /etc/apk/repositories

rm -rf /ish

apk update
apk upgrade

この記事を書いている時点ではv3.19のリポジトリも用意されつつありますが、v3.18の方が物が揃っているので、そちらのバージョンを利用します。また、/ishディレクトリ(またはその中にあるファイル郡)を削除しないと、起動する度にapkのパッケージリポジトリの情報が初期化されてしまうので、削除します。

sudoがインストールされていないので、sudoをインストールします。

apk add sudo

iSH SHELLをデフォルトで利用するとユーザーはrootになり、少々気持ち悪いので、ユーザーを作ります。

adduser [ユーザー名]

このユーザーでsudoできるようにwheelグループに追加し、visudoでsudoersを修正します。

addgroup [ユーザー名] wheel
visudo

wheelグループのコメントアウトを外してwheelでsudoできるようにします。なお、パスワードレスでsudoさせたい場合は、NOPASSWDの方をコメントアウトします。

## Uncomment to allow members of group wheel to execute any command
- # %wheel ALL=(ALL:ALL) ALL
+ %wheel ALL=(ALL:ALL) ALL

## Same thing without a password
# %wheel ALL=(ALL:ALL) NOPASSWD: ALL

ソフトウェアキーボード上の歯車アイコンとiキーを同時に5秒押し続け、SECRET ADVANCED DEBUGGING OPTIONSを開き、rootユーザーで起動するようになっている箇所を作成したユーザーで起動するように変更します。

- Launch cmd /bin/login -f root
+ Launch cmd /bin/login -f [ユーザー名]
Boot cmd /sbin/init

suでユーザーを切り替えてもいいのですが、想定通りに起動するかの確認も含めてアプリを再起動します。

ここからは、作成したユーザーでの作業です。

必要なパッケージをインストールします。ユーザーがrootではないので、sudoを付けてapk addします。

sudo apk add --update-cache openssh coreutils git python3 emacs

例にもれず.emacs.dやinit.elの元となるorg文書をdotfilesとしてgithub上で管理しているので、githubからcloneするためにsshのkeyを作成します。

ssh-keygen -t ed25519

生成されたパブリックキーをgithubに登録して、リポジトリをcloneします。

git clone [email protected]:[githubユーザー名]/[リポジトリ名]

cloneしたら適当にシンボリックリンクを作って.emacs.dやら、init.elを適切に参照できるようにして、emacsを起動します。なお、v3.18のapkリポジトリにあるGNU Emacsのバージョンは28.2です。

emacs

これでうまく起動すればいいのですが、init.elの構成によってはうまく起動しないので、適宜init.elを修正します。

私の場合は、スクロールバー、shell-file-name、battery.elの設定を記述している箇所でエラーが発生しました。

-  (set-scroll-bar-mode nil)
+  (when window-system
+    (set-scroll-bar-mode nil))


   (setq-default shell-file-name (or (executable-find "zsh")
                                     (executable-find "bash")
+                                    (executable-find "ash")
                                     (executable-find "pwsh")
                                     (error "cannot found shell command.")))
 (when (require 'battery nil t)
-    (if (not (string-match-p "N/A" (battery-format "%B " (funcall battery-status-function))))
+    (if (and (functionp battery-status-function)
+             (not (string-match-p "N/A" (battery-format "%B " (funcall battery-status-function)))))
        (display-battery-mode t)))

とりあえず、これでEmacsが起動するようにはなりました。

iSH SHELL上で動くターミナルのEmacsは、ベースがx86のエミュレーションという事もあり、Emacsの起動時間や大きめのファイルを開く時の動作速度が20年前に使っていた時と同じくらい遅く、大変懐しい気持ちになりました。