macSKK icon indicating copy to clipboard operation
macSKK copied to clipboard

VSCode内で実行するclaude codeで入力がうまくいかない

Open uehaj opened this issue 7 months ago • 14 comments

コマンドライン(文字ターミナル)のAIコーディング支援エージェントであるclaude codeは、純粋なコマンドラインアプリ として使用する以外に、VS CodeやIntelliJ IDEAなどと連携して、半分コマンドラインアプリとして動作しつつ、ある程度のIDE やエディタの連携をおこなうことができます。

https://docs.anthropic.com/ja/docs/claude-code/ide-integrations

しかし、VS Codeの場合の日本語入力がうまくいきません。(IntelliJ IDEAに問題があるかどうかは不明)

具体的には、

  • C-jで改行されてしまう(もともとVSCodeではskkのC-jについては問題がありますが、キーアサインの設定 で対処しており、Claude Code以外は問題ありません)
  • 母音(aioeo)の文字がひらがなに変換されず、そのままa,i,u,e,oが入力される

この2点についてもし可能なら対処策をおしえていただけないでしょうか。

なお上記の問題は、aqua skkでもまったく同じように再現しているので、Claude Code(そしてそこで端末制御 につかわれているInkライブラリ)の問題だとは予想しています。

https://github.com/vadimdemedes/ink

よろしくおねがいいたします。

uehaj avatar Jun 01 '25 03:06 uehaj

しかし、VS Codeの場合の日本語入力がうまくいきません。(IntelliJ IDEAに問題があるかどうかは不明)

報告ありがとうございます。 VS CodeのTerminalなどでC-jでの改行、aiueoなどが入力できない問題があることは知っていましたが、Claude CodeのVS Code拡張でも同様のようですね…。

残念ながら私も対処策はもっていません。Shiftを押しながら入力することで無理矢理入力できはしますが、非常に不便なことは理解できます。

なお上記の問題は、aqua skkでもまったく同じように再現しているので、Claude Code(そしてそこで端末制御 につかわれているInkライブラリ)の問題だとは予想しています。

たしかにInkのリストにClaude Codeがありますね。私もちゃんと調べてはいないのですが、VS CodeのTerminalでも同じ問題があるためVS Code側に問題があるのかと思っていたのですが、Ink側で対処できるなら可能性があるかもしれませんね。

mtgto avatar Jun 03 '25 14:06 mtgto

ジャストアイディアですが、VSCode Terminal / Claude Codeのような環境で無理やりShiftを押しながら入力したと見做す回避入力方法があったら便利かもしれない…? 問題は入力しているテキストフィールドがTerminalなのかエディタなのかmacSKKから取得できる方法があるかどうかもわからないということ。まずはそれを探してみるのはありかもしれない。

mtgto avatar Jun 03 '25 14:06 mtgto

Claude Code拡張の方は見てないですが、VSCodeのIssueを検索してみたところ、Terminal部分にはxterm.js を使っているらしいので、xterm.jsの問題かもしれません。

https://github.com/microsoft/vscode/issues/184777#issuecomment-1846172192

mtgto avatar Jun 03 '25 15:06 mtgto

回答たいへんありがとうございます。

以下、ChatGPT o3に「inkを使ったターミナルアプリの入力で、vs codeのterminalで動かしたときにaquaskkの日本語入力で母音(aiueo)がひらがな入力できず英字で確定してしまう問題の理由や解決策を知りたい」という質問を聞いてみた内容になります。(AquaSKKの質問になっておりますが、状況がちがっておりましたらすみません)。たしかに、xterm.jsのことにも言及があります。自分には以下が妥当かどうか判別ができないのですが、参考になりますでしょうか。Claude Code側の問題なら申しわけないのですが。なお自分はKarabiner-Elementsも使っているので、これを使った回避策でも構わないのですが、糸口がつかめずにおります。

なぜ “あいうえお” が英字で確定してしまうの?

原因:Ink が stdin を “raw mode” にしているため

Ink はキーイベントを 1 文字ずつリアルタイムに受け取る必要があるため、起動時に process.stdin.setRawMode(true) を呼び出します。

Raw mode では OS 側の IME(例:AquaSKK)が 確定前の文字列(プレエディット) を端末に送れず、物理キーのスキャンコード だけが届きます。そのため、「あ」ではなく “a” が届いてしまいます。

出典: GitHub

VS Code 統合ターミナル(xterm.js)のバグ・制限も重なっている

AquaSKK が「キー押下タイミングでひらがなを確定する」方式なのに対し、xterm.js は raw mode 中の IME 合成キーを正しく処理できず、英字のまま流してしまう と報告されています。

出典: GitHub


すぐに試せる回避策

回避策 メリット デメリット
① VS Code 以外の端末で実行
例:macOS Terminal / iTerm2 / Windows Terminal
ほぼ確実に IME が動く VS Code 内で完結しない
② Ink アプリ側で一時的に raw mode を解除
process.stdin.setRawMode(false) を入力待ち中だけ行い、終了時に true に戻す
VS Code でも動かせる/コード側で完結 矢印キーなどの特殊キーが取れなくなる間は UI を自前実装する必要
③ テキスト入力部分だけ readline 等に委譲 既製ライブラリが IME 対応済み Ink と readline の表示をうまくレイアウトする工夫が必要
④ VS Code を最新安定版へ更新
(v1.99 以降で IME 周りの修正が継続中)
すでに最新版を使う場合は不要 根本解決には至らないことも

② raw mode の一時解除 ― 最小コード例

import React, {useEffect} from 'react';
import {render, Text, useApp} from 'ink';

const App = () => {
  const {exit} = useApp();

  useEffect(() => {
    const stdin = process.stdin;
    // ★ ここで rawMode を切る
    stdin.setRawMode(false);

    // Ctrl-D で終了できるように
    const onData = (data: Buffer) => {
      if (data.equals(Buffer.from([4]))) exit(); // Ctrl-D
    };
    stdin.on('data', onData);

    return () => {
      stdin.off('data', onData);
      stdin.setRawMode(true);          // ★ 元に戻す
    };
  }, []);

  return <Text>ひらがなで入力できます。Ctrl-D で終了。</Text>;
};

render(<App />);

ポイント

  • raw mode を切ると IME が使える
  • 反面、Ink 標準の <TextInput><useInput> で読めていた 矢印キー・ショートカットが読めなくなります

必要に応じて「入力フェーズでは raw off、メニュー操作フェーズでは raw on」というふうにモードを行き来させると、IME とキーボード操作を両立できます。


もう少し踏み込んだ対処

  • xterm.js の issue を追う
    IME 関連の改善は活発に行われているため、VS Code の Insiders ビルドで動作確認すると早めに恩恵を受けられます。

  • AquaSKK のキー設定を変更する
    AquaSKK 側で「かな/英数」切替を物理キー頼みにせず、Ctrl-J → 確定 方式に変えると、raw mode 端末でも英数が混ざる事故を減らせます。

    出典: Zenn

  • Ink の experimental オプションを試す
    最新 Ink 5 には isRawModeSupported()false 時のフォールバックや exitOnCtrlC の改善が入っています。
    バージョンを上げるだけで VS Code のエラーが静まるケースもあります。

    出典: GitHub


まとめ

  • 原因:Ink が必須とする raw mode と、VS Code 統合ターミナルの IME 処理の相性
  • 最も手軽:外部ターミナルで実行すること
  • VS Code 内で完結させたい入力時だけ raw mode を解除する実装が定番です

uehaj avatar Jun 04 '25 05:06 uehaj

xterm.js のバグのようなので報告しました https://github.com/xtermjs/xterm.js/issues/5348 。ちなみに別に Claude Code 限定というわけではなくVSCodeのターミナル内ならいつでも (zsh とかでも) 起こる認識です。

rinsuki avatar Jun 04 '25 22:06 rinsuki

ありがとうございます。VSCode Terminalで常におこるという点も了解です。 チケットをみるとSafariやFirefoxでは起きないのですね。ならvscode-serverにしてfirefox/safariで使うということも回避策にはなりそうですね。

細かいところ、[と]が「と」になってくれない、ということも気づきました。うまくいくのは「シフト+アルファベット」で、Ka、Ki、Ku、Ke、Koがうまくいくように見えるのは「シフトキーがおされているから」でこちらが例外なのかもしれません。

uehaj avatar Jun 05 '25 02:06 uehaj

Issue報告ありがとうございます。

うまくいくのは「シフト+アルファベット」で、Ka、Ki、Ku、Ke、Koがうまくいくように見えるのは「シフトキーがおされているから」でこちらが例外なのかもしれません。

シフトキーが押されているキーが大丈夫なのはシフト + アルファベットの時点で「未確定文字列」と呼ばれる、下線がある状態の文字列の状態に最初なっているからだと推測しています。テキストエディタ側は未確定文字列が入力中の場合はIMEでの変換確定前なので入力されたと見做さない、という処理をしているのだと思います。

これも駄目元の思いつきですが、じゃあaだけ押したときに、一瞬だけ未確定文字列が入力されたようにテキストエディタに伝えて、すぐに確定したと送ってあげれば「あ」が入力できるのではないか? という気がしたのでちょっと試してみようと思います。

ただしうまくいったとしてもこれはワークアラウンドとか回避策とか呼ばれるべきものなので、xterm.js側なりClaude Codeが使っているテキストエディタなりがIMEからの応答をみて処理してくれるほうがほんとうはmacOSのテキストエディタとしては正しいです。

mtgto avatar Jun 05 '25 10:06 mtgto

これも駄目元の思いつきですが、じゃあaだけ押したときに、一瞬だけ未確定文字列が入力されたようにテキストエディタに伝えて、すぐに確定したと送ってあげれば「あ」が入力できるのではないか? という気がしたのでちょっと試してみようと思います。

これ試してみたのですが、だめでした。aiueoの場合そのままaiueoが入力されてしまいました。残念。 未確定入力を送った直後に確定するのがいけないのかもしれません。

mtgto avatar Jun 05 '25 14:06 mtgto

私の環境ではVSCode TerminalもVSCode Claude Codeも ka や sa など、2文字以上からなるローマ字はシフトなしでも入力できるようにみえます。 これはおそらく一文字目の入力ではmacSKKが「ローマ字として確定してない」ため入力中を表す未確定文字列を表示しろ、と指定しているからと思われます。

ワークアラウンドとして、aiueoのように1文字で確定するアルファベットのみkやsのように「あいうえお」を未確定文字列として表示するように要求しておきEnterや他のアルファベットを入力した時点で確定させるようにすればいけるかもしれません。 うまくいってもひらがな入力中にaiueoが即入力されないのはちょっと違和感はあるとは思いますが、急にaiuoeが入力されるよりはましな気がします。 実装が必要なのでぱっとは試せないのですが、実装して試してみようと思います。

もしうまくいったらqやlがそのまま入力されてしまうのも、未確定文字列で例えば [モード変更: カタカナ] とかを表示するようにすればそのまま入力されてしまう問題もマシになるかも。

mtgto avatar Jun 07 '25 02:06 mtgto

ワークアラウンドとして、aiueoのように1文字で確定するアルファベットのみkやsのように「あいうえお」を未確定文字列として表示するように要求しておきEnterや他のアルファベットを入力した時点で確定させるようにすればいけるかもしれません。

このワークアラウンドを簡単に実装してみたところ、HyperやVSCodeのターミナルでもaiueoであいうえおが入力できるようになるようです。 Hyperで動画を録ってみました。

https://github.com/user-attachments/assets/d4b1eb5b-5d8e-4ea0-8894-bc783e219025

mtgto avatar Jun 14 '25 14:06 mtgto

v2.1.0で入力メニューに「1文字目を未確定扱い (互換性)」という設定を追加してみました。 私の環境ではVSCodeのターミナルやClaude Code拡張でもaiueoが打てるようになっています。 よかったら試していただければ助かります。 https://github.com/mtgto/macSKK/releases/tag/2.1.0

mtgto avatar Jun 21 '25 13:06 mtgto

確認しました。ありがとうございます。うまくいきました。aiueoだけでなく、'['→'「'、']'→'」'も OKです。 もとの報告では「ターミナル内でControl+Jで改行されてしまう」という問題も報告させて もらっていましたが、それは別問題であり、macSKKでのキーバインドの設定で、 「ひらがなモード」をControl-J以外にすることで解決しました。 ありがとうございました。

uehaj avatar Jun 22 '25 15:06 uehaj

@uehaj 動作確認の報告ありがとうございます。

aiueoだけでなく、'['→'「'、']'→'」'もOKです。

そうですね。このxterm.jsの問題はaiueoだけでなく1キーで全角文字が入力されるようなキーすべてで発生します。 そのようなときに無理やり読み仮名を入力しているようにするのが今回の回避策です。

もとの報告では「ターミナル内でControl+Jで改行されてしまう」という問題も報告させて もらっていましたが、

すみません、最初の話を忘れていました。 qやlによるモード変更と同様に、Ctrl-jによるモード変更も同じように実装してみたところVSCodeのClaude Code拡張では改行よりもモード変更が優先されるようでした。 #364 で対応します。 かわりに改行が打てなくなりますが、例えばOption+Enterなどで改行の代替とできそうです。

mtgto avatar Jun 23 '25 10:06 mtgto

v2.1.1 でCtrl-jによるモード変更もxterm.jsのワークアラウンドに入れました。

https://github.com/mtgto/macSKK/releases/tag/2.1.1

mtgto avatar Jun 27 '25 14:06 mtgto