ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。エンジニアの日々の開発などの記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

macでtmuxのキーバインドが 日本語入力中に効かない問題を解決した話。

最近、macOSでtmuxを使っていて、めちゃくちゃイライラする問題にハマってしまいました。

日本語入力モード(IME ON)のときにtmuxのキーバインドが効かないんですよ。

具体的には、tmuxのprefix(自分の場合はControl+t)は普通に認識されるんですが、その後のコマンドキー(nとか m、h、j、k、l など)を押すと、日本語入力の候補が表示されてしまって、結果としてtmuxのキーバインドが発火し ないという状況です。

例えば、Control-t n の次のウィンドウへの移動をやろうとしたが日本語入力として認識されて、「の、内容、なんか...」みたいな変換候補が表示されてしまうんですよね。

そのときは、一度IMEをオフにして再度キーバインドを実行するのですが、地味にストレスが溜まります。。

なぜこの問題が起きるのか?AIに聞いた感じだと、macOSでは、キー入力の処理順序が以下のようになっているとのことです:

  1. IME(日本語入力システム)
  2. ターミナルアプリ(Ghostty、iTerm2など)
  3. tmux
  4. シェル(zsh、bashなど)

つまり、日本語入力モードになっていると、IMEがキー入力を先に処理してしまうため、ターミナルアプリやtmuxに キーが届かないんです。

解決方法:Karabiner-Elementsでサクッと解決

いろいろAIに調べてもらったら、OSレベルでキー入力をフックする必要があるということがわかりました。

そこで、Karabiner-Elementsを使うことにしました。

Karabiner-Elementsとは

Karabiner-Elementsは、macOSでキーボードのカスタマイズを行うための強力なツールです。OSレベルでキー入力を 処理できるため、遅延なくIMEを制御できるのが大きなメリットですね。

手順

  1. Karabiner-Elementsをインストール
  2. 設定ファイルを作成
  3. 設定を有効化

1. Karabiner-Elementsをインストール

まずはインストールから。Homebrewで簡単にインストールできます:

  $ brew install --cask karabiner-elements

インストール後、Karabiner-Elementsアプリを起動して、必要な権限(アクセシビリティ、入力監視)を付与してください。

2. 設定ファイルを作成

以下の内容で設定ファイルを作成しましょう。

ファイルパス: ~/.config/karabiner/assets/complex_modifications/ghostty_tmux_ime.json

  {
    "title": "Ghostty tmux IME control",
    "rules": [
      {
        "description": "Ghosttyでcontrol+t押下時にIMEをオフにする",
        "manipulators": [
          {
            "type": "basic",
            "conditions": [
              {
                "type": "frontmost_application_if",
                "bundle_identifiers": [
                  "^com\\.mitchellh\\.ghostty$"
                ]
              }
            ],
            "from": {
              "key_code": "t",
              "modifiers": {
                "mandatory": [
                  "control"
                ]
              }
            },
            "to": [
              {
                "key_code": "japanese_eisuu"
              },
              {
                "key_code": "t",
                "modifiers": [
                  "control"
                ]
              }
            ]
          }
        ]
      }
    ]
  }

※ 上記はghosttyというターミナルアプリを使っている場合で、他のターミナルアプリを使用している場合は下記で修正方法を説明しています。

※ tmuxのキーバインドのprefixがCtrl+tにしているのでこの設定になっていますが、たぶんほとんどの方は別のprefixにしていると思うので、tのところを変更してください

3. 設定を有効化

設定ファイルを作成したら、Karabiner-Elementsアプリで有効化します:

  1. Karabiner-Elementsアプリを開く
  2. Complex Modifications タブを選択
  3. Add predefined rule ボタンをクリック
  4. Ghostty tmux IME control の "Ghosttyでcontrol+t押下時にIMEをオフにする" を Enable にする

これで設定は完了です!

設定の説明

この設定は以下のように動作します:

  1. Ghosttyがアクティブなときのみ動作(bundle_identifiersで制限)
  2. Control-t が押されると:
    • まず japanese_eisuu(英数キー)を送信してIMEをオフにする
    • その後、Control-t をtmuxに送信
  3. 結果として、次の n や m などのキーが英数モードで入力される

という感じで、遅延なくIMEを制御できるようになります。

他のターミナルアプリを使っている場合

自分はGhosttyを使っているんですが、iTerm2やAlacrittyなど、他のターミナルアプリを使用している場合は、bundle_identifiers を変更すればOKです。

iTerm2の場合:

  "bundle_identifiers": [
    "^com\\.googlecode\\.iterm2$"
  ]

Alacrittyの場合:

  "bundle_identifiers": [
    "^org\\.alacritty$"
  ]

Bundle Identifierは、Karabiner-ElementsのEventViewerでアプリを切り替えると確認できます。

tmuxのprefixキーが異なる場合

tmuxのprefixを Control-b や Control-a など別のキーに設定している場合は、設定ファイルの key_code を変更してください。

Control-bの場合:

  "from": {
    "key_code": "b",
    "modifiers": {
      "mandatory": ["control"]
    }
  }

  "to": [
    {
      "key_code": "japanese_eisuu"
    },
    {
      "key_code": "b",
      "modifiers": ["control"]
    }
  ]

動作確認してみた

設定が完了したら、実際に動作を確認してみましょう:

  1. ターミナル(Ghostty)を開く
  2. 日本語入力モードに切り替える
  3. Control-t g を押す
  4. IMEが自動的に英数モードに切り替わり、tmuxのキーバインドが動作する

やってみたら、すると、なんということでしょう! 日本語入力モード中でも、指定したキーバインドを実行することができました!

めちゃくちゃ快適です!

ハマりポイント・注意点

Google日本語入力を使用している場合

select_input_source では正しく動作しない場合があるので、japanese_eisuu キーを使用してください(上記の設定例通りにすればOKです)。

日本語入力中にControlキーを使う場合

Control-a(行頭)、Control-e(行末)、Control-w(単語削除)などは日本語入力モード中でも動作します。この 設定はtmuxのprefixキーのみに適用されるため、通常の編集操作には影響しません。なので、普段の作業は気にせず できますね。

Vimなど他のアプリケーションでも使いたい場合

同様の設定を作成し、bundle_identifiers を変更することで、他のアプリケーションでも同様の動作を実現できますよ。

まとめ

tmuxのキーバインドが日本語入力モード時に効かない問題は、Karabiner-Elementsを使ってOSレベルでIMEを制御す ることで解決できました。

この設定により、日本語入力モードでも快適にtmuxを操作できるようになりました!

お問い合わせプライバシーポリシー制作物