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



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

# jed について

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

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

Jack Palevich 氏が作成、公開されている、Android Terminal Emulator (⇒GooglePlay[*1](https://play.google.com/store/apps/details?id=jackpal.androidterm)) という端末ソフトをインストールします。

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

http://kevinboone.net/kbox2.html   <---もはやリンク切れしています。今だとkboxを使うメリットはないので、Termuxとかに移行してください・・・身も蓋もありませんが・・・

Termux 参考リンク：[DockerでTermuxのパッケージビルドを試す](https://qiita.com/iruka/items/8b7a50880139b60012cf)

（結局この記事は、jed+slangを野良ビルドするにはどうしたらいいか、というだけの記事になってしまってます。
　Termux上でのjedのビルド方法に関しては、そのうち記事を書きたいと思っています。）

# 注意事項とか

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

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

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

物理キーボードが使えない時の妥協案としては、
Klaus Weidner 氏の Hacker's Keyboard (⇒GooglePlay[*3](https://play.google.com/store/apps/details?id=org.pocketworkstation.pckeyboard) ) というソフトキーボードがお勧めです。
タブキーやコントロールキーをタッチ入力することが出来ます。

# 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辺りの最後に追記でＯＫです。

    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

を実行するか、上記１行を /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を試せます。

[[続きを読む・・・]](http://qiita.com/iruka/items/5bcc36aa07518f099b5e)


----

# 2017年11月時点での追記：

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

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

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

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