textwidth に値を設定すると、input モード時、ある文字 C を入力しようとしたときにその行(の先頭からカーソル位置までの部分文字列の表示上の幅に C の表示上の幅を足した値)が textwidth を超えるであろう場合、先んじてリフォーマット処理が行われ、その後に実際に C が入力される。リフォーマット処理は、カーソル位置から後方に改行挿入可能位置を走査し、最初に見つかった箇所で行を分割する。
このときとても面倒なのはつまり、改行挿入可能位置の走査というやつだ。Latin-1 だけで考えるならば、アルファベットの列の中では改行してはいけないとか、せいぜい数種の特定の約物の前では改行してはいけないとか、その程度のことに気をつけるだけでよかった。が、javascript で動く web ページ上のプログラムとして見るとどうしても Unicode のことを考えなければならない。
めんどくさいねぇ Unicode。ノムラススムばりに時空を超えて何度も我々の前に立ちはだかってくる。
で、Unicode の文脈で、文の中の改行挿入可能位置を算出する処理というのは UAX #14 にまとめられている。その仕様に沿って書けばいい。くらくらする長さの仕様だが。