有職故実

UbuntuとiPhoneと生活と

2017-07-23

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

f:id:moerrari:20170722200038j:image

ガジェットブログ「ひとりブログ」のエントリ「KING JIM ポメラDM200でEmacs、Vim、Ruby、Pythonが動くなんて素敵すぎる!」の以下のブコメからAndroid上でDebianが動くことを知る。

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

yfujisawa のコメント / はてなブックマーク

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

AndroidでLinux!root化不要でAndroid上にGNU/Linux環境を構築する方法 – OTTAN.XYZ


目次


導入方法

上の記事の通りGoogle Playから「GNURoot Debian」をインストールし、記事の説明の手順を終えた後にemacs24をインストールする。GUI環境が必要なら記事に紹介されているように「XServer XSDL」をインストールする。

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回押ししなければならないのは煩わしいところ。

f:id:moerrari:20170806024302g:image

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

  • Mozcの利用

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

f:id:moerrari:20170806024120g:image

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を使って入力した方が楽かもしれない。

f:id:moerrari:20170806024055g:image

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日となっている。

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

120210

ユニークカウンタ(2011/6/26〜)