けっこう(30cm くらい?)積もったので、玄関まで雪かきしたら死亡。しかも雪かきし終えたらまた降り始めるとは何事ですか。。。
とりあえず xyzzy 的なナローイングでいってみようかなーと。
具体的に実装する場合どうなるかを考えてみると、とりあえずバッファ内のテキストにナローイングされている・されていないという区別がつくことになるので、その境界を管理する必要が出てきます。
そいで、その境界はナローイングされていないテキストを編集することで変化するので、その補正をしなければいけません。そういう仕組みはマークが持っているので、境界をマークの 1 つとしてもてばよさそうです。
マークの仕組みを、作った本人自身が忘れているので一応おさらいすると、他のエディタでしおりとかブックマークとか呼ばれている機能です。一般的には行指向のものが多いのに対し、萌ディタのマークは文字指向になっています。ある文字と文字の間にマークを挟んでおくと、その前後のテキストを編集しても自動的に位置を補正してくれる。
内部的には、バッファを生成するごとにユーザーマーク 1 ~ 9、システムマーク 0 が確保されます。それから、ビューがバッファを参照するごとにビューごとのキャレットマークが確保されます。ここに、ナローイングの端点を示すマークを含めるようにすればよさそうです。
ただ、端点のうち右の 1 点は従来のマークそのままでよいのですが、左の 1 点はちょっと動作が違う。文字の間にキャレットとマークがどういう風に位置するかというと、概念的には
という風になってます。なので、キャレット位置に文字を挿入するとマークはそのぶんずれていくわけです。これに対し、ナローイングの左の端点に対応するマークは、キャレットと左の文字の間に位置する必要がある。
ということで、とりあえずマークにスナップする方向を指定できるようにしてみました。
ひとまずキャレットのメソッドに Restrict() と UnRestrict() を追加。