Androidでもvimを使いたい - DroidVimの設定あれこれ

## 記事更新しました

https://qiita.com/astrorobot110/items/8db051c149288464c373

## ポメラ！お前はポメラになるのだ！

「ポメラほしい。でもUSキーじゃないしじゃあUSキーのネットブックほしい。ぶっちゃけCUIでいい。いっそポメラの代替品ならVimだけ動けばいい。」みたいなことを最近言っていたんですが、少し冷静になりまして、状態もよくわからん中古のネットブック買って、バッテリーがうんちゃらとか変態レイアウトがうんちゃらとか言うくらいだったら、root取れる中華タブとキーボード買うほうがマシよねって気がついたんです。ホラちょうどここにカスタマイズしようとして放っておいたFire7もあるんですよ。ここはちょっと一念発起して、昔チェックだけはして「スマホじゃ無理だな」…と放っておいた[DroidVim](https://play.google.com/store/apps/details?id=com.droidvim&hl=ja)と、bluetoothキーボードの組み合わせで持ち歩けるVimを作ってしまおうという魂胆なんです。

## 「俺の答えはこれや」と叫びvimrcを投げつける

新しい端末でvimを使うならまず使い込んだ自分のvimrcを放り込むところから始まるんですが、幸いDroidVimは課金すればbusybox、gitが使えるのでさっさと課金して自分のvimrcをpullします。[公式のドキュメント](https://droidterm-e8a40.firebaseapp.com/droidvim/ja-JP/#h42)では「どっか`.vimrc`をうまいこと置いてシンボリックリンクで」とのことですが、もちろん`.vim`ディレクトリまるごとシンボリックリンクでもほぼ問題なかったです。[^1]`.vim`の実ファイル群置く場所は、まぁAndroidだし`/storage/emulate/0/`下でいいんじゃないですかね？ここならDroidVimの環境変数`$INTERNAL_STORAGE`に入っているので何かのっぴきならないことがあってもそんなに困らないでしょう。

[^1]: 公式ドキュメントにも書いてありますが、パーミッションの問題が出てきます。ウチの環境だと`.viminfo`を`.vim`内に置いてしまったのでトラブりました。

もちろん外部ツールに依存しない前提ですが、殆どのvimscriptは問題なく動きました。プラグインマネージャの`vim-plug`も問題無しでした。環境に依存するものもあるので`vimrc`にちょっとした仕掛けをしておくほうが良さそうなので変数を仕掛けておきます。

```vim:vimrc
let g:isDroid = split(&runtimepath, ',')[0] =~? 'droidvim' ? v:true : v:false
```

変数をbool値としてしか使うつもりがないので`v:true`を使っていますが、そのへんはどうすればいいのか分かっていません。さておき、DroidVimで弾きたい設定がある場合はこれを使って行きます…弾きたいのは…

## `~/.vim/plugin/**/*.vim`

今まで自分で書いたスクリプトはとりあえず`plugin`に放り込んでおけばガンガン読んでくれるので安心していたんですけど、ここに放り込むとファイル単位でスクリプトを弾くのがとても面倒なので工夫せざるを得なくなりました。`netrw`を使っている手前、ディレクトリ構造で処理しようとするとディレクトリに潜る手順が増えるのが煩わしいし、そもそも`plugin`ディレクトリ配下にある`*.vim`は何でも読む以上ディレクトリツリーも使えません。しょうがない、オミットするためのスクリプトを書いて乗り切りました。

```vim:plugLoader.vim
scriptencoding utf-8

let s:pluginDir = $VIMFILES.'/myplug'

let preloadPlugin = []
" ここに先にロードしたいプラグイン

let g:excludePlugin = {}

let g:excludePlugin.droid = []
" ここにDroidVimで除外したいプラグイン (以下同様)

let g:excludePlugin.win = []

let g:excludePlugin.unix = []

" プラグインの読み込み
let g:myPlug = glob(s:pluginDir.'/*.vim', 0, 1)

let currentTerm = ''
if !g:isDroid
	if has('win32')
		let currentTerm = 'win'
	elseif has('unix')
		let currentTerm = 'unix'
	endif
else
	let currentTerm = 'droid'
endif

for omit in g:excludePlugin[currentTerm] + preloadPlugin
	let rgx = omit.'$'
	call filter(g:myPlug, 'v:val !~# rgx')
endfor

let g:myPlug = map(preloadPlugin, { idx, val -> s:pluginDir.'/'.val }) + g:myPlug

for script in g:myPlug
	execute('source '.script)
endfor
```
スクリプト中の`$VIMFILES`の中身は先の`g:isDroid`でも使っていた`split(&runtimepath, ',')[0]`です。

## I・M・E! I・M・E!

日本語入力がある限り日本人のvimmerは永遠にIMEの設定をする運命なのですが、当然のごとくAndroid+H/Wキーボードの環境でも襲ってきますというか、PCベースの環境より更に悪化していると言って差し支えないでしょう。とりあえず「Google日本語入力」を使っているので色々と試しましたが、[公式ドキュメント](https://droidterm-e8a40.firebaseapp.com/droidvim/ja-JP/)に倣うのが一番無難でそれ以上快適にはならなさそうでした。但し、`g:imcontrol_insert`を設定すると入力モードが半角の「単語ベース」の入力になる上、そもそもGoogle日本語入力経由の入力がかなりガタつくのでちょっと使い物にならないなという感じです。日本語入力のために2ストローク使うのはシャクですが「IMEショートカット→入力切替」の手順を踏むのがいいのかなと思います。それとも`:TFAMod`で仕込んだり出来るんですかねこれ…

## 余談

そもそもFire7でDroidVimを使うにあたって、そんじょそこらのH/Wキーボードを買うとCAPS⇔ctrlのスワップが出来なくて[^2]ちっとも快適になりません。実際買ったのは[そんじょそこらのやつ](https://www.amazon.co.jp/dp/B0171PT64C)なので、なんとかせんとならんのですが…Fire7君は立派に戦って文鎮となりました。現環境は中古で買った[Qua tab](https://www.kyocera.co.jp/prdct/telecom/consumer/lineup/kyt31/)です。Google Playがマトモに入っているならroot取らなくてもH/Wキーボードのレイアウトが変更できるのでまぁ及第点です。IMEでクッソガクガクするのはもしかしたら単純にQua Tabのパワー不足が原因かもしれないですが…

[^2]: それが必要じゃない人生であれば幸せなんですがまぁ、無理っすね20年前にはもう入れ替えてたし…ある程度のクラスのキーボードはハードウェアでスワップできるようになっててほしいんですけどね。今使ってるLenovoくんも入れ替えはOS側に頼ってるし…