3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-04-30

記事更新しました

ポメラ!お前はポメラになるのだ!

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

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

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

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

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

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

~/.vim/plugin/**/*.vim

今まで自分で書いたスクリプトはとりあえずpluginに放り込んでおけばガンガン読んでくれるので安心していたんですけど、ここに放り込むとファイル単位でスクリプトを弾くのがとても面倒なので工夫せざるを得なくなりました。netrwを使っている手前、ディレクトリ構造で処理しようとするとディレクトリに潜る手順が増えるのが煩わしいし、そもそもpluginディレクトリ配下にある*.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日本語入力」を使っているので色々と試しましたが、公式ドキュメントに倣うのが一番無難でそれ以上快適にはならなさそうでした。但し、g:imcontrol_insertを設定すると入力モードが半角の「単語ベース」の入力になる上、そもそもGoogle日本語入力経由の入力がかなりガタつくのでちょっと使い物にならないなという感じです。日本語入力のために2ストローク使うのはシャクですが「IMEショートカット→入力切替」の手順を踏むのがいいのかなと思います。それとも:TFAModで仕込んだり出来るんですかねこれ…

余談

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

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

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

3
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?