handling wrapped rows

バッファ内において「物理行」を改行で区切られたそれぞれの領域とする。1 つの物理行を表示した際、ビューより長いものは折り返される。このとき折り返された、折り返しポイントで区切られたそれぞれの領域を「表示行」とする。

j コマンドや k コマンドは、物理行単位で移動する。ものすごく 1 行が長い物理行のうえでこれらのコマンドを実行すると一気にスクロールが行われて面食らう。

vim では、gj とか gk コマンドが用意されていて、これらは表示行単位でカーソルを上下に移動させる。vi にはない。

次はこれを持って来たいという話。

この機能を作る準備として、1 行内のその折り返しポイントを得ることを考えなければならない。できれば一発で取れる夢のような API があればうれしいのだが、ない。getClientRects() あたりが惜しいのだけど(これは各表示行についての座標情報を返す)、折り返しポイントは返してくれない。

うーん地道にループ回すしかないかな。

ところで vim で表示行を使う際、[cci]noremap j gj / noremap k gk[/cci] すると便利ですよ奥さん! 的な話題になりがちだと思う。でもこれは割とバッドノウハウなんじゃないのかなー。ぶっちゃけていうと j/k は常に表示行単位で動かすようにしても別に困らないと思うんだけど。移動単位を切り替えるオプションくらいは新設する必要があるかもしないが。

Leave a Reply

Your email address will not be published. Required fields are marked *