androidでVim

本ページではandroid上で動作するVimについて記しています。
Vim(vi)自体の簡単な使い方(操作方法入門)は「はじめてのvi」にまとめてあります。



DroidVim

GooglePlay上でテキストエディタアプリとしてDroidVimが公開されています。
DroidVim
  • grep, diff, ctagsが使用可能
  • Vimのノーマルモードで問題になる予測変換の無効化
  • EscやCtrl等の特殊キーの入力
  • 外部SDカードやオンラインストレージ上のファイル編集
  • 外部アプリからのインテントで編集
  • 任意の等幅フォントによる表示
(一部機能はAndroid 4.4以降が必要です)



設定ファイル

.vimrc や.vimなどの設定ファイルは「設定」の「ホームディレクトリ」で指定された場所($HOME)から読み込みを行いますが、デフォルトの「ホームディレクトリ」はアンインストール時などに消去されます。このためSDカードや内部ストレージ等に.vimや.vimrcを作成してシンボリックリンクを張るか、「ホームディレクトリ」を 書き込み可能な適切な場所に変更する方が良いかもしれません。

シンボリックリンク作成にはVimから :shell でshellを起動するか、メニューの「新規ウィンドウ作成」で別ウィンドウを利用してください。
$ cd $HOME
$ ln -s /sdcard/.vimrc .vimrc
$ ln -s /sdcard/.vim .vim

フォント.

フォントは任意の等幅フォントが使用可能ですが、fontsディレクトリを作成してコピーする必要があります。
実際のパスは「設定」→「フォントファイル」で確認できます。


予測変換の無効化

◇ボタンで予測変換の有効/無効を切替可能です。
◇ボタンの機能は「設定」→「◇ボタン」から適切なものを選んでください。
以降は◇キーで「選択した入力タイプ」と「デフォルト入力タイプ」がトグルで切り替わります。
「起動時の入力モード」で起動時から変更することもできます。

  ◇ボタンの振舞い  
 50 通常入力 
 51 直接入力 : パスワード
 日本語入力不可
 英数確定入力になる。
 52 英数入力 : URI
 日本語入力可能
 多くのIMEでは変更後に英数入力に切り替わる。
 英数確定入力にはならない (IMEの設定に依存)
 53 直接入力 : パスワード (Google日本語入力)
 Google日本語入力以外では「パスワード」と同等
 日本語入力不可
 Google日本語入力も英数確定入力になる。
 Google日本語入力の制限としてメインタブ以外では一文字入力するたびにメインタブに戻ります
 大文字固定入力はできません(◇キーで切り替えれば可能)

また以下を.vimrcに追加に追加すると挿入モードでは通常入力になり、ノーマルモード移行時に英数確定入力化が自動で行われます。

" DroidVim IME control
" Input mode : 50 (Default) 51-53 (Disable word prediction)

let s:ImeNormal = 53

let s:ImeInsert = 50

augroup ATEModIME
  au!
  au InsertEnter * call IMCtrl('On')
  au InsertLeave * call IMCtrl('Off')
  au VimEnter    * call IMCtrl('VimEnter')
augroup END

function! IMCtrl(cmd)
  let cmd = a:cmd
  if cmd == 'On'
    call s:ATEMod(s:ImeInsert)
  elseif cmd == 'Off'
    call s:ATEMod(s:ImeNormal)
  elseif cmd == 'Toggle'
    call s:ATEMod(55)
  elseif cmd == 'VimEnter'
    call s:ATEMod(s:ImeNormal)
  endif

  return ''
endfunction

function! s:ATEMod(cmd)
  let cmd = printf('echo -n -e "\0033[%st"', a:cmd)
  exe 'silent !'.cmd
endfunction
日本語入力固定モード」にも使用可能

日本語入力

実際問題として「Google日本語入力」を日本語入力として使う場合は、「Gboard(Goolgeキーボード)」をノーマルモード用に使用して「Google日本語入力」と適宜切り替えするのが良いかもしれません。
  • 「設定」→「起動時の入力モード」を「通常入力」に設定
  • Gboard(Goolgeキーボード)」を英数確定入力に設定
  • 必要に応じて言語切替ボタン(地球マーク)でGoogle日本語入力とGboardを切り替え
ハードウェアキーボードの場合は言語切替ボタンが使えないのでIMEショートカットを使用します。

ハードウェアキーボード

ハードウェアキーボードでの日本語入力切り替えは個々のIMEにより方法が異なります。
「設定」→「IMEショートカット」で適切に設定してください。
例えばGoogle日本語入力であれば「IMEショートカット」のCtrl-Jを有効にして、「機能設定」を「直接入力:パスワード(Google日本語入力)」にするとハードウェアキーボードでCtrl-Jを押す度に日本語入力/英数入力を切替可能になります。

DroidVimはキー入力を直接扱う場合があるため、一部の日本語配列キーボードレイアウト変更アプリを使用すると、[半/全]キーで問題が起きることがあります。
日本語ハードウェアキーボードを日本語配列に変更する場合は、Google日本語入力かWnn keyboard lab付属のキーボードレイアウト、またはDroidVimと同じ作者の「ハードウェアキーボード配列変更+親指Ctrl」を使用することをおすすめします。




Termux

Android 5.0以降専用になりますが、Google Play上にTermuxという端末エミュレータ+各種unix系ツールアプリがあります。
Termux
TermuxはVim専用ではなくandroid上に一般的なLinux環境を実現するためのもので、aptコマンドによりインストール可能なclangやsshなど一通りのコマンドが揃っており、VimだけではなくEmacs等も動作します。



初回起動時のダウンロードの終了後に以下を実行するとVimが使用可能になります。

pkg upgrade
pkg install vim


Vimの日本語関係ですが使用可能なファイルエンコーディングに制限があるほかに、ターミナルの問題として日本語入力変換中のインライン文字が表示されないなどの問題があります。
なおgettextオプションが有効になっていないため、メッセージやメニューは日本語化できません。
また端末エミュレータの設定は基本的にショートカットキーで行ないます。(一部機能はconfigファイルで設定します)
https://termux.com/help.html

いずれ実装あるいは変更されるかもしれませんが、以下に現時点(v0.41)での設定方法についていくつか記しておきます。

ファイルエンコーディング

TermuxのVimは、iconvをインストールしてもcp932やeuc-jp, iso-2022-jp等が扱えないようです(Shift_JISは読み込みのみ可能)
このためfileencodingsにはUTF系とcp932のかわりにsjisを設定すると良いかもしれません。
" Termux用fileencodings
set fileencodings=ucs-bom,utf-8,sjis,utf-16le,utf-16,default
(注意) cp932(Shift_JIS)ファイルを編集した場合、書き込み時に変換できないためUTF-8(&encoding)としての強制書き込みしかできません。
なおcp932とShift_JISは厳密には異なるものなので読み込み時にファイル内容が変更されてしまう事があります
Shift_JISとcp932

面倒な場合はvimを以下のバイナリで置き換えるのもよいかもしれません。
日本語対応android版Vim

フォント

フォントサイズは画面のピンチイン・ピンチアウトまたはCtrl+Alt+(+/-)で変更可能です。
フォントと画面色の変更は専用の有料アプリを使用することにより可能になります。

ESC, CTRL等のExtra Key

本記事のスクリーンショットにはESCやCTRL等の特殊キー入力用にファンクションバーが表示されていますが、デフォルトでは表示されていません。
画面左端からスワイプするとメニューが出てくるので、メニュー上の「Keyboard」ボタンを長押しして有効化します。
一度有効化すれば次からはデフォルトで表示されるようになります。
またVolume Up + q のショートカットでも有効化可能です。

Android 6.0での外部SDカード

OSの「設定」→「アプリ」からストレージの権限を手動で有効化しないとSDカードにはアクセスできない場合があります。
権限はtermux-setup-storageを実行してシンボリックリンクを作成することでも有効になります。



Vim Touch

Google Play上で配布されているVimとしてVim Touchがあります。
VimTouch」(Google Play) Android 4.1以降対応
(v 2.7r1から年単位で開発が行われていないのであまりおすすめはしません)
※ Playストアでの公開を停止したようです。

Vim Touchはタッチパネルからも操作しやすいように各種ボタン等が追加されていますが、実態は「Android Terminal Emulator」を改変してCUI版Vimを組み込んだものです。

現時点(バージョン2.7r1)では以下のような問題がありますが、日本語を使用しなければ概ね問題なく使用できるようです。
  • Android 5.0以降で .vimrcの編集は出来ません。(rootをとっていれば可能)
  • 左画面外からのスワイプでファイラーが起動しますが、ファイラーからファイルを開いた場合は編集ができないことがあります。
  • 一部日本語IMEではmenu→Preferences→Input MethodをWord-basedに設定する必要がありますが、設定すると不正終了することがあります。(日本語入力を必要としないならCharacter-basedのままで動作可能です)
  • 半角カナや □ ○などのAmbiguousな文字と日本語入力変換中のインライン文字はきちんと表示されません。
  • 大きめなテキストをクリップボードとやりとりすると不正終了することがあります。
  • set clipboard+=unnamedを設定すると p コマンドを2回実行しないとクリップボードの内容が貼り付けられないようなことがあります。

日本語関係の対処

デフォルトでは中国語用に設定されているのでUTF-8以外の日本語ファイルは文字化けすることがあります。
.vimrcはメニューの Edit vimrcから編集可能ですので、以下を設定しておくと良いかもしれません。

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

またGoogle日本語入力やATOK等のCharacter-basedで動作するIMEを使用する場合はデフォルトで日本語入力可能ですが、そ の他のIMEなどで日本語入力できない場合はmenu→Preferences→Input MethodをWord-basedに設定する必要があリます。

なおGoogle日本語入力のように英数確定入力に設定できない場合は、Quickbarへ i a o 等の各種コマンドを適切に設定してやると良いかもしれません。
Android 5.0以降の場合は、必要に応じて言語切換ボタン(地球マーク)で英数確定入力に設定した英語キーボードと切り替えながら使用する方法もあります。

Ctrl/Tab/カーソル

Escはアクションバーボタンから入力可能ですが、CtrlやTab、カーソルなどはIMEに存在しなければ入力できません。
このためボリュームボタンを使用した特殊入力か、Hacker's KeyboardのようなCtrlやTabの使えるIMEへの変更が推奨されているようです。

grepとdiff

vimgrepは当然使用可能ですが、使用端末によっては(大抵の場合、日本語は通らないものの)より高速な外部grepが使えることがあります。
diffに関してはメニューに存在するもののdiffのバイナリ自体が存在しないので実行不可能なようです。

なおandroid用のgrepやdiffのバイナリ自体を「grepとdiffの設定」等を参考にコピーして使用することは可能です。


Vimの設定

主にandroid上のVimで有用かもしれない設定について以下にまとめました。
Vimの設定


日本語対応android版Vimバイナリ

端末エミュレータアプリはGoogle Play等で色々と公開されていますが、それらの端末エミュレータ系アプリ上でVimが動作可能です。
日本語対応android版Vim

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

android上の端末エミュレータアプリとして最もよく使用されているのは「Android Terminal Emulator」で、多くのアプリの改変元にもなっています。
Android Terminal Emulator」(Google Play)

(注意)
ただしオリジナル版の「Android Terminal Emulator」でVimを使用する場合は1.0.54の追加機能により不正終了することがあります。
これはVim固有の問題ではなく日本語を使用しなければ問題ないようですが、そうでない場合は他の端末エミュレータ系アプリか「Android Terminal Emulator改変版」のように対処済みのアプリを使用することをおすすめします。
Android Terminal Emulator改変版



grepとdiffの設定

TermVimでは同梱されていますが、VimTouch等ではgrepもdiffも使用できないようなので、適切なバイナリをダウンロードしてインストールする必要があります。
grep, diff

VimTouchでは:shell やCtrl-zなどでshellへ移行してから実行可能な場所へコピーして実行属性を付加し、.vimrcでpathを通すなどして使用します。
VimTouchでの設定例
" 実行バイナリを/data/data/net.momodalo.app.vimtouch/binへコピーした場合
let $PATH='/data/data/net.momodalo.app.vimtouch/bin:'.$PATH


busyboxとその他のツール

busyboxはLinuxの各種コマンドを実行可能にするバイナリでandroid端末に欠けている多くのコマンドを補完することができます。
Vimを動作させるだけなら特に必要というわけではないのですが、本来の端末エミュレータアプリとして使用するなら有用です。
busyboxとその他のツール


androidでの文字入力

androidの文字入力は、UIも含めて各IMEが独自に処理するので操作系や処理がまちまちです。
ハードウェアキーボードではあまり問題になりませんが、ソフトキーボードでのVimの使用感はIMEによって大幅に違ってきます。
たとえば英数入力では確定入力でないとソフトキーボードでの入力が若干面倒です。
日本語IMEではATOKやWnn Keyboard Labが上下カーソル移動も扱えますが、そういうプラスアルファの部分で使用感がかなり違ってきます。
なお多くの端末エミュレータ系アプリでは画面タッチによるEscやCtrlの入力手段が用意されているのでそちらを利用する方法もあります。

またVimのノーマルモードでは英数確定入力でないと操作性がかなり落ちます。
ほとんどのIMEでは英数確定入力化可能ですが、Google日本語入力のように英数確定入力に設定できないIMEもあります。
Android 5.0でGoogle日本語入力を使用する場合は、Googleキーボード(英語)を確定入力に設定して、言語切替ボタン(地球マーク)でGoogleキーボード(英語)とGoogle日本語入力を適宜切替えすると良いかもしれません。

この辺りが問題なら割りきって適宜IMEを切り替えるという方法もあります。
特にVimではESCやCTRLの入力しやすさが重要なので、日本語を使わないような場合はHacker's Keyboardなどに切り替えるとVimを快適に扱えます。
Hacker's keyboardを使用する場合の日本語入力にはSKKを使うという選択肢もあります。

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

ハードウェアキーボード配列はAndroid 4.1以降で変更可能になりました。
日本語キーボード用にレイアウトを変更するアプリなども配布されています。
KCM for 日本語106/109キーボード
またGoogle日本語入力やWnn Keyboard labにも日本語キーボードレイアウト設定ファイルが同梱されています。

配列変更はハードウェアキーボードを接続した状態で「設定」→「言語と入力」から設定します。
ほとんどのIMEでは何もしなくてもkcmファイルの設定変更が有効になるのですが、Google日本語入力ではGoogle日本語入力の設定で「システム配列」に設定する必要があります。
なおメーカーによって設定変更自体が禁止されている端末もあります。


QFixGrep/QFixHowmのandroid/iOS設定

QFixHowmのインストール方法については「QFixHowm - インストール」を参照してください。
基本的に/sdcard等へqfixhowmのソースをコピーしてruntimepathに追加するだけで動作します。
android用のGitクライアントもあるようなのでqfixhowmからcloneしても良いでしょう。
" /sdcard/qfixhowmにqfixhowmのソースが存在する場合
set runtimepath += '/sdcard/qfixhowm'

環境によってはbusyboxのgrepが使えるようですが、 busyboxのgrepは推奨しません。
なおTermVimであればgrepが同梱されているのでそのまま使用可能です。
grepが存在しないかbusyboxのgrepしか使えない場合はVimスクリプトによるgrepのagrep.vimを使用します。

" android/iOS(agrep.vim)
let mygrepprg = 'agrep.vim'
agrepの正規表現はVimの正規表現になります。
なお同一ディレクトリにUTF-8とcp932、euc-jpなど異なるエンコーディングが混在している場合でもagrep.vimを使用するとエンコーディングを気にせずgrep可能です。
基本的には単一エンコーディングでの使用を推奨しますが、必要な場合は以下を参照してください。
異なるエンコーディングのファイルが混在している場合

GNU grep

agrep.vimの速度に不満な場合、androidではGNU grepのバイナリを使用すると改善されます。
grepとdiffの設定

Vimと同じ場所などかPATHの通った適当な場所へコピーしてchmodで実行属性を付加してください。
androidの場合は/system/binにgrepが存在することがあるのでフルパスで指定するとよいでしょう。
PATHは.vimrcでも追加可能です。
" android
" /data/data/jackpal.androidterm/usr/binへコピーした場合

let mygrepprg = '/data/data/jackpal.androidterm/usr/bin/grep'

URLやhtmlをブラウザで開く

howmメモのURLやhowm2html.vimで変換したhtmlをandroidのブラウザで開くようにデフォルトで設定されています。
ただしChromeは file://のインテントに対応していないのでローカルファイルを開く場合はfirefoxなど file://のインテントに対応したブラウザが必要です。
" QFixHowmやhowm2html.vimからURLやhtmlをブラウザで開く
let openuri_cmd = '!am start --user 0 -a android.intent.action.VIEW -t text/html -d %s'

howmファイルの共有

PCとAndroidでファイルを共有するために Dropboxや Sugarsyncにhowmファイルを保存しておくと便利です。
複数PCのhowm共有」 (Dropbox/Sugasyncの設定)
作者はAndroidのDropboxを使用していますが、howmディレクトリはDropsyncのような自動同期アプリで同期するほうが良いでしょう。

たとえばWindowsとandroid間でファイル共有するには以下のように設定します。
" Windows
let howm_dir         = 'D:/usr/howm'
let QFixMRU_RootDir = 'D:/usr/howm'
let QFixMRU_Filename = 'D:/usr/howm/_env_/qfixmru.mru'
" android
let howm_dir         = '/storage/emulated/legacy/howm'
let
QFixMRU_RootDir = '/storage/emulated/legacy/howm'
let QFixMRU_Filename = '/storage/emulated/legacy/howm/_env_/qfixmru.mru'
  • androidではSDカード直下のhowmディレクトリで共有しています。
  • howm_dirはシンボリックリンクを指定するとMRUが動作しないことがあるので実ディレクトリを指定してください。
    MRUが動作しない場合は適当なhowmファイルをVimで開いて :echo expand('%:p')でパスを確認してみてください。
  • QFixMRU_RootDirとQFixMRU_Filenameは howmのMRUリストもPCと共有するためで必須ではありません。