Android端末にEmacs風テキストエディタjedを移植する

  • 7
    Like
  • 0
    Comment

Android端末に jed をインストールしたときの備忘録です。

jed について

jedは、Emacsに近い操作性を持つ軽量なテキストエディタです。
Emacsは内側にLispインタープリタを持っていますが、jedでは、S-LangというC言語風のインタープリタを内包していて、キーバインディングや挙動をS-Langで制御することが出来ます。

Android端末でLinuxコマンドライン ツールを動かすための方法

Jack Palevich 氏が作成、公開されている、Android Terminal Emulator (⇒GooglePlay*1) という端末ソフトをインストールします。

また、よく使うLinuxコマンド群(+環境)を入れるためには、いわゆるBusyBoxが必要になりますが、これはKBOX2を使用します。
KBOX2は、root権限のないAndorid端末上で Linuxに近い動作環境を実現します。

http://kevinboone.net/kbox2.html

KBOX2のインストーラーは、Monami-ya LLC, Japan さんが、OneBox パッケージマネージャ(⇒GooglePlay*2 )というアプリを公開されていて、ワンクリックで導入出来ます。

注意事項とか

Android端末にroot権限は必要ありませんが、コマンドライン操作を行うためにキーボードが必須になります。

端末機種によっては、USB接続でPC用のUSBキーボードを接続することが出来ます。
(USB-microBからUSB Aメスに変換するケーブルが必要になります)

あるいは、Bluetooth接続のキーボードを使うこともできます。

物理キーボードが使えない時の妥協案としては、
Klaus Weidner 氏の Hacker's Keyboard (⇒GooglePlay*3 ) というソフトキーボードがお勧めです。
タブキーやコントロールキーをタッチ入力することが出来ます。

KBOX2用バイナリ―の クロスビルド環境の準備

まず、Ubuntu14.04LTSが走るLinux PCもしくはVMWarePlayerインスタンス等を用意します。

Android NDK をインストールします。インストール先は説明単純化の為

/usr/local/ndk/

とします。

NDK内の make-standalone-toolchain.sh を実行して、スタンドアロンなツールチェーンを $HOME/arm/toolchain に作ります。

/usr/local/ndk/build/tools/make-standalone-toolchain.sh --platform=android-19 --toolchain=arm-linux-androideabi-4.6 --install-dir=$HOME/arm/toolchain

ツールチェーンでビルドするための環境変数を設定します。 .bash_profile辺りの最後に追記でOKです。

export NDK_HOME=/usr/local/ndk
export NDK_PREFIX=$HOME/arm/android/libs

export NDK_HOST_ARM=arm-linux-androideabi
export NDK_TOOLCHAIN_ARM=$HOME/arm/toolchain

export PATH=$PATH:$NDK_HOME:$NDK_TOOLCHAIN_ARM/bin

jedとslang2のソースを入手します。

$ cd ~/arm
$ apt-get source jed
$ apt-get source slang2

slang2からビルドします。

$ cd slang2-2.2.4/
$ ./configure --host=$NDK_HOST_ARM --prefix=$NDK_PREFIX/$NDK_HOST_ARM
$ make
$ make install
$ cd ..

インストール先は、$HOME/arm/android/libs/arm-linux-androideabi/ 以下になります。

jedをビルドします。

$ cd jed_0.99.19/
$ ./configure --host=$NDK_HOST_ARM --prefix=$NDK_PREFIX/$NDK_HOST_ARM
$ make
$ make install

同じくインストール先は、$HOME/arm/android/libs/arm-linux-androideabi/ 以下になります。

slang2のビルドで起きる問題と対策

最初に躓くのが、./configure 出来ないことです。
これは autoconf/config.sub を別の新鮮なソースパッケージから取ってきて置き換えます。(vimとか)

HAVE_TERMIOS_H 周りがNDKでは微妙なので、ごにょごにょと手直しします。
(⇒ http://psp.dip.jp/web/upload/jed-ja/diff.sl2.txt )
Android OS はGUIが基本Java実装なので、下層のNDK周りにはlocaleは実装されていません。
なので、locale周りのライブラリ呼び出しを抑止します。

動的リンクライブラリ(libslang2.2.4.so)にするよりもstaticリンクのほうがよい場合は、

$ make static

により、libslang2.aを作って、静的リンクさせます。

jedのビルドで起きる問題と対策

slang2と同様、 autoconf/config.sub を別の新鮮なソースパッケージから取ってきて置き換えます。

環境変数JED_ROOT未定義の時に参照するディレクトリは、

/usr/lib/jed/(のlib/)

になるべきですが、クロスビルドでは、ホストOSのインストール先ディレクトリ名が残ってしまうので、ソースを手直ししてMake変数のJED_ROOTは無視するようにします。
TERMIOS周りも多少の手直しが必要になります。
(⇒ http://psp.dip.jp/web/upload/jed-ja/diff.jed.txt )

実行時、Ctrl+Sを押して検索するときに、require.slが無いというエラーは、
slangのslライブラリからrequire.slが読み込めていないのが原因です。
とりあえず、require.slだけでも、/usr/lib/jed/lib/ 以下にコピーしておくと回避できます。

jed 裏ワザ

KBOX2_shell を使わない状態(chrootする前のAndroid shell) から、jedを起動することが出来るようになりました。

これは、環境変数 JED_ROOT が未定義の場合のデフォルトのjedのディレクトリ:

/usr/lib/jed

が存在しない場合、

/data/data/jackpal.androidterm/kbox2/usr/lib/jed

を代替として参照するようにコードを追加しています。

環境変数 JED_ROOT で明示的に指定する場合はディレクトリ配置は自由です。

jed カスタマイズ

/home/kbox/.jedrc を用意して書きかえします。

雛形ファイルは /etc/jed.rc-sample に置いています。
(Mifes/Vz風味です)

下記の移植済みバイナリに同梱されているslファイルで、tagjumpコマンドを追加してありますので、grepの結果ファイルや、コンパイルエラーのstderr出力などをリダイレクトして、そのままファイルを開くことが出来ます。

移植済 Android(ARM) 版 テキストエディタ jed の入手先

以下のリンク先から入手してください

http://psp.dip.jp/web/upload/jed-ja/jed-android.tgz

日本語を通すには、
$ export LANG=ja_JP.UTF-8

を実行するか、上記1行を /etc/profile に追記しておきます。

上記jed移植と同じ要領で、Linux上のコマンドライン ツールをAndroidに移植できます。

また、下記リンク先には、移植されたgccもありますので、小さなプログラムなら、端末上でビルドすることも一応できるようです。

KBOX2用の他のソフトウェアの入手先

KBOX2: coreutils , ssh , rsync , zsh , perl , gcc , make 等
-http://kevinboone.net/kbox2_downloads.html

KBOX2: libfakechroot.so の新しいバージョン(Android 4.2以上で必須)
-http://kevinboone.net/kbox2_diary.html

日本語対応Vim
-https://sites.google.com/site/fudist/Home/qfixhowm/other-service/howm-android

root取得済端末でLinuxユーザーランドを試したい場合

fakechrootではなく、普通のchrootを使用して、Ubuntu Linuxを試せます。

[続きを読む・・・]


2017年11月時点での追記:

ここまで書いていて、こう言うのもなんですけど・・・。

Android端末にLinux CUI環境が欲しいなら、現時点でお勧めは
GNURoot Debian一択です。(名前が紛らわしくてRoot権限が必要なDebianかと思って敬遠しておりました)

  • Google Playから一発導入出来ます。
  • Root 権限は要りません。
  • apt-getを使用して、好きなソフトを思う存分導入することが出来ます。(自家ビルドは全く不要)
  • CUI/GUIともサポート。

動作原理は proot を使用しているそうです。
お勧めです。