[Date Prev][Date Next][Thread Prev][][Date Index][Thread Index]

Re: bug#4090: Bug#541704: emacs-snapshot ruins w3m-el-snapshot tables



In article <20090819.115751.259544237.shirai.hideyuki@xxxxxxxxxxx>, Hideyuki SHIRAI (=?iso-2022-jp?B?GyRCR3IwZj0oOVQbKEI=?=) <shirai@xxxxxxxxxxx> writes:

> emacs-w3m 側の原因はわかりました。
[...]
> ここで、UTF-8 環境下では w3m と Mule-UCS を含む emacs-22 までは、
> 置き換え前、置き換え後 ともに char-width = 1 だったのでつじつま
> があっていたのですが、emacs-23 以降は zzz-symbols に含まれるもの
> の char-width が 2 となるために、<_SYMBOL TYPE=3>+</_SYMBOL> だ
> と長さが 0 の list になり処理が破綻して、たて罫線などが消えてし
> まっているわけです。

> というわけで、半田さんにお聞きしたいのですが、上記の zzz-symbols
> を char-width = 1 な文字列で生成することは可能でしょうか?

「char-width = 1 な文字列」というものは存在しません。
char-width は char-width-table によって決まり、
char-width-table は現在の lang. env. で決まるので、まず、

(defvar w3m-char-width-table (make-char-table nil))
(set-char-table-range w3m-char-width-table '(#x2500 . #x257F) 1)
(set-char-table-parent w3m-char-width-table char-width-table)

とやって w3m 専用の char-width-table を用意し、w3m の表示バッ
ファでは (w3m-mode かなにかの中で)、

(make-local-variable 'char-width-table)
(setq char-width-table w3m-char-width-table)

とやります。これで box drawing character はすべて width = 1
になります。

次に、

(new-fontset "-*-*-*-*-*-*-*-*-*-*-*-*-fontset-w3mbox" nil)
(set-fontset-font "fontset-w3mbox" '(#x2500 . #x257F) '(nil . "iso10646-1"))
(make-face 'w3mbox)
(set-face-attribute 'w3mbox nil :fontset "fontset-w3mbox")

とやって box drawing character には iso10646-1 のフォントを使
う face `w3mbox' を作ります。本当はこれだけでは、ASCII と同じ
幅のグリフを持つフォントが選ばれることは保証できないのですが、
まあ大抵はうまくいきます。これで駄目な場合は、ユーザにフォン
トを明示的に指定させないかぎりどうしようもありません。

最後に box drawing character を挿入する時に、例えば

(insert (apply 'concat (make-list (/ (string-width "+")
				     (string-width (nth 3 zzz-symbols)))
				  (nth 3 zzz-symbols))))

の代わりに

(insert
 (propertize (apply 'concat (make-list (/ (string-width "+")
					  (string-width (nth 3 zzz-symbols)))
				       (nth 3 zzz-symbols)))
	     'face 'w3mbox))

とやれば box drawing character は w3mbox face で表示されます。

---
半田@AIST