はじめに

時間の無い方は上のメニューの「Concept」をクリックして「基本方針」から先だけをお読みください.「その筋の人」なら「基本方針」だけ読めば環境構築まですぐできると思います.どうしようもなく暇な方のみ以下のどうでもいい自分語りにお付き合いください.

Motivation

vimの鬼門,それは日本語

UNIXエディタ界の2大巨頭といえば言わずと知れたvimとEmacsです. 私自身はEmacs派で,学生のころからこれまでずっとUNIXではEmacsを使い続けてきましたし,今でもWindowsで作業する際にはxyzzyが手放せません. と言ってもEmacsの機能はほとんど知らず単なるエディタとしてしか使っていませんが,指がすっかりEmacsのキーバインドを覚えてしまっています. 一方のvim(vi)については,ちょっとしたファイルの編集程度ならまあ何とかできるのですが,それほど使い込んではいません. その昔,「EmacsはUNIX的でない」という意見に感化されて,「UNIX使いならviを極めなければ」と一念発起して,オライリーの「入門vi」を買って練習したりしたこともありましたが,結局常用するには至りませんでした(今にして思えば大した発起じゃありませんでした). ESCキーの位置が遠くて打ちづらいとかそういう問題はキーバインドを変えればすむ話ですが,最終的に挫折した原因は日本語の入力でした. ご存知の通り,vimには「ノーマルモード」と「挿入モード」があります. これについては,訓練をすることでどうにか対応できるようになります. 実際,私のように普段vimを使わないような人間でも,UNIXの設定ファイルなどは,vimで特に問題なく編集できます. ところが日本語が入ってくると事情が変わります. 一般的なIMEでは,「英数モード」と「日本語モード」を切り替えながら入力することになりますが,「vimのモード」と「IMEのモード」の2種類のモードを同時に意識していないといけないのが,混乱の原因となり,大きなストレスとなります. そういうわけで,これまでvimから距離を置きつづけて来たのですが,あるきっかけでこの問題について改めて考えることになりました.

Atomに手を出す

最近ではWindowsが仕事のメインマシンとなり,Linuxを使うのはプログラムを書くときくらいになっていたのですが,先日Lubuntuをノートパソコンに入れてみたところ,思いのほか普通に使えるので面白くなり,普段Windowsでやっていることをどこまで再現できるかあれこれ試していました. そんな中,Atomというエディタがあると聞いて触ってみることにしました. IDE並みの起動の遅さや動作のもっさり感(さすがAtomを名乗るだけある)に早速「これはないわ感」が漂いましたが,実際触ってみると,やっぱり未来はこっちの方にあるんだろうなあという気がしてきますし,WindowsとLinuxの両方で使えるということもあり,しばらく使ってみることにしました.

久々にvimに挑むも...

Emacs派なので,Atomにも当然Emacsのキーバインドにするべくパッケージを入れるわけですが,思うようにカーソルが移動できません. 調べてみると,他のパッケージとカーソル移動のキーバインドがかぶっているためでした. カーソル移動くらいできないと話にならないので,せっせとキーバインドを設定し直していたのですが,ふと疑問が浮かんできました. そもそもctrlキー+[f,b,p,n,e,a]でカーソル移動するというのは正しいのだろうか? 世の中の多くのソフトウェアは,これらに別の機能(検索とか印刷とか全選択とか)を割り当てており,Emacsのカーソル操作を再現するためだけにわざわざこれらの機能を別のキーバインドに割り当てるのが面倒というか,使い方として邪道な気がしてきました. そして,vim派に改宗すればこのような悩みから解放されるんじゃないかと思うようになりました. ということで早速vimのキーバインドを実現するパッケージをインストールしてみましたが,やはり「日本語の壁」に跳ね返されることになりました.

モードレスで日本語が入力したい

vimで日本語を扱うのにはみなさん難儀しておられるようで,ネットで探すと対策がいくつか見つかりました. たぶん最もメジャーなのが,ESCをタイプしてノーマルモードに移行するときにIMEをOFFにするというテクニック(これとか)です. これはそれなりに有効だと思うのですが,挿入モード中はIMEのモードを意識せざるを得ず,依然として2種類のモードが存在するという点で本質的な解決になっていません. vimにモードがあるのはどうしようもないので,日本語入力の方をモードレスにできないかと思って調べることにしました. ネットをあさるとモードレスな日本語入力についての記事がいくつかヒットしますが,個人的にはどうもしっくり来ませんでした. よく言われているのが,IMEのONとOFFに別のキーを割り当てるという方法(これとか)です. 入力前にどちらかのキーをタイプする習慣をつけることで,モードを気にせずに入力できるという点では良いのですが,実際にやってみるとちょくちょく最初にIMEのキーをタイプするのを忘れてしまいます. それに日本語と英語両方のモードがあることには変わりなく,厳密にはモードレスではありません. 一般にモードレスと言われる入力方式は,ローマ字で入力した後に必要な部分のみ日本語に変換するというもの (これとか これとか)です. これらも面白そうではあるのですが,入力中にかなが確認できないのはミスタイプに気づきにくそうで不安なのと,一般的なIMEが使えなさそうな点がひっかかりました. Canna育ちの私はIMEはバカなのが当たり前と思っていましたので,もともとそれほどこだわりはなかったのですが,Google日本語入力を知ってからというもの,予測変換なしでは生きていけない体になってしまいました. 今の私は全てのマシンにGoogle日本語入力(mozc)をインストールしており,他のIMEはできれば使いたくありません.

ヒントはEmacsにあった

どうすれば日本語をモードレスに入力できるか,そのヒントはEmacsにありました.viがモーダルなのに対して,Emacsはモードレスなエディタと言われますが,そもそもEmacsはなぜモードレスなのかといえば,コマンドの入力をCtrl(またはMeta)キーと文字キーの組み合わせとすることで,文字入力に使うキーとの重複が避けられるためです. これはある意味,viで言うところの「ノーマルモード」と「挿入モード」を「Ctrl(Meta)キーを押す」ことで切り替えていると考えることができます. ならば,EmacsにおけるCtrlキーのように,「何か特定のキー」を組み合わせることで,日本語とアルファベットの入力を区別することができるはずです.

Concept

基本方針

基本的なアイデアは「日本語の入力中はずっと,ある特定のキー(仮に「FEPキー」[1]と呼びます)を『押しっぱなし』にしておく」というものです. 「FEPキー」はいわば「日本語のためのShiftキー」のようなものです. ということでこの手法を以降では「ShiftIME」[2]と呼ぶことにします. ShiftIMEでは,いついかなる時でも,FEPキーを押しながらタイプすれば日本語,それ以外のときは英語の入力となり,これにより日本語と英語の混じった文章をモードレスに入力することが可能となります. 従来のIMEの切り替え方法は,Shiftキーを使わずに,CapsLockのみを使って英語の文章を入力するようなものと言えます. そう考えれば,ShiftIMEが決して奇をてらった入力方法ではなく,むしろ「普通(いい意味で)の方法」であることがわかると思います.

FEPキーの選定

基本方針が決まったところで,FEPキーとして使うキーを決める必要がありますが,これはほぼ一意に決まってしまいました.結論から言えば「無変換」キーです. まず前提条件として,FEPキーは日本語を入力している間ずっと「押しっぱなし」なわけですから,その状態で他の文字キーをすべてタイプできるものでなければなりません. そうなると,必然的に親指でタイプするキーボード最下段のキーということになりますが,通常日本語のIMEでは変換候補の選択にスペースキーを使いますので,FEPキーとしては使えません. 残りのキーの中で「ひらがな」や「Altキー」は押すために結構深く親指を曲げる必要があり,この状態で他のキーをタイプするのはなかなか辛いです. というわけで最終的に残るのは「変換」か「無変換」のどちらかということになります. これはどちらでも可能ですが,実際に両方試してみると,差があることがわかります. FEPキーを押したままで入力する際に厳しくなるのは,FEPキーのすぐ上にあるキーです. 「無変換」の上のキーは,[z],[x],[c],[v]で,これらは日本語での利用頻度は比較的低いです. 一方「変換」の上には,[n],[m],[,<],[.>],[/?]と言った利用頻度の高いキーが並んでいます. このため,「無変換」をFEPキーとするほうが入力がずいぶん楽なのです. 「無変換」キーは私にとっては長らく「Ctrl」の指定席でしたが,このたびその座を明け渡すことになりました.

Implementation

ShiftIMEの実現方法

「日本語版のShiftキー」なんていうと,作るのが面倒そうに思えますが,結局のところは単純な話で,特定のキーを「押したとき」にIMEをONに,「離したとき」にIMEをOFFにすればいい,ということになります.一つのキーでIMEのON/OFFを切り替えるというのは従来と同じですが,離したときにOFFにする,というのがミソです.

Windowsの場合

さて,こんな器用なことはWindowsの標準機能ではできませんが,mayu(のどか)にかかれば朝飯前です. やることは,設定ファイルに以下の3行を追加して,再読み込みするだけです.

	
key *無変換 = &Ignore
key ~IL-D-無変換 = &SetImeStatus(on)
key IL-*IC-U-無変換 = &SetImeStatus(off)
	
	

「無変換」の部分を別の名前に変えればFEPキーを変更可能ですが,おそらく他のキーは実用になりづらいと思います.

Linuxの場合

Linuxの場合,xmodmapでかなり自由にキーマッピングの変更ができますが,さすがにキーのダウンとアップそれぞれにコードを割り当てることはできないようです. 一時はLinuxでは無理なのかとあきらめかけたのですが,なんとLinux版のmayuなるものが存在しました. 結構前からあるようですが,長らくWindows上のvnc経由でしかLinuxを使ってこなかった私はついこの前まで知りませんでした. ということで,Linux版mayuでの設定は,例えば以下のようになります.

	
key *Muhenkan = &Ignore
key D-Muhenkan = Hiragana
key U-Muhenkan = Enter S-Hiragana
	

Linux版のmayuは,IMEを直接ON/OFFすることができません. そのため,代わりに何かキーコードを飛ばして,それでIMEをON/OFFします. 切り替えの際に文字が入力されてしまっては困りますので,ここでは「ひらがな」「Shift+ひらがな」のキーコードを飛ばしています. 別途IMEの方の設定で,ONを「ひらがな」,OFFを「Shift+ひらがな」にそれぞれバインドしてやる必要があります. また,3行目にEnterが入っているのは,変換候補を確定せずにFEPキーを離してIMEをOFFにしたときに,強制的に現在の候補を確定させるためのものです.私の環境(Lubuntu 15.10)では,これがないとせっかく入力した文字が消えてしまいました. この辺は本来Fcitxで設定できるらしいのですが,Mozcと組み合わせた場合はうまくいかないようです. ただしこのEnterのせいで,変換を確定してからFEPキーを離すと,余分な改行が入ってしまいます. これについては確定の際「Enterを押す」代わりに「FEPキーを離す」という習慣をつけることで,回避できます(むしろこっちの方が快適だったりします).

Macの場合

上記のLinux版mayuはMacにも対応しているようなので,同様に設定できると思います.ただ私はMacは使っていませんので,動作確認はしていません.

Requirement

必要条件

ここまでの話から自明なのですが,ShiftIMEの実施にはパソコンに以下の条件が必要になります.

日本語キーボードであること

キートップにひらがなが書かれた普通のキーボードです.日本で売っているPCの大半はこれですので,普通の人は気にする必要はありません.

mayu(またはのどか)が入っていること

Windows版のオリジナルのmayuは今はシェアウェアとなり「のどか」という名前に変わっています. 個人的にはお金を払う価値のあるソフトだと思いますが,そうでない人には結構大きなハードルになります. Linux(Mac)版のmayuはフリーですが,パッケージはないようなので,慣れていない人はインストールに少し手間取るかも知れません.

こんな人におすすめ

ShiftIMEは,日本語の中に英語などの半角文字が多く混ざっているテキストを作成する際に威力を発揮します. なので,以下のような人におすすめです.

初級プログラマ

プログラムコードには通常日本語は含まれませんが,コメントに日本語を使うケースもあります.ShiftIMEでは,特別な操作が必要なのは日本語だけで,コードの大半の英語部分は従来通りの入力が可能ですので,導入しやすいと思います. 一方,ベテランのプログラマはすでに自分なりの対処方法(コメントを全部英語で書くとか)を確立していますので,今さら新しい方法を覚える必要もないでしょう.

理系の人

理系の人はたとえ日本語であっても,文章を書く際に,英語や半角数字を使うことが多いと思います.ShiftIMEの実装はアプリケーションに依存しませんので,WordやPowerpointから流行のWebアプリまでどこでも利用できます.

バリバリのハッカーを目指す人

terminalを住処とし,CLI(command line interface)とvimをこよなく愛するハッカーと言えど,日本に住む限り日本語から逃れることはできません.CLIはどうも日本語との相性が良くないのですが,ShiftIMEでそれが多少でも緩和できるかも知れません. 「バリバリのハッカー」ではなく「目指す人」なのは,バリバリのハッカーであればこんな問題はとっくに(一般人には理解不能な方法で)解決済みだからです.

vimでの利用

そもそもこのために考えたようなものなので当たり前ですが,ShiftIMEを使うことで,vimで日本語を使うときのハードルが大きく下がります.私はこれのおかげでようやくvimで日本語を使えるようになりました.この記事もAtomのvim-mode-plusを使って書いています.

terminalでの利用

昔は英数字のみだったファイル名も,今や日本語を使うことが当たり前になりました. 最近はubuntuなどでも「ダウンロード」だのと言った日本語名のディレクトリを作ってくれたりします. この日本語のファイル名,GUIならいいのですが,コマンドラインから操作しようとすると大変です. コマンド名は英語なので,コマンド入力のたびにIMEのON/OFFを繰り返し,うっかりIMEがONのままコマンドを入力しようとしてギョエーということがたびたびあります. これに耐え切れず,不本意ながらGUIのファイラーを立ち上げて自己嫌悪に陥るハッカーの卵を多数見てきました. というのは冗談ですが,ShiftIMEを使うと,今までGUIでしか触れなかった日本語名のファイルをわりと気軽にterminalで操作できます.

こんな人にはおすすめできません

ShiftIMEは,導入による環境の変化が軽微ですので,わりと導入しやすいと思いますが,以下のような人にはおすすめできません.

英語キーボードしか認めない

世の中には英語キーボード[3]以外認めないという人たちがいます. 確かに日本語キーボードはキートップに使いもしないかな文字が書かれているし「半角/全角」やら「英数」やら漢字も書かれていて何かとダサいのですが,「無変換」キーがなければShiftIMEの実現は物理的に不可能です. ですので「自分は一生英語キーボードを使い続けるZ」という方には物理的におすすめできません.

「無変換」キーを別の用途に使っている

ShiftIMEでは,「無変換」キーをFEPキーとして用いるので,これをすでに他の用途に使っている人は作法の変更が必要になります. 実際私もその一人で,長らく「無変換」を「Ctrl」として使ってきました. FEPキーに追い出された「Ctrl」をどうするか迷った挙句,現在はスペースキーに割り当てています(SandSのShiftをCtrlにしたパターン). なんとか慣れようと頑張っていますが,私自身このせいで将来挫折してしまう可能性も否定できません.

日本語と英語の混在した文章を書くことがない

英語が入っていない文章を書く上では,ShiftIMEには特にメリットはありません. 実際長文のメールを書くときなどは,普通に「全角」でIMEをONにした方が書きやすかったりします. そういう場合は無理をせず,Shiftキーに対するCapsLockのようなイメージで普通に「全角」を使えばいいと思います.

おわりに

こんな単純な方法,絶対誰かがすでにやってると思ったのですが,ネットをちょっと見た限りでは見当たらなさそうだったので公開してみました.

「キーを押しっぱなしで日本語入力」って結構やりづらそうに思えますが,実際やってみると案外いけます.

ShiftIMEを導入しても,変化するのは「無変換」キーの挙動だけで,「全角」キーを使った通常のIMEの切り替えも可能ですので,特に設定を書き換えることなく両方使うことができます.気軽に試してみていただければ幸いです.

脚注

[1] かつてはIMEのことをFEPと呼んでいました.1分で破られる某キーとは特に関係ありません.

[2] 昔お世話になったAltIMEというキーバインディングソフトに対するオマージュが込められているような気もします.

[3] キートップにかな文字が書かれていないキーボード.でかいスペースキーと横長のEnterキーが特徴.