Vim で日本語を入力する魅力を他人に伝えたいと思っている、Vim 使いの「ブイ」(仮名)です。12 回目のテーマは「Vim と日本語」です。Vim の一番の弱点とされる日本語の扱い。日本語を Vim 上でいかに扱うかは Vimmer の長年のテーマでした。今回は Vim で日本語を扱うときのテクニックについて紹介します。
1 なぜ Vim は日本語入力が苦手なのか¶
Vim で日本語を扱う場合、障害となるのは日本語の入力でしょう。なぜ Vim は日本語入力が苦手と言われるのでしょうか。それは日本語入力モードが一つのモードとして機能するため、日本語入力モードからVim のノーマルモードへの切り替えが発生するからです。つまり、日本語入力を Vim で行う場合はノーマルモード→インサートモード→日本語入力モードという二段階の手順を踏まなければならず、日本語入力からノーマルモードに戻るときは日本語入力モード→インサートモード→ノーマルモードという手順を踏まなくてはいけません。Emacs の場合も日本語入力モードがありますが、Emacs では文字を直接入力するのが基本のため、Vim のように頻繁にノーマルモードに移行する必要がありません。さらに Emacs だと、日本語入力中にカーソルを移動することができます。
Vim では特に、日本語入力から直接ノーマルモードへ戻るのが困難です。なぜなら、日本語入力中に普通に <ESC>
を押すと日本語入力がオフにならないからです [1]。日本語入力のままでノーマルモードに戻ってしまうとノーマルモードが期待通りの動作をしません。
2 GUI の Vim と日本語入力¶
GUI の Vim (GVim) の場合、デフォルトで日本語入力との協調動作が有効になっています。普通は特に設定しなくても、日本語入力中に <ESC>
を押せば日本語入力はオフになると思います。
自動的にオフにならない場合、次の設定を試してみるとよいでしょう。
autocmd InsertLeave * set iminsert=0 imsearch=0
IM によっては、オプションや環境変数のセットが必要な場合があります。環境に依存するので、詳しい説明は避けておきます。
Windows 以外の環境(Mac, Linux)では日本語入力との協調動作がプラグイン (特に自動補完プラグイン)の誤動作を引き起こす恐れがあります。これは古い IM は協調動作のためのインタフェースを備えていなかったので、Vim 側で無理矢理制御しているためです。Fcitx などの比較的問題を起こしにくい IM を用いることをオススメします。
3 CUI の Vim と日本語入力¶
GVim では Vim 本体が IM を制御していましたが、CUI の Vim では IM を制御することができません。そのため、<ESC>
を押した際に日本語入力をオフにするためには、IM 側が Vim と協調する必要があります。Vim と協調動作できる IM は少なく、大抵の場合は <ESC>
を押してから手動で日本語入力をオフにする必要があるのは難点です。その代わり、Vim の日本語協調動作で問題が発生しないとも言えます。Vim と協調できる IM としては、uim と
Fcitx が有名です。
uim は vi 協調モードを備えた IM として有名です。uim の設定項目には「vi
協調モードをオンにする」というそのものズバリな設定があります。この設定を有効にすると、<ESC>
を押したときに uim がオフになります。
Ubuntu Linux 15.10 以降では Fcitx という IM が標準で利用されています。Fcitx の IM 制御には以下で紹介されているスクリプトを用いるのがよいでしょう。古い Ubuntu では IBus が標準で使用されていましたが、IBus 1.5以降の仕様変更により IBus の使用は推奨されません。
4 外部プラグインによる日本語入力¶
システムの IM は一切使用せず、外部プラグインを IM として使用するという考え方もあります。この方式の利点は外部の環境にほとんど依存しないことと、Vim との高い親和性にあります。
ただし、IM を Vim script で実装するのは難しく、広く使われているものはあまり存在しません。代表的なものとしては、skk.vim と eskk.vim が挙げられるでしょう。
http://www.vim.org/scripts/script.php?script_id=3118
https://github.com/tyru/eskk.vim/
どちらも SKK と呼ばれる IM をベースにしており、操作性が独特なため SKK に慣れていない人が使用するのは極めて難しいです。
5 日本語の整形¶
それでは、日本語の入力から一旦離れて日本語の整形について解説しましょう。Emacs ならば、文字列を選択して M-q
を押すと文字列を整形することができます。Vim の場合も、ビジュアルモードで文字列を選択して
gq
を押すと整形することができます。折り返しの基準となる文字列幅は’textwidth’オプションにより指定することができます。整形前には
:setlocal textwidth=80
と実行しておくとよいでしょう。日本語を整形するときには、.vimrc 内で次の設定をしておくとよいです。
set formatoptions+=mM
‘formatoptions’ オプションに m が指定されていると、行整形時マルチバイト文字でも改行します。
‘formatoptions’ オプションに M が指定されていると、行を連結したときにマルチバイト文字なら空白を入れないようになります。
Vim 標準の整形機能でも、ある程度は整形することができますが、標準では禁則処理を行うことができません。つまり、「、」や「。」が行頭に来てしまう可能性があります。
autofmt.vim を導入すると、禁則処理の問題を解決することができます。http://www.vim.org/scripts/script.php?script_id=1939
autofmt.vim をインストールした後は、.vimrc に次の設定を記述することで日本語の整形機能が有効になります。
set formatexpr=autofmt#japanese#formatexpr()
autofmt.vim を用いた整形では、禁則処理以外にも最初の行のインデントを基準に整形を行うことができ、より自然な整形が実現できます。
6 Vim と曖昧幅文字¶
一部の全角文字には、曖昧幅を持つものがあります。フォントによって、文字の幅が異なるのです。有名なのは「▽」「△」「▲」「※」などです。Vim の初期設定では、”single” になっています。つまり半角幅で認識します。これらの文字は日本語だと全角幅を持つため、表示がずれてしまうことでしょう。
:set ambiwidth=double
と設定することで、曖昧幅文字は全て全角文字として処理されるようになります。ただし、これは Vim 内での認識のみの話です。CUI の Vim においては、端末が曖昧幅文字をどう扱うかが重要になります。端末が全角文字を半角文字として認識していると、表示がずれることになります。
例えば広く使われている GNOME Terminal では、
$ VTE_CJK_WIDTH=1 gnome-terminal --disable-factory
のように引数を与えて実行すると、曖昧文字幅を全角文字として扱うようになります [2]。alias やランチャーに登録しておくとよいでしょう。
次回はタグジャンプについて解説します。
[1] | GVim では IM と Vim が協調して動作するために、このような問題が発生しませんが、ここでは IM との連携が難しい CUI の Vim を念頭に置いています。 |
[2] | 参考記事: http://gihyo.jp/admin/serial/01/ubuntu-recipe/0018 |