Codex + GPT-5.2-Codexの組み合わせは、コーディング能力が以前より飛躍的に向上したという手応えがある。
GPT-5.2-Codexはコンテキスト圧縮が強化されており、比較的規模の大きなプロジェクトでも1回の指示でほぼ修正なく作成できるようになっている。
そこで何か実用的なものを作れないかと考え、Windowsでファイルの中身を大きなサイズでも高速に表示できるツールというのを思いついたが、調べたらQuickLookという同じコンセプトのソフトがすでにあった。
テキストビューアの実装について途中まで調査していたので、そのまま習作として作ってみることにした。
今回作るもの
今回作ったのは、いわゆる “軽量なテキストビューア” で、機能としてはかなり割り切っている。
- テキストファイルを開いて表示する
- 折り返し(Wrap)処理ができる
- スクロールで全文を読める
- 大きなファイルを高速に表示する
予備実装
LLMでプロジェクト全体を1度で作成する場合、ある程度条件を決めておかないと、修正指示を何度も行うことになる。
修正指示をするよりも、初めから条件を与える方が、かえって時間がかからず、正しく実装できることが多い。
切り出せるタスクは部分的に事前に実装して、その成果を条件に反映するとよい。
文字コード判定
まず、文字コード判定について、C++で実装する方法について調査した。
Mozillaの文字コード判定で使われているuchardetがC++でよく使われる事が分かった。
これをWindowsで使う方法を調べたところ、NuGetにはビルド済みライブラリは見当たらず、vcpkgでインストールできることが分かった。
vcpkgで、Visual Studioのプロジェクトにライブラリを追加する方法については昨日記事にした。
文字コードのデコード
次に、文字コードのデコード方法について調査した。
ICUがC++でよく使われていることがわかった。
ICUは文字コードのUnicodeへのデコードと、Unicode正規化を行うことができる。
こちらは、NuGetにビルド済みライブラリが登録されているものがあったが、バージョンが古く、Visual Studio 2026では使えなかった。
vcpkgでも試したが、Visual Studio用のビルドにバグがあるようでエラーになった。
リポジトリには、Visual Studio用のソリューションファイルが用意されているので、自前でビルドすることでdllを生成できた。
しかし、データファイルが格納されるDLL(icudt79.dll)のサイズが32MBあり、配布する際にはパッケージサイズが肥大化してしまう。
改善方法を調べていたら、そもそもWindowsには、Windows 10 Creators Update以降、ICUが統合されていることが分かった。
折り返し処理
ウィンドウ幅で、折り返し処理を行うには、文字の幅の計算が必要で、高速に処理しようとするとボトルネックになりがちである。
文字列のレンダリングは、WindowsではDirectWriteというAPIが用意されており、折り返しを自動で処理できる。
「描画」と「レイアウト計算」が分離されており、表示行の計算にも利用できる。
描画処理
XAMLのUIに対して、DirectWriteで描画する方法を調べた。
SwapChainPanelを使えば、描画できることが分かった。
ここまで調査できたので、これらを条件に与えれば、生成できそうである。
上記の調査もすべてChatGPTを使って行った。
生成
Visual Studio 2026で、WinUI 3のデスクトップアプリのプロジェクトを新規作成して、vcpkgの設定をあらかじめ行った。
準備ができたので、プロンプトに条件を記載して、VSCodeのCodex + GPT-5.2-Codeで、いざ生成。
プロンプト
テキストビューアを実装してください。
### 条件
- SwapChainPanelで描画領域を作り、テキスト描画にDirectWriteを使用
- メモリマップドファイルで高速にロード(巨大ファイルにも対応)
- 文字コードを自動判定する(uchardetを使用。vcpkgでプロジェクトで使用可能な状態。#include <uchardet/uchardet.h>)
- 文字コードのデコードはWindowsSDK標準のICUを使う(#include <icu.h>)
- できるだけ高速に表示
- メニューからファイルを開くようにする(すべての拡張子)
- ウィンドウ幅で折り返し
- 折り返しのレイアウトはIDWriteTextLayoutを使用して計算
- 可視範囲周辺の論理行だけ layout を作る
- layout を 幅・フォント・行内容のバージョンでキャッシュする
- ウィンドウがリサイズされたときに折り返しを再計算すること
- テキストの改行探索がボトルネックになることに注意。
- スクロールは、Yピクセルで管理
- スクロールバーのスライダーが正しく表示されるか確認すること
- 表示行を正しく計算して、ファイルの末尾の行まで正しく表示できるか確認すること
- D2D COM オブジェクトを確実に解放すること(winrt::com_ptr<>を使用)コンパイルエラーがいくつか出たので、エラーを貼り付けて修正を数回行った後、ビルドできた。
実行すると、vcpkgで追加したuchardetのdllがパッケージにコピーされていないため、DLLが見つからないエラーが起きた。
こちらは、Codexで原因を調べても解決しなかったので、ChatGPTにVisual Studioのパッケージの設定画面を与えながら質問を繰り返して、TextView (Package).wapprojにItemGroupを手動で追加すればよいことが分かったので解決した。
実行すると、終了時に異常終了する問題が発生した。
Visual Studio 2026のデバッガは、エラーをGitHub Copilotで分析することができるようになっていたので、分析すると解決方法がピンポイントで提示され、そのまま修正までできた。
C++でスタックトレースを追って原因を調べていた頃から比べて格段に効率的である。
スクロールバーのスライダーが表示されない問題が起きたので、原因調査と修正を依頼したが、何度試しても表示されなかった。
Visual Studioのデバッガでライブビジュアルツールというものがあったので、そちらで動作中のUIの部品のプロパティを画面キャプチャして質問を繰り返すことで原因にたどり着いた。
ScrollBarに「IndicatorMode="MouseIndicator"」の設定が必要ということが分かった。
また、折り返し位置がおかしい問題が起きたので、画面キャプチャを貼って、事象を具体的に説明したところ、DPIのスケーリング処理が誤っていたことが分かり、Codexで修正もできた。
画面キャプチャを貼るまでには何度修正させても直らなかったので、発生している事象を詳細に伝えることが重要である。
以上で、無事に完成した。
ここまで手動でコーディングしたのは設定追加だけで、それ以外は一切行っていない。

もっと使いこなしている人はたくさんいると思うが、バイブコーディングのノウハウとして参考にしてもらえれば幸いである。
作成したテキストビューアはGitHubに公開した。