👻

Ghostty + Claude Code で快適なターミナル開発環境を構築する

に公開

はじめに

ターミナルで過ごす時間が長いエンジニアにとって、ターミナルエミュレータと開発ツールの選択は生産性に直結します。この記事では、高速ターミナルエミュレータ Ghostty と AI コーディングアシスタント Claude Code を組み合わせた開発環境について、実際に使っている設定とともに紹介します。

なお、筆者の環境は macOS(JIS キーボード)です。設定ファイルのパスやキーバインドは macOS を前提としていますので、Linux をお使いの方は適宜読み替えてください。

Ghostty とは

Ghostty は、Zig で書かれた高速なターミナルエミュレータです。

  • GPU アクセラレーション によるスムーズな描画
  • macOS / Linux 対応(Windows は 2026年2月時点では未対応)
  • ネイティブ UI を採用しており、OS に馴染むデザイン
  • 設定ファイルベースのシンプルな設定方式

iTerm2 や Alacritty からの乗り換え先として注目されており、動作の軽快さと設定のシンプルさが魅力です。

Ghostty のおすすめ設定

Ghostty の設定ファイルは ~/Library/Application Support/com.mitchellh.ghostty/config(macOS の場合)に配置します。以下は実際に使っている設定です。

起動時にウィンドウを最大化

maximize = true

ターミナルは常に最大化して使いたい派なので、起動時に自動で最大化されるようにしています。

JIS キーボード対応: タブ移動のキーバインドをスワップ

keybind = super+shift+bracket_left=next_tab
keybind = super+shift+bracket_right=previous_tab

JIS キーボードでは [] のキーコードが US 配列と逆になるため、Cmd+Shift+[ / Cmd+Shift+] でのタブ移動が直感と逆になります。アクションをスワップすることで、見た目通りの方向にタブ移動できるようになります。

TERM を xterm-256color に設定

term = xterm-256color

Ghostty はデフォルトで TERM=xterm-ghostty を設定しますが、古いサーバー(CentOS 7 など)には xterm-ghostty の terminfo がインストールされていないため、SSH 接続時にさまざまな問題が発生します。xterm-256color はほぼすべてのサーバーで対応しているため、互換性を重視する場合はこの設定がおすすめです。

Ctrl+L で画面クリア

keybind = ctrl+l=text:\x0c

Ctrl+L で画面クリアする操作は多くのターミナルで標準的ですが、Ghostty ではデフォルトで別の動作に割り当てられている場合があります。明示的に \x0c(フォームフィード)を送信するよう設定することで、確実に画面クリアが動作します。

Ctrl+M で Enter 送信

keybind = ctrl+m=text:\r

Ctrl+M は本来キャリッジリターン(\r)を送信するキーですが、環境によっては期待通りに動かないことがあります。明示的に設定しておくと安心です。

JIS キーボード対応: Ctrl+[ で ESC を送信

keybind = ctrl+bracket_right=text:\x1b

Ctrl+[ は ESC キーの代替として vi/vim ユーザーに広く使われているキーバインドです。しかし JIS キーボードでは [] のキーコードが入れ替わるため、Ghostty が Ctrl+[ を正しく ESC(0x1B)として認識できず、代わりに kitty keyboard protocol のシーケンス(ESC[91;5u)を送信してしまいます。

新しい vim はこのプロトコルを理解できますが、古いサーバー(CentOS 7 など)の vi はこのシーケンスを解釈できず、各文字を個別の vi コマンドとして実行してしまい、意図しない行削除などの誤動作が発生します。

JIS キーボードではキーコードが逆になるため、bracket_left ではなく bracket_right を指定する必要があります。タブ移動のスワップと同じ考え方です。

Claude Code とは

Claude Code は、Anthropic が提供する公式の CLI AI コーディングアシスタントです。ターミナル上で直接動作し、コードの生成・編集・デバッグ・リファクタリングなどを対話的に行えます。

ターミナルで動作するため、Ghostty との相性が良く、普段の開発ワークフローにシームレスに組み込めるのが大きな利点です。

Claude Code のおすすめ設定

Claude Code は設定ファイルやカスタムコマンドで柔軟にカスタマイズできます。

CLAUDE.md でコンテキストを共有

Claude Code は CLAUDE.md ファイルを読み込んで、プロジェクトのルールやコンテキストを理解します。

  • グローバル設定~/.claude/CLAUDE.md): 全プロジェクト共通のルール
  • プロジェクト設定プロジェクトルート/CLAUDE.md): プロジェクト固有のルール

例えば、グローバル設定で「コミットメッセージは日本語で書く」といったルールを定義しておくと、どのプロジェクトでもそのルールに従ってくれます。

カスタムコマンド

~/.claude/commands/ にマークダウンファイルを配置すると、スラッシュコマンドとして呼び出せます。

コマンド 説明
/commit-msg 変更内容を分析して適切なコミットメッセージを生成
/pr-desc PR の説明マークダウンを生成してクリップボードにコピー

定型作業をコマンド化しておくと、毎回プロンプトを書く手間が省けて便利です。

settings.json で権限とモデルを制御

~/.claude/settings.json でモデルの選択や権限の制御ができます。

{
  "model": "opus",
  "permissions": {
    "deny": [
      "Bash(git commit :*)",
      "Bash(git push :*)",
      "Bash(git merge :*)",
      "Bash(git rebase :*)",
      "Bash(rm -rf /*)",
      "Bash(sudo :*)"
    ]
  }
}

deny で危険な操作を明示的に禁止しておくことで、意図しない破壊的操作を防げます。git の commit や push は毎回確認してから実行したいので、自動実行を禁止しています。

LSP プラグインでコード理解を強化

settings.json の enabledPlugins で LSP(Language Server Protocol)プラグインを有効にできます。

{
  "enabledPlugins": {
    "rust-analyzer-lsp@claude-plugins-official": true,
    "typescript-lsp@claude-plugins-official": true,
    "pyright-lsp@claude-plugins-official": true,
    "php-lsp@claude-plugins-official": true
  }
}

LSP を有効にすると、Claude Code がプロジェクトの型情報やシンボル定義を参照できるようになり、より正確なコード生成・修正が期待できます。対応言語のプロジェクトで作業する場合はオンにしておくのがおすすめです。

MCP サーバー連携で外部ツールとつなぐ

Claude Code は MCP(Model Context Protocol)を通じて外部ツールと連携できます。筆者は以下のような MCP サーバーを接続しています。

MCP サーバー 用途
Obsidian ナレッジベースの参照・更新。技術調査や意思決定の記録を蓄積
GitHub Issue・PR の作成や確認をターミナルから直接操作
PostgreSQL データベースへのクエリ実行。テーブル確認やデータ調査に活用
Playwright ブラウザ操作の自動化。E2E テストやスクレイピングに利用

MCP サーバーの設定は ~/.claude/mcp.json やプロジェクトごとの .mcp.json に記述します。ターミナルから離れずに様々なツールを操作できるのが Claude Code の大きな強みです。

Ghostty で SSH 接続すると Ctrl+L が効かない問題

Ghostty はデフォルトで TERM=xterm-ghostty を設定します。SSH でリモートサーバーに接続すると、この TERM 値がそのまま引き継がれますが、リモート側には xterm-ghostty の terminfo がインストールされていないため、シェルが端末の機能を正しく認識できず Ctrl+L による画面クリアなどが動作しなくなります。

解決策: TERM を xterm-256color に設定する

前述の通り、Ghostty の設定で term = xterm-256color を指定するのが最もシンプルな解決策です。

サーバーが多数ある場合、すべてに terminfo をインストールするのは現実的ではありません。ローカルの設定だけで完結させましょう。

なお、ローカルでは xterm-ghostty を維持したい場合は、~/.zshrc に SSH ラッパー関数を追加する方法もあります:

ssh() {
  TERM=xterm-256color command ssh "$@"
}

Ghostty + JIS キーボードで Ctrl+[ が ESC にならない問題

症状

CentOS 7 など古いサーバーに SSH 接続し、vi で Ctrl+[(ESC の代替操作)を押すと、Insert モードから Normal モードに戻るのではなく、1行が削除されるという現象が発生しました。Amazon Linux 2023 など新しいサーバーでは問題ありません。

原因

cat -vCtrl+[ を押すと、期待される ^[(ESC)ではなく、以下のシーケンスが送信されていました:

^[[91;5u

これは kitty keyboard protocol のエンコーディングです(91[ の Unicode コードポイント、5 は Ctrl 修飾キー)。

JIS キーボードでは [] のキーコードが US 配列と入れ替わるため、Ghostty が Ctrl+[ を従来の ESC 文字(0x1B)に変換できず、kitty keyboard protocol でエンコードした CSI シーケンスとして送信していました。

新しい vim はこのプロトコルを理解するため正常に動作しますが、CentOS 7 の古い vi はこのシーケンスを理解できず、[91;5u の各文字を vi コマンドとして解釈し、意図しない行削除が発生していました。

解決策

Ghostty の設定に以下のキーバインドを追加します:

keybind = ctrl+bracket_right=text:\x1b

JIS キーボードではキーコードが逆になるため、bracket_left ではなく bracket_right を指定する点に注意してください。これはタブ移動のスワップと同じ考え方です。

調査の流れ

  1. term = xterm-256color を設定 → 改善せず(terminfo の問題ではなかった)
  2. cat -v で実際に送信されるシーケンスを確認 → kitty keyboard protocol が原因と判明
  3. keybind = ctrl+bracket_left=text:\x1b を追加 → 効かない
  4. JIS キーボードのキーコード入れ替わりを考慮し ctrl+bracket_right に変更 → 解決

まとめ

Ghostty と Claude Code を組み合わせることで、高速で快適なターミナル開発環境が構築できます。

  • Ghostty: 軽快な動作と設定のシンプルさで、日常のターミナル操作がストレスフリーに
  • Claude Code: ターミナルから離れることなく AI の支援を受けられ、開発効率が向上
  • SSH 時の TERM 問題: term = xterm-256color の設定で解決
  • JIS キーボード + Ctrl+[: keybind でキーコードの入れ替わりに対応

どちらもシンプルな設定ファイルベースで管理できるので、環境の再現性が高いのもポイントです。ぜひ試してみてください。

株式会社スプリックス IT戦略部・SPRIX Enginieering Lab

Discussion