錯誤試行

PCや生活の試行錯誤の成果を報告するブログ

AndroidでEmacsが動くなんて素敵すぎる!(非Root環境)


ガジェットブログの有名サイト「ひとりぶろぐ」に以下のエントリがあった。

そのブコメによると、Android上でDebianが動くという。

KING JIM ポメラDM200でEmacs、Vim、Ruby、Pythonが動くなんて素敵すぎる!

昔の戦友を見ているみたいで胸が熱く、軽量な筐体と質の良いキーボードはうらやましい。しかし実用的にはDebian on Android+bluetoouhキーボードのほうがRAMも多いし快適かな。T699とかなら立ったままコーディングも可能。

2017/07/16 09:14

早速検索してみると、以下の記事が見つかったので真似してみた末にターミナル環境でEmacsが実用的に動くようになったので以下にそのメモ書きを残す。

AndroidでLinux!root化不要でAndroid上にGNU/Linux環境を構築する方法 – OTTAN.XYZ(消滅)
(追記)残念ながらページが消えてしまっていた。またGNURoot Debianは開発終了してしまったらしく、以下のアプリへの移行が案内されていた。後日検証してみたい。

(2017/10/21 追記)
同じくAndroidのターミナルアプリであるTermuxでは記事本文で挙げた日本語フォントの表示不具合が無いのでTermuxの利用をおすすめする(Termuxのリポジトリにmozcパッケージが存在しないのだけが残念だが)。
以下リンク先の記事でTermux上でのEmacs使用方法が紹介されている。
Android上でEmacsをまともに使うには | mhatta's mumbo jumbo
(2017/10/29 さらなる追記:簡単な使用メモとノウハウ)
フォントの拡大縮小はまさかのピンチ動作で可能。
画面左端をスワイプでメニューが出る。メニューでは仮想ターミナルの一覧表示と新たな仮想ターミナルを増やすことができ(キーボードからCtrl-Alt-Cでも可能)、キーボードからCtrl-Alt-Nを押すと次の仮想ターミナルへ移動することができる。
ターミナルのその他のショートカットキーは以下。

ショートカットキー 機能
C-A-P 前の仮想ターミナルへ移動
C-A-数字 指定した番号の仮想ターミナルを開く
C-A-+(プラス) フォントサイズを大きくする
C-A--(マイナス) フォントサイズを小さくする
C-A-M 右クリックメニューのようなものを出す
C-A-F フルスクリーン
C-A-R 現在の仮想ターミナルにセッション名を付ける
C-A-U ターミナルに表示されているURLを抽出してコピーもしくは開く
C-A-→ 仮想ターミナル(セッション)一覧を表示
C-A-← 仮想ターミナル(セッション)一覧を閉じる

現在の仮想ターミナルを閉じるにはC-A-Mからkill processする。
テキストを編集する際に端末からemacsclientするにはemacsでM-x server-startしておいて、別の仮想ターミナルからemacsclientを実行し、C-A-Nでemacsの仮想ターミナルへ移動すればよい。
余談だが、併せてPC-Android間でファイルの同期ができるadb-sync(google/adb-sync)の導入をお勧めしたい。Dropboxなどのクラウドストレージを利用してもよいが、クラウドに上げたくない私的な・内部的なファイルでは使いにくいのと、サイズの大きいファイルでもスピーディーに同期できる点でadb-syncが優れている。adb-syncコマンドはるびきちメルマガ(Emacsの鬼るびきちのココだけの話)より知った。大変便利。



導入方法

上の記事の通りGoogle Playから「GNURoot Debian」をインストールし、記事の説明の手順を終えた後にemacs24をインストールする。GUI環境が必要なら記事に紹介されているように「XServer XSDL」をインストールするが、手元の端末ではGUI環境は動作が重く操作もしにくいため動作確認を行なったのみで詳しい使い勝手は調べていない。
Debianのシステムは/sdcard/GNURoot以下にディレクトリが展開されている模様。

日本語表示

デフォルトだとターミナルで日本語は文字化けして表示されない。このためターミナルからemacs -nwコマンドで起動する端末emacs上でも日本語は文字化けする。これはGNURoot Debianの右上メニュー→設定→「デフォルトでUTF-8」をチェックすればよい。また~/.bashrcに以下を記載しておく。

export LANG="ja_JP.UTF-8"
export LANGUAGE="ja"

第256回 新春特別企画・Android上でUbuntu…ではなくDebianを使う:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

フォント表示

設定メニュー→テキスト→フォントサイズでフォントの大きさを変更できる。Emacsでの入力時に読みやすくするには20ポイントぐらいに設定する。.emacsでフォントを変更しても適用されないようだ。現在のAndroidスマートフォンで一般的な大きさである6インチ弱の端末の場合、ウインドウを分割するなら16ポイントが良い。端末は通常横向きで使用すると思われるが、20ポイントだと上下にウインドウを分割した際に各ウィンドウが2行ぐらいしか表示されない。

日本語入力

ddskkをインストールするとEmacsskkによる日本語入力が可能となるが、漢字変換をしてskk辞書を学習させているとEmacsの終了時にモードラインに「cannot set file date」と出て終了できない(Androidシステム上でのファイルパーミッション設定(変更不能)が原因か)。
仕方が無いのでCtrl+Shift+Nで別ウィンドウを作成しemacsプロセスを強制終了させることで対処する(.skk-jisyoは正常に保存されている模様)。別の端末ウィンドウに移動するごとにAndroidの日本語入力がオンになってしまい、コマンドを入力するには漢字変換キーを2回押ししなければならないのは煩わしいところ。


SKKによる日本語入力の様子。1行目と5行目で漢字変換により画面描画が乱れ入力位置直前の1文字が消えてしまっている。Ctrl-lで画面を再描画することで正しく表示されるが煩わしい。

  • Mozcの利用

以上に挙げたSKK利用による不具合を回避すべく、代替案としてmozcを利用しようとemacs-mozcパッケージをインストールしてみる。C-\でmozcが起動でき快適に入力ができる。


Mozcによる日本語入力の様子。三点リーダ(…)の箇所で画面描画が乱れ三点リーダの直後にアンダースコアが入って見えるが、アンダースコアを消そうとすると実際には三点リーダが削除されてしまう。この他、長い文章を入力した際に長い変換候補の表示によって画面描画の乱れが発生し、カーソル位置と思っている箇所への文字入力や文字削除が位置ずれして反映されてしまうこともあり煩わしい。

ただ予測候補への変更でTabやC-iを押すとカタカナに代わってしまい予測変換ができない。GUI上のEmacsだと正常にTabで選択できたのでコンソールだけダメである模様。色々と試行錯誤したが上手く行かず諦めた。また上記に挙げた予測候補が表示されるときに画面が乱れ、カーソル位置が入力位置と異なる位置に移動したかのように見える不具合については、mozc-popupというmozcの予測候補の表示方法を変更するパッケージがあり、それを利用すると改善するとの情報があった。試行錯誤した内容とmozc-popupの設定については以下の囲みを参照。

  • 試行錯誤

JapaneseEnvironment/Mozc - Debian Wikiによると、mozc-utils-guiからキーバインドを変更できるとのことだがGUI環境でmozc設定ツールを起動してもウィンドウは表示されるものの設定項目の内容が表示されない。
emacs-mozc を動かすための設定(emacs 設定編) - NTEmacs @ ウィキ - アットウィキの「8) (「サーバ準備編」利用の場合) mozc のキーバインドを設定する。」 にて他のOSの設定を~/.mozc ディレクトリにコピーすればよいとされているが、その通り実行しても設定が適用されない。

  • mozc-popupの設定

mozc-popupを入れるためのパッケージシステムの設定はbind-key.el : define-keyを直接書くのは時代遅れ!Emacsの重鎮が行っているスタイリッシュキー割り当て管理術!- るびきち「新生日刊Emacs」の説明を参照。これを設定してmozc-popupを入れてみたが「Tabキーで選択」という候補選択の案内表示はされるもののTabを押してもカタカナになってしまうのは変わらず。しかし画面の乱れは無くなり快適な日本語入力が可能となった。ただ、そもそもAndroidIMEを使えば予測変換は可能なので、場合によってはAndroidIMEを使って入力した方が楽かもしれない。

mozc-popupによる日本語入力の様子。画面描画が乱れることなく入力ができる。

キー入力

  • メタキー(M-)の有効化

メタキー(M-)を有効にするためGNURoot Debianの右上メニュー→設定→「ALTキーでESCを送出」にチェックを入れる。

  • マーク(C-SPC)が利かない問題の対応

マーク(C-SPC:set-mark-command)が効かない問題がある。.emacsのglobal-set-keyで「C-\ 」のように記述してもダメ。以下のリンク先でコメントされているように、ターミナルの種類によってCtrl+スペースおよびアスタリスクの組み合わせがキーコードとして動作しない模様。

If you're running Emacs in a terminal, then C-SPC and C-8 are unlikely to send what you want them to.
windows 8 - Why can't I set mark on emacs? - Stack Overflow

I tried setting set-mark-command to Ctrl-x-g which fixes the problem
emacs Ctrl-SPC default mark key-binding not working · Issue #583 · Microsoft/BashOnWindows · GitHub

対策として、~/.emacsでマーク(C-SPC:set-mark-command)を以下のようにAlt+@の組み合わせに変更したところ動作した(本来ならより近いキーバインドであるAlt-Spaceを使いたかったが、Alt-SpaceはAndroild上でIMEのオン/オフにバインドされているため)。

(global-set-kay [?\M-@] 'set-mark-command)

所感

いつでもどこでも手元のスマホEmacs環境があるのは素晴らしい。
後はunisonによるPCとのファイル同期ができれば完璧だが、unison自体はインストールできるものの、AndroidでRoot権限を取得しないとファイルのパーミッションを変更できないことからunisonでの同期時にエラーが出てしまう(sshでの公開鍵パスフレーズなしログインも~/.sshやauthorized_keysファイルのパーミッションを適切に設定できないためか不可能)*1。unisonの実行時に-ignorelocksオプション(Reference Guide / Preferences - Unison File Synchronizer / User Manual and Reference Guide)を付ければエラーは回避可能だが、編集したファイルの同期に不具合が出る可能性がある以上、実用には不安が残る。Androidがユーザー領域のファイルについては非Root環境でもパーミッションの変更を認めてくれればよいのだが…。
(追記)

何度か試してみたところPC→Androidへの同期は問題無く行なわれるが、逆方向であるAndroid→PCへの同期にてOcamlのバージョンが異なる旨のエラーが表示されて同期できなかった(PCとAndroidでUnisonのバージョンはマイナーバージョン番号まで一致している)。これを解決するにはPC側でAndroidのUnisonのコンパイルに使われたのと同じバージョンのOcamlをビルド・インストールしてUnisonをビルドすることになる(あるいはAndroidをRoot化してPCと同じバージョンのOcamlをビルド・インストールしてUnisonをビルドするか)。既にデスクトップPCでは他のノートPCとのUnison同期を行なっているため、しばらく先の課題としたい。

その他

  • org-modeの見出しを見やすい色にする

デフォルトだとorg-modeでトップレベルの見出しの色が見えにくい。~/.emacsに以下を追記すれば黄色になる。

(custom-theme-set-faces 'user `(org-level-1 ((t (:foreground "yellow")))))

themes - customize colors of level in org-mode - Emacs Stack Exchange

  • 端末へのペースト

ターミナルの画面を長押しするとテキスト編集ダイアログが出てクリップボードの中身を貼り付けられる。

  • GUI環境ではAlt+Tabでの切り替えができない

GUI環境ではAlt+Tabでの切り替えがAndroidのアプリ切り替えに取られてタスク切り替えができず、極小のカーソルを画面タッチで動かしてウィンドウを切り替えしなければならず、複数アプリを切り替えての使用には実用上難点がある。Bluetoothマウスを使用するかホットキーによるタスクスイッチを設定すれば良いのかもしれない。

  • Vysor経由時はCtrlが入力できない

PCからAndroidを操作できるVysorを使用した場合にCtrlが入力できない問題がある。Bluetoothキーボードからなら問題なくCtrlが入力できる。

Google Playで配布されているEmacsアプリ。存在は知っていたがレビューの評価が良くないのと更新が止まったままのようなので試していない。最終アップデートは2012年8月23日となっている。

android debain」で検索するとまずヒットしてくるアプリだが、以下のアプリ説明文の通り、手元の端末のAndroid 6.0には対応していなかった(アプリ制作者が新しいスマートフォンを購入するまではアップデートの予定が無い模様)。

Android 6.0 Marshmallow is not supported!

本家Emacswiki。最初の項目にTermuxが書いてあった。

*1:sshpassコマンドを使うことでパスワード入力を省略することが可能。sshpass -p password unison hoge.prfのように記述する sshコマンドでパスワードをオプションとして入力出来るようにする『sshpass』 | 俺的備忘録 〜なんかいろいろ〜