日本語対応android版Vim

android環境でのVimについては次のページにまとめてあります。

単純にVimを使用したいだけなら専用アプリもあるのでアプリを使用する方が簡単です。

androidでVim (+howm)

このページにあるのはandroidのshellで動作するVimのバイナリで、何らかの端末エミュレータ系アプリが必要になります。

ダウンロード

android-vim-bin.zip ver. 8.0 (ARM, x86)

アーカイブに含まれているのはandroid用日本語対応Vimの実行ファイルで、単体でもandroidの標準shell上で動作します。

特定のエミュレータやライブラリに依存していないので、各種端末エミュレータの他にもjuiceSSHvx connectbotのようなsshクライアントでも動作可能です。

(日本語に関しては端末エミュレータ側がUTF-8を扱えないと表示できません)

動作環境 (Android Terminal Emulator)

端末エミュレータ系のアプリであれば動作しますが、以降は最もよく使用されているであろうAndroid Terminal Emulatorを例にして解説します。

端末エミュレータ」(Google Play)

(注意)

オリジナル版の「端末エミュレータ」(Android Terminal Emulator)上のVimで日本語を使用する場合は1.0.54の追加機能により不正終了することがあります。

これはVim固有の問題ではなく日本語を使用しなければ問題ないようですが、 問題がある場合は他の端末エミュレータ系アプリか「端末エミュレータ 改変版」を使用してみてください。

端末エミュレータ 改変版

改変版ではAndroidのクリップボード対応やノーマルモードへ移行した際に英数モードに変更するなどの補助機能も追加されています。

わかる方は以降の手順に従わなくても、使用環境(CPU)に応じたvimバイナリをPATHの通った場所へコピーして実行属性を付加すれば使えるので、後はVIMRUNTIMEやTERMINFO等を適切に設定してください。

動作概要

androidの各アプリにはデータ保存用の領域が用意されていて、このデータ保存領域ではファイルを実行可能なので、ここにVimのバイナリを置いて実行するという形になります。

アプリのデータ保存領域

以降はAndroid Terminal Emulatorの`/data/data/jackpal.androidterm`を使用するとして解説しますので、その他の環境では適宜読み替えてください。

インストール

アーカイブを解凍してできたusr直下のディレクトリをbinにリネームします。

リネームするのは使用環境(CPU)に応じたbin-*です。

リネーム前

usr
├─bin-armeabi
├─bin-armeabi.old
├─bin-x86
├─lib
├─share

CPUがARMでandroid 4.1以降なら`bin-armeabi`を`bin`へリネームして、その他の`bin-*`は削除します。

oldとの違いはPIE(位置独立実行)形式かどうかで、android 5.0以降はPIE形式でないと動作せず、逆にandroid 4.0以前では非pie形式でないと動作しません。(android 4.1-4.4はどちらでも動作します)

リネーム後

usr
├─bin
├─lib
├─share

リネームしたらandroid端末へ`usr`をコピーしますが、以降はリネームしたusrをandroid端末の/sdcard/Downloadへコピーしたものとします。

また、インストール先(`$APPBASE`)はAndroid Terminal Emulatorの`/data/data/jackpal.androidterm`として解説しますが、他のアプリへインストールする場合は適宜読み替えてください。

インストールの実行

Android 4.0以降やbusyboxをインストールしている場合のように、cpコマンドが使用できるならcpコマンドでインストールします。

cd /data/data/jackpal.androidterm
cp -R /sdcard/Download/usr .
cd usr/bin
chmod 755 *

cpが使えない場合はbusyboxをインストールしてください。

busyboxとその他のツール

何らかの理由でbusyboxを使用できない場合は、同梱のスクリプトを使用します。

cpが使えない場合

まず`usr`と同じコピー先(`/sdcard/Download`)へ同梱のスクリプト`android-vim.sh`をコピーします。

次にコピー先に移動してから`android-vim.sh`を実行します。

$ cd /sdcard/Download
$ sh android-vim.sh

Android Terminal Emulator以外にインストールする場合はスクリプト内の$APPBASEを書きかえてください。

初期コマンドに登録

次にAndroid Terminal Emulatorの「設定」→「初期コマンド」へ以下を登録します。

export APPBASE=/data/data/jackpal.androidterm

export UDIR=$APPBASE/usr

export PATH=$PATH:$UDIR/bin

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$UDIR/lib

export VIMRUNTIME=$APPBASE/runtime

export TERMINFO=$UDIR/share/terminfo

export TERM=screen-256color

(TERMを設定しない場合はAndroid Terminal Emulatorの「設定」→「ターミナルタイプ」の設定値が使用されます)

TMPDIRがあれば一時ファイルがTMPDIRに作成されます。

export TMPDIR=$HOME/.tmp

TMPDIRは使用環境に応じた実在するパスを指定してください

登録後Android Terminal Emulatorを再起動して vim と打てばVimが起動しますが、ランタイムライブラリや.vimrc等の設定ファイルが無いのでコピーする必要があります。

ランタイムライブラリとTERMINFO

ランタイムライブラリ

初期コマンドに登録」の設定では以下からシステムのランタイムライブラリを読み込みます。

/data/data/jackpal.androidterm/runtime

上記のディレクトリへランタイムライブラリをコピーしてください。

ファイルが読めればよいので内部ストレージや外部SDカードなどにコピーして$VIMRUNTIMEへPATHを適切に設定してもかまいません。

export VIMRUNTIME=/path/to/runtime

ランタイムライブラリ自体はvimリポジトリの中に/runtimeとして含まれるので抽出するなどしてください。

https://github.com/vim/vim

公式配布されているWindows版Vimのzipから抽出なら、日本語メッセージも同梱されていて最も手軽かもしれません。

https://github.com/vim/vim-win32-installer/releases/

terminfo

初期コマンドに登録」の設定では以下からシステムのランタイムライブラリを読み込みます。

/data/data/jackpal.androidterm/usr/share/terminfo

同梱のterminfoはAndroid Terminal Emulator用に最小限のファイルしか含まれていません。

必要ならLinux等からコピーしてください。

以下のファイルからも入手可能です。

terminfo.zip

.vim .vimrc

最後にホームディレクトリへ .vim .vimrc等の個人設定ファイルをコピーします。

なお$HOMEに直接.vimrcをおいておくとアプリの初期化やアンインストールで消去されるため、筆者はSDカード(/sdcard)上に.vim .vimrcを置いて、そこへシンボリックリンクを張って使用しています。

cd $HOME
ln -s /sdcard/.vim .vim
ln -s /sdcard/.vimrc .vimrc

こうしておくとDropboxなどの同期アプリから同期も行えますし、複数のアプリにVimをインストールしても同じ設定で使用することができます。

その他

あとは使用したいコマンドやツール等も「初期コマンドに登録」で設定した`usr/bin`や`usr/lib`へコピーしておいて、必要に応じてusr以下をusr.tarとして固めてやると環境をそのままバックアップ可能になります。

Android Terminal Emulatorの設定

Android Terminal Emulatorの設定自体は好みで構わないのですが、日本語入力関係などで以下を設定するのをおすすめします。

.vimrc

最低限の日本語対応 vimrcとして以下を設定しておくと良いでしょう。

set nocompatible set enc=utf-8 set fencs=ucs-bom,utf-8,iso-2022-jp,euc-jp,cp932,utf-16le,utf-16,default,latin1

後述しますが、以下も設定しておくと良いかもしれません。

set mouse=a

let $LANG='ja_JP.UTF-8'

ただし「端末エミュレータ」の場合、マウスを有効にするとVim起動中の画面タッチでIMEのOn/Offを行えなくなります。

この場合でもメニューやアクションバーボタン等(改変版のみ)からのOn/Offは可能です。

その他Vimを使用していてcolorschemeで文字色と背景色を変更している場合、Vimの終了後に表示色が戻らないことがあります。

そのような場合は以下を.vimrcに追加すると改善されます。

" 終了時に端末表示色を再設定

au VimLeave * let saved_t_Co=&t_Co|let &t_Co=1|let &t_Co=saved_t_Co

日本語メッセージ

日本語メッセージ表示のためにはシステムランタイムライブラリにlang/ja/LC_MESSAGES/vim.mo が存在する必要があります。

真面目にやるならsrc/po/ja.poからvim.moを生成する必要がありますが、WindowsのVimなどからコピーしてくると楽で良いかもしれません。

日本語メッセージファイル

またandroidのNDKレベルにはロケールが存在しないので.vimrcなどで`$LANG='ja_JP.UTF-8'`など適当に設定してやる必要があります。

" 日本語設定

let $LANG='ja_JP.UTF-8'

grepとdiff

grepとdiffはbusyboxにも含まれています。

ただしbusyboxのgrepでは日本語を扱えない事があったりするのでGNU grepを使用するほうが良いでしょう。

またbusyboxのdiffではVimのdiffとして使用できないので、GNU diffを使用するのをおすすめします。

GNU grep/diffは使用しているCPU用であれば動作します。android用にビルドしたgrepとdiffは以下からも入手可能です。

grep, diff

grepとdiffはvimバイナリと同じ場所など、適当な場所へコピーしてchmodで実行属性を付加してください。

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

Vimの設定

タッチやスワイプによるカーソル移動

.vimrcでマウスが使えるように設定しておくと、端末エミュレータアプリによっては画面にタッチやスワイプでカーソル移動やスクロールが行えます。

" マウス設定

set mouse=a

マッピングされたキーの待ち時間

android上のVimをハードウェアキーボードで使用する場合、コマンド入力でもたつくとciwのようなストローク数の多いコマンドを受け付けないことがあります。

この問題を回避するためにキー完了待ち時間を長くしたほうが良いかもしれません。

" キーコードやマッピングされたキー列が完了するのを待つ時間(ミリ秒)

set timeout timeoutlen=3000 ttimeoutlen=100

詳しくは :help timeoutlenを参照してください。

クリップボードからのペースト

クリップボードからの貼り付けですが、使用している端末エミュレータに「貼り付け」のメニューなどがあれば貼り付け可能です。

なおandroidに限った話ではないのですが、端末上でのテキスト貼り付けでは文字が直接入力されたかのように振る舞います。

このためインデントや改行がズレてしまったりしますが、これは貼り付け前に :set pasteを設定してやると回避可能です。

" ペースト設定有効化

set paste

" ペースト設定無効化

set nopaste

同様に自動補完などの入力補助を使用している場合は、それも切ってやらないと正しく貼り付けされないことがあります。

クリップボードへのヤンク

クリップボードを経由して他のアプリへテキストをコピーしたい場合もあります。

GVimであれば :set clipboardでOSのクリップボードとの連携可能ですが、端末エミュレータ上のVimではそうもいきません。

このような場合は以下のスクリプトで現在選択中のテキストやヤンクバッファのテキストをandroidのクリップボードへコピーすることができます。

" クリップボードへインテントを使用してヤンク(コピー)

nnoremap <silent> gY :AndroidIntentText<CR>

vnoremap <silent> gY y:AndroidIntentText<CR>

command! -nargs=* -bang AndroidIntentText :call AndroidIntentText(<q-args>)

function! AndroidIntentText(text)

let str = a:text != "" ? a:text : @"

let str = iconv(str, &enc, "UTF-8")

let str = escape(str, '`"$\')

let cmd = printf('am start --user 0 -a android.intent.action.SEND -t text/plain --es android.intent.extra.TEXT "%s"', str)

let ret = system(cmd)

endfunction

ただしこのスクリプトはamコマンドを利用しているためshellの制限を受けます。

たとえば「端末エミュレータ」でshellが扱えるのは128KBまでなので、それ以上のテキストを送るとエラーになります。

また環境によってはインテントの受け先を毎回手動で選択ではなく、自動選択にするとうまく動作しない場合があります。

うまくいかない場合は「現バッファのファイルを外部アプリで開く」でファイル自体を別のアプリで開くなどしたほうがよいでしょう。

なお「端末エミュレータ 改変版」を使用している場合は専用のエスケープシーケンスが用意されているので、そちらを利用してください。

現バッファのファイルを外部アプリで開く

Vimで開いているファイルをインテント利用して外部アプリで開けると便利な場合もあります。

外部アプリで編集後は :e! で再読み込みすると良いでしょう。

" 現バッファのファイルをインテントを使用して外部アプリで開く nnoremap <silent> gka :AndroidIntent<CR>

command! -nargs=* AndroidIntent :call AndroidIntent(<q-args>) function! AndroidIntent(file) let file = a:file == '' ? expand('%:p') : fnamemodify(a:file, ':p')

let file = escape(file, " '`$")

let cmd = 'am start --user 0 -a android.intent.action.VIEW -t text/plain -d '.file let ret = system(cmd) endfunction

  • :AndroidIntent path/to/file のようにファイル名を指定して実行すると特定のファイルを外部アプリで開けます。
  • 閲覧でなく編集ならaction.EDITに変更してください。
  • ただし環境によってはインテントの受け先を毎回手動で選択ではなく、自動選択にするとうまく動作しない場合があります。

Vimの終了時に端末表示色を再設定

Vimを使用していてcolorschemeで文字色と背景色を変更している場合、Vimの終了後に表示色が戻らないことがあります。

そのような場合は以下を.vimrcに追加すると改善されます。

" 終了時に端末表示色を再設定

au VimLeave * let saved_t_Co=&t_Co|let &t_Co=1|let &t_Co=saved_t_Co

Vimのノーマルモード

端末エミュレータ 改変版」にはVimの補助機能としてIMEの状態制御が実装されていて、ATOK用としてソフトキーボード使用時にノーマルモードへ移行した場合に英数モードに変更するようにも設定可能です。

またGoogle日本語入力では英字入力時の予測変換が切れませんが、これは特にVimを使用する際にはかなり煩わしい事になります。

この問題の対処として、Vim向けにGoogle日本語入力の予測変換を無効化する機能が「端末エミュレータ 改変版」には追加されています。

IMEの予測変換

特にハードウェアキーボードを使用して日本語文書を作成する場合に、IMEの変換候補が表示され画面サイズが変更されることがあります。

この時カーソル位置が頻繁に変更されて集中しにくいこともあるかと思います。

そのような場合は画面中央に固定する「タイプライタースクロール」に設定すると便利です。

’「タイプライタースクロール

android用の設定

androidの場合のみ実行したい処理がある場合はgetpropを使用して切り分け可能です。

必要なら端末エミュレータなどからgetpropを実行して使えそうなパラメータを探してみると良いかもしれません。

" OSチェック

if !executable("getprop") || system("getprop net.bt.name") !~ 'Android'

finish

endif

" Androidのバージョン判定

if system("getprop ro.build.version.release") > 4

endif

" Androidの機種名判定 if system("getprop ro.product.model") =~ 'Nexus 7'

endif

" Androidの言語判定 if system("getprop persist.sys.language") =~ '^ja\n'

let $LANG='ja_JP.UTF-8'

endif

この他 $USERで使用端末に応じて設定を変更するのも良いかもしれません。

なお$USERはファクトリーリセットすると変化します。

if $USER='u0_a257'

endif

Vimのアップデートとビルド

個人的にビルドしたVimバイナリの最新版は以下にあります。

https://github.com/fuenor/Android-Terminal-Emulator/tree/downloads/apk/vim

定期的に最新版をビルドしているわけではないので、最新版が欲しい場合はNDKでビルドしてvimの実行ファイルを置き換えてみてください。

android用Vimのビルドと実行環境の作成

Android SDKやAndroid Studioは不要で、LinuxだけでなくWindowsでもビルド可能です。