dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

vimでEsc(またはCtrl+[)キーを押した時に自動的に日本語入力モードを解除する

vimmer には地味に嬉しい機能。
ツールを使うため mac 限定です。

TL;DR

ネットで色々調べていると主に次の2つの方法があるよう。

  1. Google 日本語入力 を使う
  2. Karabiner を使う

Esc キーのかわりに Ctrl + [ キーを使用している人 は2の Karabiner を使った方法がおすすめ。
(というか 1 で実現する方法がわからなかった)

Karabiner の Preferences で private.xml に以下のように記述すると有効になる。

KarabinervimでEsc(Ctrl+)を押した時に自動的に日本語入力モードを解除する

それぞれの方法について、手順を書きます。


1. Google 日本語入力を使った方法

参考:SSHを介してVimを使う人に感動的なESCキーを押すとESCキーが効きつつIMEがオフになる設定(Google日本語入力とVimの相性は最強!) - sifue's blog

Google 日本語入力の環境設定を開く。

f:id:dackdive:20150831100557p:plain

「一般」メニューの「キー設定の選択」にある「編集...」ボタンを押す。

f:id:dackdive:20150831100635p:plain

モード:入力文字なし
入力キー:Escape コマンド:キャンセル後 IME を無効化

f:id:dackdive:20150831101313p:plain

問題点

普段 insert mode から normal mode に切り替えるとき Escape キーではなく Ctrl + [ を使っているので、この方法だとだめだった。。。
「入力キー」に Escape キーのかわりに Ctrl + [ を割り当てて試してみたけどうまくいかず。


2. Karabiner を使った方法

参考:[Mac] Vimのインサートモードを抜けるときにIMEをオフにするKeyRemap4MacBookのprivate.xml設定 | memobits

Karabiner の Preferences... を開く。

f:id:dackdive:20150902234005p:plain

上部の「Misc & Uninstall」を選び、「Open private.xml」を押す。

f:id:dackdive:20150902234046p:plain

押すと、Finder で private.xml という設定ファイルのディレクトリが開かれるので
適当なエディタでこのファイルを開き、以下を入力する。

KarabinervimでEsc(Ctrl+)を押した時に自動的に日本語入力モードを解除する

保存したら再度 Preferences... から「Change Key」を選び、
Leave Insert Mode with EISUU... という項目(XML の list > item > name に指定した値)に ✔ を入れる。

これで OK。

private.xml について補足

今回の private.xml では、
「iTerm2 または MacVim を使用している場合のみ、

  • Esc キーを Esc キー→英数キーに
  • Ctrl + [ キーを Ctrl + [ → 英数キーに

それぞれ置換する」という設定を行っている。

private.xml の書き方についてはここにリファレンスがある。
https://pqrs.org/osx/karabiner/xml.html.ja

<item>

xml の最小構成としては以下のように、<item> タグの中に <name><identifier><autogen> タグを記述する。

<?xml version="1.0"?>
<root>
    <item>
        <name><!-- 任意の名前。Change Key の項目に表示される --></name>
        <identifier><!-- ユニークなID。標準設定との衝突を避けるため private. をつけるのを推奨 --></identifier>
        <autogen><!-- コマンド定義 --></autogen>
    </item>
</root>

一番重要なのは <autogen> タグで記述するコマンド定義。
__keyToKey__ というシンタックスの後に KeyCode を記述することで、任意のキーを別のキー入力に置き換えることができる。

たとえば、以下は Space キーを Tab キーに置換する。

<autogen>__KeyToKey__ KeyCode::SPACE, KeyCode::TAB</autogen>

KeyCode の一覧はここにある。
https://github.com/tekezo/Karabiner/blob/version_10.8.0/src/bridge/generator/keycode/data/KeyCode.data

また、特定のキーの KeyCode を調べるには以下の記事を参考に Karabiner のデバッグモードを ON にし、システムログファイルを参照すればいいらしい。
Karabiner の private.xml 設定方法 - Qiita


<appdef>

設定を特定のアプリケーションに対してのみ適用したい場合、<appdef> タグに対象のアプリケーション情報を定義する。

<appdef>
    <appname><!-- アプリケーション名。<item>の<only>タグで使う --></appname>
    <equal><!-- アプリケーション ID --></equal>
</appdef>

<equal> 内に記述するアプリケーション ID については、次のように取得する。
メニューの「Launch EventViewer...」を開く。

f:id:dackdive:20150904093715p:plain

「App」を開く。

f:id:dackdive:20150904093812p:plain

この状態で対象のアプリケーションを開く(または起動中の場合は選択する)と、
テーブルに情報が表示されるので「Application Bundle Identifier」の部分をコピーする。

f:id:dackdive:20150904094102p:plain

最後に、<appdef><name> に記述したアプリケーション名を <item><only> タグ内に書けば OK。

おわりに

この設定のおかげで vim で文章書いてる時のストレスがかなり減った気がします。
普段から Karabiner を使っている人は Karabiner による方法でいいんじゃないでしょうか。
xml の中身をわかってなくてもとりあえず↑の内容をコピペすればいけますし。