macOSのSafariでGeminiの入力欄で日本語入力の確定が暴発して送信される件

数日前から、Geminiの入力欄で日本語入力のEnterキーの確定が暴発して途中で送信されてしまうようになりました。

昔SafariでGoogle Chatを使っていたときにも起こっていた気がするけど、そのときはチャットは細切れに送信してくる人と思われるだけだから、(相手は迷惑だったと思うが)諦めて使っていたように思います。

Geminiは途中で送信されるとその時点で回答が生成されてしまう。また、プロンプトを修正しようにも修正中にもEnterが暴発するので、大変なストレス。
いちいちエディタに入力するのも面倒だし、回答が来たらついそのまま入力してまた暴発。

非常にやっかい。

Chromeではいくつか対策の拡張機能があるようです。

IME Enter Guard
https://chromewebstore.google.com/detail/ime-enter-guard/fnlaeanklgpfabpnigjclmhegafolnnj

Gemini IME Fix
https://chromewebstore.google.com/detail/gemini-ime-fix/lnpdamklbgfcphohjgdgbbjbaencahgg

Chromeでは多分起きないと思うんだけど、macOSではSafariを使いたい。

というわけで、自分で修正する方法をGeminiに聞いたり自分でググったところありました。

YouTubeでも解説している方がおり、前半は自作ソフトの開発の話ですが、後半は世に出ているサービスの対策でした。
https://www.youtube.com/watch?v=5-aHE9qREyE&t=275s

JavaScriptを自分で動かして介入することで対応できるようです。

Safariの場合は、Userscriptsという拡張機能で、任意のJavaScriptを動かすことができます。

Userscripts
https://apps.apple.com/jp/app/userscripts/id1463298887

また、インストール版のAdGuardであれば、AdGuardの設定の拡張機能から任意のJavaScriptを動かすことができます。

最初はAdGuardでそのような機能があるのを知らず、Userscriptsで対応したのですが、
元からAdGuardを使用しているので、Safariの拡張機能を増やす必要もないので最終的にAdGuardで対応しました。

UserscriptsもAdGuardもコードは共通です。

@matchは複数行記載可能なので、ほかのドメインでも暴発が起きたら、行を増やして対応できます。

変換中の判定はisComposingだけだと足りないようで、deprecatedであるkeyCodeもないと暴発しました。

// ==UserScript==
// @name        Enter Key Fix
// @match       https://*.google.com/*
// @grant       none
// ==/UserScript==

window.addEventListener('keydown', (e) => {
  // 「Enterキー」の入力
  if (e.key === 'Enter') {
    // 変換中である証拠(isComposingまたはkeyCode 229)があれば止める
    if (e.isComposing || e.keyCode === 229) {
      e.stopPropagation();
    }
  }
}, true);