Azukiの開発が始まって以来おそらく一番難しい、セーブ時点の状態を基準に行ごとに編集状態を管理・表示する機能の実装ですが、あまりにも難しいのであきらめることにしました。
とにもかくにも、テキスト全体が1つのギャップバッファになっているAzukiでは、行単位で何かをする機能は設計しにくい。本件も、おそらく各行を「UNDO/REDO機能を備えたバッファ」として作っておけばアッという間にできてしまうのではないかと想像しています。4/3の投稿ではDocument.Replaceメソッドの老朽化について触れましたが、それ以上に3/13の投稿で書いた基本設計の違いが大きいと今は考えています。頭で考えても紙に書いても思考が追いつかないのです…。
ちなみにVisual Studioのエディタコンポーネントで特定文字の位置を計算する場合、一次元座標(ファイル先頭から文字数で数えたインデックス番号)よりも二次元座標(行番号と列番号で数える)の方が効率が良いと記されています。以下に抜粋。
Although either coordinate system works in the text buffer, it is optimized to use two-dimensional coordinates. A one-dimensional coordinate system can create performance overhead. Therefore, use the two-dimensional coordinate system whenever possible.
→ MSDN – Text Buffer for the Visual Studio Editor
このことを考えると、おそらくVisual Studioの内部データ構造は行単位の構造になっているのかなと思います。なお私が知っている限り行の編集状態を「未編集・変更あり・保存後未編集」の3つで管理するアプリは知りません。
あきらめが肝心ということで、次のバージョンで昔の仕様に戻します…悔しいですが…。