コンテンツにスキップ

ターミナルセットアップ

Pi は信頼性の高い修飾キー検出のために Kitty キーボードプロトコル を使用します。ほとんどのモダンターミナルがこのプロトコルをサポートしますが、一部は設定が必要です。

そのまま動作します。

Pi は利用可能な場合に拡張キー報告を有効化します。Terminal.app が Shift+Enter に plain Return を送り続ける場合、pi はローカル macOS 修飾キーフォールバックを使い、その Return を Shift+Enter として扱います。

このフォールバックは pi が Terminal.app と同じ Mac 上で動作するときのみ機能します。リモート SSH 経由ではローカルキーボードを検出できません。

Ghostty 設定(macOS では ~/Library/Application Support/com.mitchellh.ghostty/config、Linux では ~/.config/ghostty/config)に追加:

keybind = alt+backspace=text:\x1b\x7f

古い Claude Code バージョンがこの Ghostty マッピングを追加している場合があります:

keybind = shift+enter=text:\n

このマッピングは生の改行バイトを送信します。pi 内部では Ctrl+J と区別できないため、tmux と pi は本物の shift+enter キーイベントを受け取れません。

Claude Code 2.x 以降だけが理由なら削除できます。ただし tmux で Claude Code を使う場合はその Ghostty マッピングが依然必要です。

そのリマップ経由で tmux 内の Shift+Enter を維持したい場合、~/.pi/agent/keybindings.json の pi newLine キーバインドに ctrl+j を追加:

{
"newLine": ["shift+enter", "ctrl+j"]
}

WezTerm は通常 xterm modifyOtherKeys 経由で Shift+Enter がそのまま動作します。Kitty キーボードプロトコルを明示的に使うには ~/.wezterm.lua を作成:

local wezterm = require 'wezterm'
local config = wezterm.config_builder()
config.enable_kitty_keyboard = true
return config

macOS では WezTerm がデフォルトで Option+Enter を全画面にバインドします。pi のフォローアップキューに Option+Enter を使うにはこのキーオーバーライドを追加:

local wezterm = require 'wezterm'
local config = wezterm.config_builder()
config.keys = {
{
key = 'Enter',
mods = 'ALT',
action = wezterm.action.SendString('\x1b[13;3u'),
},
}
return config

既に config.keys テーブルがある場合はそこにエントリを追加。

WSL では IME 候補ウィンドウ位置のため可視ハードウェアカーソルが必要な場合があります。CJK IME 候補がテキストカーソルに追従しない場合、pi 実行前に PI_HARDWARE_CURSOR=1 を設定するか、設定で showHardwareCursortrue に。

Alacritty は通常 Shift+Enter がそのまま動作します。macOS では Option+Enter が plain Enter として届く場合があります。pi フォローアップキューに Option+Enter を使うには ~/.config/alacritty/alacritty.toml に追加:

[[keyboard.bindings]]
key = "Enter"
mods = "Alt"
chars = "\u001b[13;3u"

設定変更後 Alacritty を再起動。

VS Code 1.109.5 以降は統合ターミナルで Kitty キーボードプロトコルをデフォルト有効化するため、Shift+Enter はそのまま動作するはずです。

1.109.5 未満の VS Code では Shift+Enter 用の明示的ターミナルキーバインドが必要です。

keybindings.json の場所:

  • macOS:~/Library/Application Support/Code/User/keybindings.json
  • Linux:~/.config/Code/User/keybindings.json
  • Windows:%APPDATA%\\Code\\User\\keybindings.json

keybindings.json に追加:

{
"key": "shift+enter",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "\u001b[13;2u" },
"when": "terminalFocus"
}

pi が使う修飾 Enter キーを転送するため settings.json に追加(Ctrl+Shift+, または 設定 → JSON ファイルを開く):

{
"actions": [
{
"command": { "action": "sendInput", "input": "\u001b[13;2u" },
"keys": "shift+enter"
},
{
"command": { "action": "sendInput", "input": "\u001b[13;3u" },
"keys": "alt+enter"
}
]
}
  • Shift+Enter は改行を挿入。
  • Windows Terminal はデフォルトで Alt+Enter を全画面にバインド。pi がフォローアップキュー用の Alt+Enter を受け取れません。
  • Alt+EntersendInput にリマップすると本物のキーコードが pi に転送されます。

既に actions 配列がある場合はオブジェクトを追加。古い全画面動作が残る場合は Windows Terminal を完全に閉じて再起動。

これらのターミナルはエスケープシーケンスサポートが限定的です。Ctrl+EnterShift+Enter など修飾 Enter は plain Enter と区別できず、submit: ["ctrl+enter"] などのカスタムキーバインドが動作しません。

最高の体験には Kitty キーボードプロトコルをサポートするターミナルを使用:

組み込みターミナルはエスケープシーケンスサポートが限定的です。IntelliJ ターミナルでは Shift+Enter を Enter と区別できません。

ハードウェアカーソルを表示したい場合、pi 実行前に PI_HARDWARE_CURSOR=1 を設定(互換性のためデフォルト無効)。

最高の体験には専用ターミナルエミュレータの使用を検討。