順を追って考えてみる。
Lorem ipsum dolor sit amet,
consectetur adipisicing elit,
sed do eiusmod tempor
incididunt ut labore et
dolore magna aliqua.
というような、長い 1 行がある。次に [cci]:set tw=30[/cci] として、[cci]Aa^[[/cci] する。すると、”a” が打ち込まれる前に、行の先頭からカーソル位置までの折り返されている行全体が処理され、適切な位置に改行が挿入される。……ということは、今まで、自動的な改行挿入はカーソル位置から逆向きに走査すればいいと考えていたが、そうではなさそうだ。ループ処理が必要になりそうだし、行の先頭から正順に走査することになる。
- まず行の先頭から、”L” の幅を算出し、line break 情報を得、textwidth を超えてないかを判定する。超えてなければ、次は “Lo” で……というループを繰り返す。
- いずれ “Lorem ipsum doloer sit amet, con” あたりで textwidth を超える。取得した line break 情報のうち、最後の改行挿入可能ポイントで改行する(このとき、ポイントの左側の空白文字列を削除する処理が必要かもしれない)。今、ループ中で着目している位置は 2 行目の con の次の文字だ。これは挿入が行われる位置(5 行目の最終桁)と同じかを判定する。同じではなければ、1. へ戻る。ちなみに挿入が行われる位置の絶対的な行、桁は改行を挿入するごとに変化するので、それを考慮する必要がある
ということになる、と思う。
2. で、「最後の改行挿入可能ポイント」が存在しない場合、つまりその行に改行できるポイントがない場合はどうするか。
- textwidth を満たす位置で強制的に改行する。改行禁止であっても
- 改行しない
さて、どちらがいいのか。vim では formatoption で選択できる(たぶん)ようだが。