rcmdnk's blog
Last update

日本語入力を支える技術 ~変わり続けるコンピュータと言葉の世界 (WEB+DB PRESS plus)

Macのキー設定アプリの Karabiner-Elements でIMEの状態を見て日本語入力状態かどうか等を判断して キー設定を出来る様になった様です。

Sponsored Links

input_source_if/unless

現在はまだベータ版のみですが、input_sourceも加わりました。 以前Karabinerで出来た様にIMEの状態等を見て判断することも可能になりました。

Karabiner-Elements/NEWS.md

ベータ版はKarabiner-Elementsの環境設定でMiscタブに行って Check for beta updatesを行うとインストールすることが出来ます。

現在のベータ版は11.1.11になります。

新しくシステムにアクセスする部分があるためか、アップデート後起動する時に セキュリティーに関して聞かれ、システム環境設定のセキュリティーとプライバシー一般タブで許可を行う必要があります。起動時のウィザードで開かれるのが プライバシータブなのでちょっと戸惑いましたが一般タブで許可することが出来ます。

定義としてはこんな感じで行います。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"conditions": [
  {
    "type": "input_source_if",
    "input_sources": [
      {
        "input_source_id": "^com\\.apple\\.keylayout\\.US$"
      },
      {
        "input_mode_id": "^com\\.apple\\.inputmethod\\.Japanese\\.FullWidthRoman"
      },
      {
        "language": "^en$"
      }
    ]
  }
]

もし、IMEの状態で日本語入力モードになっている時、を指定したい時は

1
2
3
{
  "language": "ja"
}

を使えばOK。 これらの指定は指定文字列を含む場合、といった感じで指定されるらしく、 ^$は正規表現で文頭、文末なので上の^en$ではenを含む様な文字列は除きenのみの場合のみに適用されます。 jaでもそうした方が確実ですが、通常英語以外とは一緒に使わないでしょうし、 jaを含む他のものも多分無いので大概の場合jaだけで大丈夫。

今の状態がどの様なものか、というのはKarabiner-EventViewerで Variablesのタブでinput_source_identifiersとしてチェックできます。

"input_source_identifiers": {
  "input_mode_id": "com.apple.inputmethod.Roman",
  "input_source_id": "com.google.inputmethod.Japanese.Roman",
  "language": "en"
},

とか(Google日本語入力英数)

"input_source_identifiers": {
  "input_mode_id": "com.apple.inputmethod.Japanese",
  "input_source_id": "com.google.inputmethod.Japanese.base",
  "language": "ja"
},

とか(Google日本語入力ひらがな)

"input_source_identifiers": {
  "input_mode_id": "com.apple.inputmethod.Japanese",
  "input_source_id": "com.apple.inputmethod.Kotoeri.Japanese",
  "language": "ja"
},

とか(Apple日本語入力ひらがな)。

AppleのIMEはことえりという名前を出さなくなりましたが中の識別子としてはKotoeriな様です。

KE-complex_modifications/example_input_source.json

Karabiner-Elements/input_source.json

また、IMEの状態を買えるために英数入力にするだけなら"key_code": "japanese_eisuu"を使えば 変更が出来ますが、 それ以外に色々やりたいときなど、select_input_sourceという入力が使える様になっています。

KE-complex_modifications/example_select_input_source.json

VimでNormalモード切り替え時にIMEをOFFにする

これによってVimでのIME OFFの設定が以前Karabinerでやっていたのと同じ様に出来るようになりました。

以前はどの状態でもESCを押した際、 EISUESCESCを実行する様にしていました。

EISU自体は英数入力の状態であれば何もしないのでそれほど問題のない設定です。

ESCを二回してるのは変換中とかに押した時に中途半端に英数状態に戻してInsertモードに残るのを避けたいため。

ここを一回にしておけば通常のESCと全く同じなので問題なのですが、 二回にしようとするとちょっと問題が出ます。

問題になるのはGNU screenでのコピーモード。 コピーモードにはPrefix+ESCで入りますが、 コピーモード中にESCを押すとコピーモードを終了します。

つまり二回押すと始まった瞬間に終わります。

これを避けるために.screenrc

bindkey -m ^[ eval ''

と、コピーモード時にESCは何もしないような設定を入れてました。

これでもそれ程困ってませんでしたが、せっかくinput_source_ifが出来たのでそれを使って作り直しました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{
  "description": "ESC sends EISU ESC ESC when language is ja",
  "manipulators": [
    {
      "type": "basic",
      "from": {
        "key_code": "escape"
      },
      "to": [
        {
          "key_code": "japanese_eisuu"
        },
        {
          "key_code": "escape"
        },
        {
          "key_code": "escape"
        }
      ],
      "conditions": [
        {
          "type": "input_source_if",
          "input_sources": [
            {
              "language": "ja"
            }
          ]
        }
      ]
    }
  ]
},
{
  "description": "Control-[ sends EISU ESC ESC when language is ja",
  "manipulators": [
    {
      "type": "basic",
      "from": {
        "key_code": "open_bracket",
        "modifiers": {
          "mandatory": [
            "control"
          ]
        }
      },
      "to": [
        {
          "key_code": "japanese_eisuu"
        },
        {
          "key_code": "escape"
        },
        {
          "key_code": "escape"
        }
      ],
      "conditions": [
        {
          "type": "input_source_if",
          "input_sources": [
            {
              "language": "ja"
            }
          ]
        }
      ]
    }
  ]
}

ESC-[について設定。

この設定は以下のページからもインポートできます。

/KE-complex_modifications/

ただし、このページにあるESC sends EISU ESC ESC when language is jaとかは ターミナルやVim上だけで有効になるようになっています。

これはVim emulationとの競合を避けるためですが、まあ他の場所では必要ないと思うので。

ちなみにオフィシャルKarabiner-Elements complex_modificationsにも EISUESCだけを送る設定があります。

Karabiner-Elements complex_modifications rules

追記: 2017/11/06

OSアップデートで10.13.1になり、それが原因かどうか定かではありませんが、 アップデートの再起動後、 Ctrl-[でVimのノーマルモードに戻る際に何か変だな、と思ったら日本語入力のままになっていて 調べてみた所 input_source_identifiersがIMEの切り替えをしても変更されなくなってました。

普段はGoogle日本語入力だけのひらがな英数を使っています。

Karabiner-Elementsをアップデートして再起動したりOSを再起動しても上手くいきませんでしたが、 通常Google日本語入力だけのひらがな英数を使っている所、 一度キーボードの環境設定からAppleの日本語(ことえり)を追加して切り替えたりしてみたところ input_source_identifiersが変更される様になり、 日本語を削除しても変更がちゃんと反映される様になりました。

何かしら特殊な条件が重なっただけかもしれませんが、 input_source_ifなどの設定が上手く動かない、という場合には Karabiner-EventViewerでチェックして、 もしinput_source_identifiersが動かない様であれば 他の言語を入力ソースに追加していじってみるときちんと動き出す可能性があります。

追記ここまで

Sponsored Links
Sponsored Links

« iPhone Xを予約した Vim Vixen: Vimperatorの代わりになるかもしれないアドオン »