iOS Emacs
iSH SHELLを使ってEmacsをiPhone14Proで使えるようにする諸事情により、あまり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年前に使っていた時と同じくらい遅く、大変懐しい気持ちになりました。