Vimでの日本語編集がはかどるキーマッピング

皆さんは日本語の文章を編集するときも、Vimを使っていますか?使いたいけど、なかなかうまく使えないんだよなぁという方に、おすすめのキーバインドを紹介します。

基本的なアイデアは、@igrep さんの[全角アルファベットやひらがな・カタカナを入力しても（ちょっと）いい感じに解釈してくれるvimrc - Qiita](http://qiita.com/igrep/items/2c0dae6242eed5baf172)を参考にしています。

まず、Vimで日本語を編集していて一番鬱陶しく感じるのは、ノーマルモードから挿入モードに入るときにIMEをOFFにして、日本語を入力するためにまたONにして、、、という操作。それから、ノーマルモードにIMEがONのまま抜けてしまって、作業が中断してしまうところにあると考えます。

この問題を解決する方法としてVimmerの先輩たちが考えてきた方法として、IMEのON/OFFをESCキーで抜けたタイミングで切り替えることであったり、もしくは挿入モードに入るときに独自のキーマッピングを明示的に使うことで、IME切り替えの手間をなくす、というようなものでした。

- [SSHを介してVimを使う人に感動的なESCキーを押すとESCキーが効きつつIMEがオフになる設定(Google日本語入力とVimの相性は最強！) - しふーのブログ](http://d.hatena.ne.jp/sifue/20120411/1334161078)
- [Vimでの日本語入力・編集用に別コマンドを割り当てる - Qiita](http://qiita.com/deton/items/a3cb60ae014276aeb4d9#2-5)

また、ノーマルモードでの日本語の文節などの話は今回は扱いませんが、こういったプラグインも入れてみると編集が楽になるかもしれませんね。

- [Vimでの日本語のカーソル移動の改善: 文節単位のWORD移動(W,E,B)プラグインと、句読点に移動するmap](https://gist.github.com/deton/5138905)

今回ご紹介するのは、もっと原始的で、しかしシンプルな解決方法です。


カーソルの移動を考える
--------------------------

日本語で文章を書くときというのは、自分の場合は$\LaTeX$やmarkdownで文章を書くことが多いのですが、比較的長い文章になることが多いと思います。そこで、ラップされて表示されることも多いと思うので、以下の設定をしておきます。デフォルトで`gj`や`gk`キーでラップされた同じ行内を動くことができますが、これを矢印キーでできるようにしておく設定です。

```vim
" 矢印キーでなら行内を動けるように
nnoremap <Down> gj
nnoremap <Up>   gk
```

折り返されたところが見やすくなるように、showbreakキーを登録しておくといいかもしれません。

```vim
" showbreaks
set showbreak=↪
```

また、インサートモードでカーソルの移動をするために、以下のエントリを参考に

- [[Vim] インサートモード時の便利キーマップ - Qiita](http://qiita.com/y_uuki/items/14389dbaaa43d25f3254)

```vim
" 入力モードでのカーソル移動
inoremap <C-j> <Down>
inoremap <C-k> <Up>
inoremap <C-h> <Left>
inoremap <C-l> <Right>
```

のように設定しておきます。左手の小指を酷使することになるので注意が必要ですが、手をホームポジションから動かさなくてもいいというのは良い点です。もちろん、矢印キーで移動してもOKです。


日本語入力がONになった状態でノーマルモードから挿入モードに移行する
--------------------------------------------------------------------

これが今回のキーマッピングの肝とも言えるかもしれません。

IMEがオンのままでインサートモードに入りたいときというのは、現在のカーソルの近くに日本語の文書を追加したい時です。そうでないときは、素直にIMEをオフにするか、マウス使いましょう。

まず、よく知られていることかもしれませんが、ターミナル上で日本語を入力するときは、キー入力したものは変換してEnterキーで確定した時点でVim(ターミナル)に渡されています。したがって、IMEの設定でアルファベットをすべて半角入力するように設定していれば、途中でひらがなに変換されないものであれば、IMEがONのままでもEnterキーを押してVimに渡すことで、IMEをOFFにしなくてもコマンドとして実行できます。

例えば、`A`や`I`などは、「あっ、IMEがONのままだ」と気づいても、そのまま気にせずEnter押せばいいです。

で、問題は1文字の母音や複数文字のコマンドなど、途中で日本語に変換されてしまうものです。

```vim
" 日本語入力がオンのままでも使えるコマンド(Enterキーは必要)
nnoremap あ a
nnoremap い i
nnoremap う u
nnoremap お o
nnoremap っd dd
nnoremap っy yy
```

のようにキーマッピングしておけば、普通にインサートモードに入る感覚で(Enterキーは必要ですが)簡単な操作をすることができます。`dd`、`yy`は、ちょっとした時にあると便利だと思ったので追加しました。もしこれ以外にもIMEをオフにしないで使いそうなものがあれば、同じように設定すればいいです。例えば

```vim
" ""の中身を変更する
nnoremap し” ci"
" ''の中身を変更する
nnoremap し’ ci'
```

のようなものも、日本語でコメント書きたい人には便利かもしれません。
また、<F10>キーで半角英数に変換することもできるので、それでゴリ押すことも可能でしょう。

日本語を編集するときのコツ
--------------------------

上にいくつかキーマップを書いてみましたが、インサートモードを抜ける回数を減らすというのも効率よく編集するための手です。一番初めに設定したように、矢印キーやCtrl-h,j,k,lで移動すれば、そもそも「h,j,k,lで動けない!」とは考える必要は無いのです。

とはいえ、アンドゥ機能を有効に使うためには、一文ぐらいごとにインサートモードから抜けるのは大事なことです。そこで

```vim
" jjでエスケープ
inoremap <silent> jj <ESC>

" 日本語入力で”っj”と入力してもEnterキーで確定させればインサートモードを抜ける
inoremap <silent> っj <ESC>
```

のように、`jj`もしくはその日本語入力版である`っj`をキーバインドに設定しておきましょう。こうすれば、どちらの場合でも`jj`と入力すればインサートモードを抜けることができます。

途中でも述べたように、日本語入力モードのままですべてを完結させてしまおうというのは少し違う気がするので、遠くに移動するとか複雑な文字列の編集をしたい場合なら、素直にIMEをオフにすればいいと思います。

番外編
------

Vimとは直接関係ないですが、僕は日本語配列のキーボードを使っていて、Caps_LockをESCに、変換キーをEnterに、無変換キーをBackSpaceにマッピングしています。こうすると、親指の持つ役割が増えて、効率的にタイピングできるように感じています。お試しあれ。


まとめ
------

IMEの切り替えとか難しいことに手を出さずに、単純なキーマップで日本語の編集をうまくやる方法を提案しました。何かアドバイスなどあったらコメントよろしくお願いいたします。

最新の設定はこちらを参照してください。

* [dotfiles/vimrc at master · ssh0/dotfiles](https://github.com/ssh0/dotfiles/blob/master/vimfiles/vimrc#L714)