Concurrent Clean + 日本語 : 全角文字のカーソルポジションがずれる理由

日本語フォントを含むと、カーソルポジションがずれる原因は、下の部分にありそうです。つまり、「width s = (size s) * charWidth」の部分が、シングルバイト文字しか想定していないところですね。でも、ここを直すのは、ちょっとやり方を考える必要がありそうだな。

< EdVisualText.icl >
tabStringWidth :: !Int ![String] !FontInfo -> Int
tabStringWidth startX strings {tabSize, charWidth}
	# widths = map width strings
	= (virtualDraw widths startX) - startX
where
	width s = (size s) * charWidth

	virtualDraw []		_ = 0
	virtualDraw [w]		x = x + w
	virtualDraw [w:ws]	x = virtualDraw ws x`
	where
		x`	= tabWidth * (inc ((x + w) / tabWidth))
	
	tabSize`	= max 1 tabSize			// ensure sensible minimum
	tabWidth	= tabSize` * charWidth
      • -

でも、そもそも、プロポーショナルフォントを使っているわけではないのに、なぜ、ずれるのか?

      • -

原因を見つけました。固定ピッチフォントで全角文字と半角文字を混在させたときに、全角文字のピッチがずれる原因が、マイクロソフトのホームページに載っていました。しかも、困ったことに、Windows XPから、この問題が解決されているので、Windows 2000以前とWindows XP以降では、異なる現象が発生してしまうのです。
http://www.microsoft.com/japan/msdn/windows/windowsxp/FixedPitchFont.asp
この現象は、3の倍数のポイント値のフォントでは発生しないとのことです。なので、Windows 2000でこの問題が発生したら、9ptもしくは12ptのフォントを使えば、とりあえず、問題は回避できそうです。
また、Windows XPでは、この問題は発生しないようです。