Android Terminal Emulator 改変版

標準的なIMEでは入力しづらい[Esc]や[Ctrl]等のキーをファンクションバーから入力可能です。

ファンクションバーはメニューから表示/非表示を変更可能で、デフォルトでは起動時に自動表示されますが「設定」から変更可能です。

英数確定入力

ほとんどのAndroidのIMEでは予測変換がついていて、コマンド入力では面倒なことになります。

対処として以下の設定で、デフォルトでは英数確定入力で、◇ボタンで「英数確定入力」←→「通常入力」のトグルが行えます。

  • 「設定」→「起動時の入力モード」を「パスワード (Google日本語入力)」
  • 「設定」→「◇ボタン」を「パスワード (Google日本語入力)」

インテント

ファイラーなど外部アプリからのインテントでAndroid Terminal Emulatorを呼び出すことができます。

デフォルトではsh "%s"が設定されていて%sはファイル名に変換され、sh "/path/to/file"が実行されます。

シェルスクリプトを作成して適当なファイラーから実行してみてください。

コマンドは「設定→インテントコマンド」で、シェルから実行可能なコマンドを指定可能です。

これとは別にウィジットでショートカットを作成して任意のコマンド実行をすることもできます。

表示フォント

特に指定しなければ標準フォントで表示されますが、任意のフォントで表示することが出来ます。

瀬戸フォント
青キン明朝

Google Playでも公開されている「Android Terminal Emulator」1.0.59以降は日本語(UTF-8)もさほど問題なく表示されるようになりましたが、日本語処理やIME関係で不便だと思われる部分があるためソースを改変しています。

主な改変部分は以下の通りです。

  • Esc、Ctrl、Tab等の入力キー追加
  • IME予測変換の無効化
  • 表示フォント指定追加
  • ファイルマネージャなど外部アプリからのインテント対応
  • ハードウェアキーボードやエスケープシーケンスによるIME制御
  • 半角カナや □○等のEast Asian Ambiguousな文字幅を日本語向けに変更可能
  • 1.0.54の追加機能によるクラッシュ回避
  • 日本語IMEに対する表示不具合の修正

androidで標準的に使用可能なコマンドは以下のページ等にまとめられていますが、バージョンや機種によって異なる場合があります。

本改変版は致命的なバグの修正とエディタでの日本語編集を想定した日本語処理関係の改変/追加を行ったものです。

android上でunix環境を構築することが目的で、android 5.0以降のデバイスを使用している場合はGooglePlayから入手可能な「Termux」を使用する方法もあります。

ダウンロード

(2020-12-28)

(注意)

Google Playの「Android Terminal Emulator」をインストールしている場合は「アプリはインストールされていません」のようなメッセージが出るので、先にアンインストールしてください。

(アンイストールしたくない場合は「TermVim」をインストールして初期コマンドから -vim.appを削除してください)

自分でビルドしたい場合は以下を参照してください

ソース

改変部分について

本改変版では独自機能追加とデフォルト設定変更が行われています。

たとえば入力関係ではIMEの設定が「単語ベース」で問題なく動作するようですが、一部端末の標準IMEのように「単語ベース」ではなく「文字ベース」にしておかないと動作しない場合もあるようなので適切に変更してください。

ファンクションバー

フォントはホームディレクトリ直下のfontsディレクトリにあるものが使用可能です。

ホームディレクトリにfontsディレクトリを作成して、使用したいフォントをコピーしてください。

フォント指定で使用するホームディレクトリはandroid本体のホームディレクトリ(内部ストレージ)で、Android Terminal Emulatorの$HOMEではありません。

ホームディレクトリは/sdcard/mnt/sdcardまたは/storage/emulated/0などでアクセス可能なようですが、使用機種によって異なるので実際のパスは設定メニューのサマリーを参照してください。

ディレクトリ指定

またフォントはターミナルという性質上、かならず等幅フォントを使用する必要があります。

システムフォントや等幅フォントでも特定文字やIMEの未確定文字列の表示がおかしくなる場合もありますので、その場合はVLゴシックやIPAフォントに変更してみてください。

VLゴシック

http://vlgothic.dicey.org/

IPAフォント

http://ipafont.ipa.go.jp/

日本語IMEにおける入力中の文字表示

オリジナル版では変換中の状態表示が行われませんが、本改変版では入力中文字の状態表示を追加しています。

基本的にはデフォルトの自動選択で問題ないようですが、ATOKとGoogle日本語入力を明示的に指定することも可能です。

うまく表示されない場合や、その他のIMEの場合は手動で適当なものを選択してください。

自動選択の動作確認はATOK, Google日本語入力, Wnn keyboard labで行っています。

ソフトキーボード

コマンド入力ではソフトキーボードの予測変換があると面倒なことになります。

ATOKかWnn Keyboard labを使用している場合は設定で英字入力のみ確定入力化が可能なので設定することをおすすめします。

Google日本語入力は英字確定入力に設定できませんが、Android 5.0以降では「Googleキーボード」をインストールして英字確定入力に設定して言語切替キー(地球マーク)で適宜切り替える使い方がおすすめです。

なおIME側ではなく本改変版側で英数確定入力化も可能です。

◇キーを「IMEショートカット」に設定して、「設定」の「IMEショートカット」で以下の適切なものを選んでください。

以降は◇キーで「選択した入力タイプ」と「デフォルト入力タイプ」がトグルで切り替わります。

またエスケープシーケンスでソフトキーボード等を制御可能です。

たとえば以下のコマンドを実行するとソフトキーボードのOn/Offが可能です。

echo -n -e "\0033[2t"

以降のコマンドは最後の2tの数値部分を変更してください。

IME表示/非表示エスケープシーケンス

0

1

2

IME非表示

IME表示

IMEのトグル

Altキー

EmacsなどのようにAltキーをMETAキーとして使用する場合、「設定」の「ALTキーでESCを送出する」に設定しないと機能しない場合があります。

コマンドによってはどちらの設定でもAltキーが有効にならない場合もあります。

ハードウェアキーボードの配列

ハードウェアキーボード配列はAndroid 4.1以降で変更可能になりました。

(使用するAndroid端末によっては物理キーボードの設定が変更できないように無効化されている場合があります)

Google日本語入力やWnn keyboard labを使用している場合は日本語キー配列設定ファイルもandroidへ自動追加されるので、ハードウェアキーボードを接続した状態でandroidの「設定」から変更可能です(Google日本語入力はアプリ自体に設定があります)

日本語キーボード用にレイアウトを変更するアプリなどもGooglePlay等で配布されています。

KCM for 日本語106/109キーボード」(ソース)

実はこれらのアプリはレイアウト変更アプリとしては何もしていなくて、アプリにキー配列(kcm)ファイルが含まれていればandroidが自動的にキーボードレイアウトに追加するという仕様になっています。

また本改変版では対処していますが、非日本語IMEを使用していて日本語ハードウェアキーボードの[変換], [無変換]などのキーを押すと意図しない動作が行われることがあります。

気になる場合は[変換], [無変換]をCTRLキーに入れ替えするなどすると良いかもしれません。

個人的には英語配列のまま[変換], [無変換], [Caps Lock]等をCTRLキーに変更しています。

  • apk
    • jpkcm-release.apk
  • ソース
    • jpkcm.zip

アプリのデータ保存領域

Android Terminal Emulator改変版の拡張機能として、初期コマンドに以下が設定されていて環境変数にPATHが登録されます。

export APPBASE=%APPBASE%

export APPFILES=%APPFILES%

export APPEXTFILES=%APPEXTFILES%

内部ストレージアプリ領域 (プライベート領域のroot)

内部ストレージアプリ用ファイル保存領域

内部SDカードアプリ領域

APPEXTFILESは内部ストレージとして他のアプリからもアクセス可能です。

APPEXTFILES以外は、プライベート領域なので他のアプリからアクセスできませんが、パーミッションの変更や実行属性を付加して実行することができます。自分でビルドした実行バイナリなどはAPPFILES以下に適当なディレクトリを作成し、PATHを通して実行してください。

$HOMEに関しては$APPBASE以下に設定するのが良いでしょう。

外部SDカードについては以下を参照してください。

外部SDカード

TMPDIR

初期コマンドでTMPDIRを設定すれば一時ファイルがTMPDIRに作成されます。

一部のプログラムでは設定されていないと動作しないことがあるので、設定しておいた方がよいかもしれません。

export TMPDIR=$HOME

TMPDIRは環境に応じて適切に変更してください($APPBASEまたは$APPFILES以下が無難です)

grep, diff

busyboxのgrepは日本語を含んだりすると動作がおかしくなることがあるのでGNU grepを使用したほうが良いかもしれません。

GNU grep 2.9

android-grep.zip

同様にbusyboxのdiffよりもGNU diffを使用するほうが良いでしょう。

GNU diffutils 3.3

android-diffutils.zip

実行バイナリはPATHの通った適当な場所へコピーしてchmodで実行属性を付加してください。

ただし同名のコマンドがすでに存在することがあるので、フルパスで指定したり、PATHでバイナリのある場所を適切に設定してやらないと使用されないことがあります。

Android Terminal Emulator用に.vimrcで設定

" 実行バイナリを/data/data/jackpal.androidterm/files/binへコピーした場合

let $PATH='/data/data/jackpal.androidterm/files/bin:'.$PATH

バイナリについてはLinux上でNDK toolchainを利用してビルドしました。

「android NDKでCライブラリをクロスコンパイル」

Vimについて

Vimを使いたいだけなら「androidでVim」を参照してみてください。

「TermVim」は本改変版にvim, grep, diffをインストールして、アプリ名を変更しただけのもので、本改変版の代わりに使用することも可能です。

日本語を使用しないなら「busyboxとその他のツール」で紹介しているkboxやTermuxのVimを本改変版から使用可能です。

日本語対応Vimを手動でインストールしたい場合は以下を参照してみてください。

日本語対応android版Vim

busyboxとその他のツール

busyboxはunixの各種コマンドを実行可能にするバイナリでandroid端末に欠けている多くのコマンドを補完することができます。

Android Terminal Emulatorを動作させるだけなら特に必要というわけではないのですが、本来の端末エミュレータアプリとして使用するなら有用です。

android 6.0以降では標準でandroid版busyboxのtoyboxが使用可能です。

rootを取得している場合はbusyboxインストーラが各所で配布されているので特に問題ないと思いますが、非rootの場合は(主にネットワーク関係で)動作しないコマンドもあるので非rootedな環境に対応したbusyboxを使用すると良いかもしれません。

以下に紹介するようにbusybox単体ではなく各種ツールをまとめたパッケージも存在します。

なおコマンドライン系ツールは使用環境(CPU)に応じたバイナリでないと動作しませんし、Android 5.0以降ではPIE(位置独立実行)形式でビルドされている必要があります。

またandroid 7.0以降ではセキュリティの関係で、アプリから他のアプリのプライベート領域へのアクセスが禁止されます。

busyboxインストールスクリプト

  • https://sites.google.com/site/fudist/files/cpbb.zip

非rootのandroid端末へbusyboxをインストールするためのスクリプトで、ARM版はもちろんx86版やMIPS版でも、shellを扱えるほとんどのアプリへbusyboxをインストール可能です。

単なるスクリプトで特定のアプリやCPUに依存していないため環境は選びませんが、使用環境(CPU)に対応したアプリが存在する場合はアプリを使用するほうが手軽です。

個人的にビルドしたandroid用busyboxバイナリは以下にあります。

  • android-busybox.zip (ARM, x86, MIPS)

上記のbusyboxはandroid NDKでビルドしました。

android NDKでbusyboxをビルドする

なおandroid用でないbusyboxのコマンドでwget等を実行した場合は、DNSを引けなくてIPアドレス直打ちでないとアクセス出来ないことがあります。

そのような場合は以下を参照してみてください。

kbox

kboxはbusyboxというよりfakechrootを使って、一般的なLinuxBox環境を実現するためのパッケージです。

kboxには gcc, make, awk, ssh, tmux, gitなどのdebパッケージが用意されていてVimも用意されていますが、kboxのVimでは日本語が通りません。

日本語対応Vimが必要なら「日本語対応android版Vim」のバイナリを使用するなどしてみてください。

Termux

Android 5.0以降専用ですがGooglePlayに非rootでもbusyboxやtmux, ssh, gcc, gitなど主要なunixツールを使用可能なアプリが公開されています。

https://play.google.com/store/apps/details?id=com.termux

簡単な説明と注意点については以下を参照してみてください。

Termux

Termuxのソースは以下で公開されています。

https://github.com/termux

BusyBox Non-Root

https://play.google.com/store/apps/details?id=burrows.apps.busybox

アプリからbusyboxをインストールしてPATHをAndroid Terminal Emulatorに登録すればbusyboxとssh等のコマンドラインツールが動作します。

PATHを通すことが可能なら他の端末エミュレータアプリでも動作します。

また使用環境によってはamコマンドなど一部のビルトインコマンドが使用できなくなるようです。対処としてBusyBox Non-Rootの追加コマンドを呼び出す時のみLD_LIBRARY_PATHを設定するという方法があります。

次のスクリプトを実行すると/data/data/jackpal.androidterm/busybox等のアプリ領域にコマンド呼び出し用スクリプトが作成されるのでPATHを通して使用します。

  • cpburrowsbb

/sdcard/Downloadにcpburrowsbbをダウンロードした場合

$ cd /sdcard/Download
$ sh cpburrowsbb jackpal.androidterm

* 「TermVim」の場合はvim.androidtermに変更

実行したらBusyBox Non-Root用追加PATHの替わりに以下を初期コマンドへ追加します。

export PATH=$PATH:/data/data/jackpal.androidterm/busybox

* 「TermVim」の場合はvim.androidtermに変更

SSHですが、そのままでは設定ファイルを使用するのが面倒なので以下を参照してみてください。

SSH

その他

使用環境に応じたコマンドのandroid用のバイナリがない場合は以下の方法でビルド可能な場合があります。

  • Android NDKでビルド
  • 使用環境に応じたコンパイラでビルド
  • kboxやTermux等でgcc(clang)をインストールしてビルド

SSH

各パッケージにSSHが含まれていることがありますが、以下はsshの簡単な使用方法です。

SSH鍵が/sdcard/.sshid_rsaとして存在していてsshサーバにid_rsa.pubを登録済みである場合は、以下のようにしてサーバにアクセスします。

ssh -i /sdcard/.ssh/id_rsa username@example.com

より簡単にアクセスするためにconfigファイルを利用することができます。

/sdcard/.ssh にconfigファイルを作成してhost設定を追加します。

以下はgithub.comの例です。

Host github
  User git
  HostName github.com
  Port 22
  TCPKeepAlive yes
  IdentityFile /sdcard/.ssh/id_rsa

configには複数ホストを登録可能です

configファイルを作成した場合は以下のように実行可能です。

ssh -F /sdcard/.ssh/config -T github

次にaliasを設定します。

$ alias ssh='ssh -F /sdcard/.ssh/config -T '

以降はssh ホスト名でアクセス可能です。

$ ssh github

android端末でDNSを参照するコマンド

非rootのandroid端末でandroid用でないコマンドを使用すると、DNSが引けないためホスト名ではなくIPでサーバを指定しないと動作しないことがあります。

ツールがうまく動作しない場合は、android NDKでビルドしたバイナリを使用すれば普通に動作します。

使用環境に応じたandroid用のバイナリがない場合は以下の方法でビルド可能な場合があります。

「android NDKでCライブラリをクロスコンパイル」

「android NDKでbusyboxをビルドする」

ただandroid NDKは一部ライブラリやロケールが存在しないなど結構面倒です。

対処としてバイナリを対応させる他にも、コマンドをwrapper経由で実行するという方法があります。

d2iを使用する

ネットワーク関係でandroid用でないバイナリを使用する場合はDNSを使用できないことがあります。

このような時でもドメインをIPアドレスに変換すれば使用可能な場合があります。

この処理を行う汎用のwrapper(変換スクリプト)としてd2iが使用可能です。

pingは通るので、これを利用してドメイン→IPアドレス変換を行うわけです。

  1. まずbusybox(expr, sed)の各コマンドが実行可能なことを確認します。
  2. d2iをPATHの通った場所へ置き、実行属性を付加します。
  3. d2i (DNS wrapperスクリプト)

これでwgetの代わりにd2i wgetを使用すると、ドメイン部分がIPアドレスに変換されてwgetが呼び出されます。

$ d2i wget http://www.google.com
wget http://173.194.117.134

...

同様にandroid用にビルドされていないgit等もラッパーを噛ますことで普通に使用できるようになります。

$ d2i git clone git://github.com/path/to/repo.git
git clone git://192.30.252.129/path/to/repo.git

...

git coreではIP変換を行ってもhttpを扱えない事があります。

http://github.comgit://{IPアドレス}として実行してやれば大抵使用可能なのですが、このhttp://git://も自動変換してやることが可能です。

実はd2iでは利便性のためhttp://ftp.ftp://{IPアドレス}へ置き換えるという処理を行っていますが、同様の処理を付け加えてやれば良いわけです。

具体的にはd2iの該当部分へ以下のように+の行を追加します。

if expr "$ipaddr" : "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" > /dev/null; then
  domain=`echo $domain | sed -e "s-\.-\\\\\.-g"`
  url=`echo $url | sed -e "s-http[s]*://\([^/][^/]*@\)*ftp\.-ftp://\1ftp.-g"`
+  url=`echo $url | sed -e "s-http[s]*://\([^/][^/]*@\)*github\.com-git://\1github.com-g"`
  url=`echo $url | sed -e "s-$domain-$ipaddr-g"`
fi

ソース

本改変版のソースはgitで管理されています。

githubにもアップしてありますので、必要なら利用してください。

「TermVim」はterm-vimブランチでvim flavorを有効にしてビルドしてください。

vim, xxdとgrep, diffについては別途バイナリをビルドする必要があります。

ビルドしたバイナリはlibvim.soなどとしてapkへ組み込んでいますので、該当コミットを参照してください。

既知の問題点