Vimにおける日本語入力環境に関する考察

SKK Advent Calendar 7日目です。
6日目はyunhさんで「u-ch: こっちで単語登録したら、あっちでも使いたい」でした。


辞書の扱いは悩ましいですねー。
自分は普段サーバ(Ubuntu)でデスクトップ(Windows)やノートPC(Ubuntu, Windows など)からsshで接続して作業してます。
SKKはサーバとノートPCにuim-skkとeskk.vimをインストールしていて、
Windowsではeskk.vimしかインストールしていません。非効率です。
こんな感じでメインのサーバ以外辞書の内容もまちまちでカオス状態です。


というのも、eskk.vimに辞書を壊してしまうという非常に重大な問題があって
そのバグを直さない限り辞書を移行してもしょうがない...というのが理由です...orz
そんな状態でこんな記事書いてしまって大丈夫か?一番いいSKKを頼む。できればVimで使えるやつを。


さて、今日はVimと日本語入力環境とSKKについての話です。
ちなみにこの記事の別タイトルは「Vimへの異常な愛情 〜または私は如何にしてeskk.vimを開発するようになったか〜」です。

さて

そもそもVimプラグインを使って日本語入力をする意味はあるのでしょうか。
Vimではあまり(Emacsの人達に比べて)Vimプラグインで日本語入力をしている人を見かけません。*1

そもそものプラグインが少ないという問題も大きいですが、
VimEmacsみたいな使い方はしないよ」という考えも大きいと思っています。
Vimのhelpにも :help design-not なんて項目があるほどです。


Vimで日本語入力をするには大きく分けて2つの方法があります。
Vimプラグインを使う方法と、OSのIMを使う方法です。

前者は当然Vimとの親和性が高いです。しかしVim以外では使えません。
後者はVim以外でも使うことができるし、統一感があります。

なんだかVimプラグインを使う必要がなさそうです...が、もちろんそんなことはありません。

VimはIMの入力をまだうまく扱えない

Linuxで、入力中に変な文字が入力されてしまったりといったことがありました。
インサートモードでマルチバイトを入力したあと「.」コマンドを押すと再現します。
uim-skkを使っていて「.」を押すと▽が残る、といった具合です。

某掲示板での報告も見たので自分だけの現象ではないはずです。*2

Vim特有の操作性に関する問題

インサートモードを抜けてもIMがオンになっていて
移動しようとしたら「j」と入力待ちになり大変うっとうしかったりする、ということがあります。
ちなみにuim-skkではノーマルモードに移ったらIMをオフにしてくれるvi協調モードというのがあります。

インストール/アンインストールが手軽

OSのIMEを変えてしまうのは抵抗がある...という方にも
手軽に試せるので安心してお使いいただけます。


たとえば.vimrcで

let g:plugin_im_disable = 1

などとすれば有効/無効にできる手軽さです。(架空の変数です)

Vimでチャットしたりする一部の人にとってうれしい

私です。

OSのIMが使えない時に

sshでサーバに接続した場合でもインストールしておけば日本語入力ができます。*3
うっかりIMをアンインストールしてしまった時にも安心!

Vim de 日本語入力

そんなわけでVimで日本語入力をするならVimプラグイン使いましょう!
ではVimで日本語入力するにはどのプラグインを使えばいいのでしょうか。
今のところVimプラグインで日本語入力が可能なのは

くらいです。
全部SKKです。VimmerSKK大好きですね!


(実際はVimの内部的な事情により複雑なIMを作ることが困難であった...
「と信じられている」ことが原因だと考えています。
Vimスクリプトは貧弱だ貧弱だと言われ*4
あまり本格的なプラグイン*5が作られない傾向にあります)


また

というのもあります。


VimIMは存在は知っていたのですが今日始めてコードを見てしっかりしたコードだと感じました。
しかし日本語入力に対するサポートは限定的なものです。

本題

ちなみに私は、ちなみにと言いながら本題ですが、eskk.vimを使っています。作者は私です。
skk.vimも作者の八木氏から現在のメンテナは私になりました。
sticky keyをサポートするパッチやAZIK配列サポートのパッチなど積極的に取り入れています。
またこちらはVim バージョン 6.xでも使えるように互換性を重視するという方針でやっています。(現在のVimの最新版は7.3.xxxです)


eskk.vimのすばらしいところはその自動補完機能*6にあります。
Google日本語入力のような、入力するたびに補完されるのを思い浮かべてもらうとわかりやすいかと思います。

自動補完のパワーは凄まじいです。
今「単文節で変換するSKKに自動補完機能をつけてもあまりいい効果はないんじゃ?」と思った方。
SKKで入力できることに意味があるのです。
あとけっこう地味に長い単語はあるのです。自動補完とか日本語入力とか。

また未実装ですが比較的長い単語の多いカタカナ語をサポートすれば
より一層うれしさが感じられると思います。
(しかし少し残念なのはneocomplcacheをインストールしていないと今のところ使えないことです)

使用中の様子

デモ

こちらが実際の使用中の様子のスクリーンキャストです。
この記事に使う予定じゃなかったのでeskk.vimはちょろっとしかありませんが...orz

また巷で大人気のunite.vimの映像も写っています。*7
(なんだかかなり速くなってしまった...速度調節するのってできないんだろうか...)

eskk.vim 基本機能

SKKの基本的な機能については実装しています。

  • アノテーション
  • 再帰的な辞書登録
  • abbrevモード
    • ちょっとバグ多いかも...
    • abbrevモードでも自動補完効くはずなんですが...きいてないみたい?
  • etc.


...そういえばskk-ignore-dic-wordが辞書登録にあった場合に無視するのはまだでした。


eskk.vim 独自機能

  • 自動補完
  • g:eskk#set_undo_point
    • u を確定時に実行します。これによって確定ごとにundoすることができます
  • g:eskk#fix_extra_okuri
    • 「▽あs」の時点で を押すと「▽あ*s」になります
    • 余計なお節介機能かもしれない
  • g:eskk#rom_input_style
    • "skk", "msime" のどちらか
    • "skk" なら「test」と打つと「てt」となる
    • "msime" なら「test」と打つと「てst」となるら
  • g:eskk#revert_henkan_style
    • "okuri-one" なら「"▼書く" => "▽か*k"」のようになる
    • "okuri" なら「"▼書く" => "▽か*く"」のようになる
    • "delete-okuri" なら「"▼書く" => "▽か"」のようになる
    • "concat-okuri" なら「"▼書く" => "▽かく"」のようになる
    • 正確なことを忘れてしまったんですが...orz ddskkだと"okuri-one"の挙動だったような?
    • デフォルトは"okuri"です
    • またid:hchbawさんがuim-skkで"okuri-one"の挙動を実装してくれました!

オプション変数のところだけ見て目に付いたものをピックアップしてみました。


けっこう多い...と思われたかもしれませんが、
自分が比較的初期の頃に基本機能を無視して楽しそうな機能だけつけていたらこんな風になりました。
こういうやり方は失敗することが多いですが、しかし自分自身ではどれもやりすぎた機能だとは思っていません。

試験的な機能

  • g:eskk#convert_at_exact_match
    • 「かんじ」と打つと「蚊」「官」「漢字」というように1字ごとに変化します
    • 「かんじへんかん」と打とうとすると「かんじへ」の時点で辞書登録になってしまう...
    • どうすればいいだろうか

こんな風にSKKに囚われない機能が多いです。

TODO

目立ったものだけ書いてみます。

  • uimのようなフレームワークを目指す
  • ddskkはEmacs Lispの式を候補に書ける。eskk.vimVim scriptの式で拡張したい(辞書に格納するかどうかは後で考える
    • Vimの map のような機能ともいえる
    • ひらがな変換、漢字変換両方にほしい
  • qで変換したカタカナを自動的に辞書登録


またこれは別プラグインとして実装したほうがよさそうですが、
scim.elやuim.elのようにプロセスと通信する形で
実装するIMプラグイン(!= Vimプラグイン)もほしいですね。
(しかしマルチバイトの扱いがめんどくさいので
eskk.vimでサポートできればいいような気もする...うーん)

最後に

現在eskk.vimにはたくさんバグがあります...orz
また実装したい機能が山程あります。
また課題も山程あります。
気長に待っていただけるとうれしいです。

SKK Advent Calendar

Emacsは日本語入力環境がかなり充実しててうらやましい!
とても参考になります。ありがとうございます。
これもid:r_takaishiさんが主催してくださったおかげです。
本当にありがとうございます!


次はponkotuyさんです!楽しみですね!

*1:周りにはいっぱいいるのですが..世界全体で見ると少ないです!

*2:そういえばvim_devに報告されたんだろうか?

*3:X11 Forwardingしてれば使えますが使えない時もあります。Vimが使えればええんや!

*4:自分も言ってますが...本当のことですが...

*5:コーディングを支援するものなどの補助的なプラグインではなく

*6:Shougo氏の尽力によるものです。ありがとうございます!

*7:あれ...いつのまにかunite.vimの宣伝をしている...(ゴクリ