rcmdnk's blog
Last update

IME: In My Experience (English Edition) 電子書籍: Steve Reed

Vimで日本語を使っていると、 Normalモード切り替えた後も日本語入力状態になっていて コマンドが効かなくてイライラする事があります。

そのようなイライラを無くすためにEsc等を押して Normalモードに移行する際に必ずIMEをOFFにするような操作を 色々な方法で実現することが出来ますが、 MacではKarabinerを使ってそれを実現していて、 Karabinerが使えないmacOS Sierraではちょっと困っています。

なんとか出来ないかな、ということで取り敢えず AppleScript+BetterTouchToolでやってみました。

Vimでノーマルモード移行時に必ずIMEをOFFにする設定

上のポストにまとめてありますが、 基本、MacではKarabiner、WindowsではAutoHotKeyを使ってコレを実現しています。

GVimとかだとアプリの機能そのものでできたりもします。

MacでAppleScript+BetterTouchToolでやる方法

ところがmacOS SierraではKarabinerがまだ使えないのでこれが使えません。

とりあえずこの設定無しで使ってましたが、 今までIME ONでもすぐにCtrl-[/Escなどでノーマルモードに入るくせが付いてるため 逆に前以上にストレスが溜まる状態になっています。

そこでなんとかしてみようと、やってみたのが AppleScriptとBetterTouchToolの組み合わせ。

ImeOffEsc.scpt
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
property JP_LIST : {"ひらがな"}

-- Get IME status
set imeOn to false
tell application "System Events"
  tell process "SystemUIServer"
    set imeStatus to value of first menu bar item of menu bar 1 whose description is "text input"
  end tell
end tell

-- Check IME status
repeat with j in JP_LIST
  if imeStatus starts with j then
    set imeOn to true
    exit repeat
  end if
end repeat

tell application "System Events"
  set pList to name of every process whose frontmost is true
  set appName to item 1 of pList
  tell process appName
    -- 33: [ (Ctrl-[: 33 using {control down})
    -- 53: ESC
    -- 102: EISU
    if imeOn then
      key code 53
      key code 102
      key code 53
    else
      log ("send ESC")
      key code 53
    end if
  end tell
end tell

こんな感じのAppleScriptを用意。

IMEの状態はメニューバーにあるIMEのアイコンから情報がとってこれます。

とりあえず、日本語入力状態だと、Macの日本語入力だとひらがな、 Google日本語入力だとひらがな (Google)となるので ひらがなから始まる場合にはIME ONだとします。 他のIMEを使っていて違う名前になる場合には適当に JP_LISTに付け加えてあげれば使えます。

基本、最前面にあるウィンドウを対象にして、もしIMEがONである場合、 EscEISUEscを送り、 OFFならEscだけ送ります。

ON時にEscを一度最初に送るのは 変換中であってもキャンセルして英数状態にするためです。

これをBetterTouchToolのKeyboard設定で、 Ctrl[Controlling Other ApplicationsOpen Application / File / AppleScript で割り当てます。

これでVimでインサートモードで日本語入力している時に いきなり Ctrl[を押してもIMEはOFFの状態になり ノーマルモードに入れます。

ちょっと使ってみて、とりあえず動くことは動くんですが、 いくつか問題が出てきました。

まず、AppleScriptで key codeによって送られるキー入力はBetterTouchToolが受け取って解釈するため、 このスクリプトをEsc自体に割り当ててしまうと 無限ループに入ってしまってフリーズします。気をつけてください。

もし、Escを押した時にこの動作を実現したいのであれば、 key code 53を全てkey code 33 using {control down} に書き換えてBetterTouchToolでEscに割り当ててください。 特にこの場合にはApplicationでiTermやTerminalのみの場合にした方が良いと思います。

両方設定してしまうとお互いに行き来する無限ループに入るのでどちらかしか設定できません。

さらなる問題点として、AppleScriptによるキー入力はちょっと時間がかかってしまうので、 Ctrl[入力後にすぐに何か打つと それが入力されてしまうことがあります。 一瞬待たないといけない。

さらに、Ctrl[を素早く2回続けて押してしまうと 以後しばらくこのキー入力が効かなくなってしまうことがあります。 前のスクリプト起動中に次のスタートすると問題なのかなんなのか、 イマイチよく原因が分かりません。

また、上のスクリプトで IMEがOFFの場合をわざわざ分けてEscだけを送るようにしているのは GNU Screenでコピーモードに入るのに Ctrl[を使いたいからですが、 AppleScriptを通してキーを送るとPrerixキーを送ったことがキャンセルされてしまうのか 上手く動作しませんでした。

ということで、とりあえず形としては出来るものが出来ましたが、 上にあげた問題があると逆にストレスが溜まることが多くなったので 使うのを辞めました。

使い方によってはこれでも便利な人もいるかも。

が、やはりKarabiner-Elements でのKarabiner並の設定が出来る日が来るの が待ち遠しい所です。

追記: 2017/03/10

ちょっと違う方法でまた試してみました。

ここで試した方法よりは上手く行っています。

追記ここまで

Sponsored Links
Sponsored Links

« Mac AppleScriptでファイルにログを書き出す Mac BetterTouchToolで左クリックをキーボードショートカットで呼ぶ方法 »

}