join to the world #6

いよいよ gq コマンドを実装する。

g プリフィクスがついているが、基本的にはオペレータだ。つまり gq{motion} または gq{range-symbol} という形式で使う。もちろん、gqq という形式もありうる。ちなみに vi 使いなら誰でも知ってることであるが、オペレータとモーションが同じであるというのは、内部的には “_” モーションが実行されたことと等価である。

ただし gq コマンドには他のオペレーションと決定的に違う点がいくつかある。d や y といったオペレーションは基本的に字・行単位なのに対し、gq は操作の単位がパラグラフなのだ。これはものすごく重要だ。

それから、コマンドが完了したとき、カーソルは連続して gq コマンドを実行できるように、処理したパラグラフの次行へ置かれる(ただし gw コマンドは違う)という点も興味深い。

vim では ops.c でやっている。

 * * *

「もちろん gqq」などと書いたが、実は結構面倒だ。gqq では先行する gq がオペレータになるので、オペレータ = モーションとなるのは正確には gqgq と打たなければならないのだ。gqq だと、q コマンドをモーションとして実行することになる。しかし q コマンドはキーボードマクロの記録開始コマンドであり、オペレータではないがオペレータが空でなければ実行できない。

どうするかというと、q コマンドのハンドラの先頭でオペレータが gq だったら何もせずに返るという実に泥縄的な方法で逃げた。ダメすぎる……!

 * * *

textwidth を 1 以上の値にした場合、以下のような感じで垂直線をガイドとして表示するようにした。
wasavi_vertical_line
エディタとしては非常にありがちな絵。この垂直線とか、カーソル行の水平線とかを実装し始めるとなんだかいかにも、そこそこ機能を備えたテキストエディタっぽくて逆に面白みがないな。よくわからない我侭だが。

Leave a Reply

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