このページは過去に掲載していたものをそのまま使用しています。

カーソル移動の改善

1byte分しかカーソル移動が移動できないと 2byte文字のときに、カーソルキーを二回押さなければいけないので その動作を改善する。

影響を受ける関数

テキストオブジェクトに注目した。このための変更は lib/text.cで行ない、影響を受ける関数は次に挙げる。

アルゴリズム

アルゴリズムというほどの難しい点はどこにもない。 ひらがなや漢字といった2byte文字の場合には、2回分(2byte分)前後に カーソル位置をずらしている。

問題となるのはこの「2byteの場合」を検出することなのだけれど、 rubyのregex.cに含まれているようなテーブルを使った検出が 望ましいのだと思うが、ここでは単純に該当文字コードが負なら2byte文字を 表わすとして処理している。

たとえば前方に2byte文字がある場合 (右側に漢字があって、そちらに向う場合) は次のような処理をしている。

  if(text->line[row][text->cursor_pos+1] > 0) {
    memmove(text->line[row] + text->cursor_pos,
	    text->line[row] + text->cursor_pos + 1,
	    text->strlen[row] - text->cursor_pos);

    text->strlen[row]--;
  } else {
    memmove(text->line[row] + text->cursor_pos,
	    text->line[row] + text->cursor_pos + 2,
	    text->strlen[row] - text->cursor_pos);

    text->strlen[row]-=2;
  }

完全なパッチ

以前作成したページに載っているものですが この問題点を解決した差分ファイルです。
[ dia-0.83-5-6pr1.patch ]


Yasuhiro Abe <m5031201@u-aizu.ac.jp>
Last modified: Thu Feb 17 03:02:56 2000