IME切り替えを視覚化するHammerspoonスクリプト

自分自身の困りごと解決のために作成した、Hammerspoonのスクリプトをご紹介します。

![230702_ime_fb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/e57fb3df-b98c-645b-02e2-53701f01554f.png)

このスクリプトは、IME（Input Method Editor）の切り替えをユーザーにフィードバックとして知らせるものです。自分がキー入力を行った際に、IMEが意図したように切り替わっているかどうかを目視で確認できます。

:::note info
[Hammerspoon](http://www.hammerspoon.org)は、macOS用の自動化ツールです。lua言語でスクリプトを記述し、いろいろな機能をmacOSに追加できます。
:::

## スクリプトをつくった背景

わたし自身、キーボードを変更したり、ESCキーに特定の機能を割り当てたりすることで、意図した通りにIMEが切り替わっていないケースがありました。これらの状況は、特に一つのキーでIMEを切り替えているMacユーザーにとって「あるある」な問題ではないでしょうか。

:::note info
macOSでUSキーボードをつかう場合、`左command = 英数`、`右command = かな`に割り当てている人が多いと思います。日本製のキーボードは、スペースキーが狭く、右commandが押しやすいところにありますが、NuPhyやKeychroneなど海外製キーボードは、右commandが遠くて押しにくいことがあります。
:::

## このスクリプトを利用するメリット

このスクリプトは、IMEのON/OFF切り替えを即座に視覚的に確認できるようにすることで、上記の問題を改善します。また、表示スタイルのパラメータ（背景色、テキスト色、フォント、フォントサイズなど）は自由にカスタマイズ可能で、各ユーザーの好みや必要に合わせて調整できます。

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/c09b5826-cf2b-ef95-1775-8e2ef9a7e577.gif)


## スクリプトの説明

このスクリプト（ime_switch_feedback.lua）はとても簡単に使うことができます。Hammerspoonの`init.lua`にこのモジュールをrequireするだけで、IMEの状態変更のためのコールバックが自動的に設定され、新しい状態のアラートが表示されます。

まず、`~/.hammerspoon/init.lua`に下記の１行を加えます。

```init.lua
require("ime_switch_feedback")
```

## メインのコード

次に、`~/.hammerspoon/ime_switch_feedback.lua`に、下記を記述します。


```ime_switch_feedback.lua
local alertStyle = {
    strokeWidth  = 0,  -- ボーダーの幅
    fillColor    = { white = 0.7, alpha = 0.2 },  -- 塗りつぶしの色
    textColor    = { white = 0.5, alpha = 0.6 },  -- テキストの色
    textFont     = ".AppleSystemUIFont",  -- フォント
    textSize     = 72,  -- フォントサイズ
    atScreenEdge = 0,  --  0: screen center (default); 1: top edge; 2: bottom edge
    fadeInDuration = 0.5,
    fadeOutDuration = 0.5,
}

local function keyChangeCallback()
    local currentIME = hs.keycodes.currentMethod()
    if currentIME then
        if currentIME == "Hiragana (Google)" then
            currentIME = "あ"
        elseif currentIME == "Alphanumeric (Google)" then
            currentIME = " A "
        end
        hs.alert.show(currentIME, alertStyle, 1.5)
    end
end

hs.keycodes.inputSourceChanged(keyChangeCallback)
```

:::note warn
ファイル名は`ime_switch_feedback.lua`で、requireのときは`ime_switch_feedback`で呼び出します。
:::

スクリプトのメイン部分は、IMEの変更を監視し、変更が検出されたときにアラートを表示する機能です。アラートの表示スタイルは`alertStyle`で設定され、IMEがひらがなまたはアルファベットに切り替えられた場合のメッセージは`keyChangeCallback`関数で定義されています。

`hs.keycodes.currentMethod()`は現在のIMEを取得し、その値に基づいて表示するアラートのメッセージを決定します。切り替えが行われると、`hs.alert.show(currentIME, alertStyle, 1.5)`が実行され、新しいIMEの状態がスクリーンに表示されます。

わたしが選んだパラメータ設定は、ダークモードでもライトモードでも見やすく、大きすぎず小さすぎず、必要なときにはしっかりと確認でき、必要でないときには無視できる、というバランスを考慮して設定しました。フェードイン・フェードアウトのタイミングも、少しゆっくり目で、落ち着きのある感じを目指しました。

## シンプルさとカスタマイズの容易さ

このスクリプトはシンプルなもので、今のところ追加のアップデートや改善の予定はありません。このスクリプトはすでにシンプルで、またユーザーが自分の好みに応じて容易に設定を変更できるようになっているからです。

また、IMEの状態を表す文字列を"あ"や" A "に設定しているのは、シンプルで美しい表示を目指したからです。これはGoogle 日本語入力のメニューバー表示と一致させることもねらっています。

:::note info
ちなみに、require関数を用いず、`init.lua`に直接`ime_switch_feedback.lua`の内容を記述することも可能です。わたし自身、以前は他の機能を`init.lua`に直書きしていました。その場合、変更や機能追加のときに不便ということがわかりました。ひと手間加えて、require関数でモジュール呼び出しにすることをオススメします。
:::

## まとめ

以上、Hammerspoonを使用してIMEのON/OFF時に視覚的フィードバックを提供するスクリプトのご紹介でした。キーボード操作によるIMEの切り替えが思うように行かないと感じることがあるかたや、IMEの状態を確認しながら作業したいと思うかたにとって、このスクリプトは有用ではないかと思います。ぜひ一度お試しください。