[xyzzy:08979] 開始終了位置が同じ text-attribute の仕様確認
- Subject: [xyzzy:08979] 開始終了位置が同じ text-attribute の仕様確認
- From: OHKUBO Hiroshi <konata_o@xxxxxxxxxxx>
- X-mailer: EdMax Ver2.85.5F
亀井さん、ML の皆さんこんにちは。
OHKUBO Hiroshi です。
本件は「開始終了位置が同じ text-attribute の仕様」についての
質問です。
開始位置、終了位置が同一の text-attribute が多少独特な振る舞いを
することに気が付きました。多少長いメールとなってしまっていますが
仕様を確認させてください。
以降の文中での「point」は、「連続する 2 つの文字の間に存在する」
(「共通設定->表示->挿入時のキャレット」で「細いやつ」を選択した場合の
キャレットの位置のイメージ) として捉えてください。
説明のために確認の際の S 式を評価した結果を記します。
実際に試して確認する場合は xyzzy 起動後の *scratch* バッファの先頭に
「ABCDEFGHIJKLMNOPQRSTUVWXYZ」など適当な文字列を書き込んだ上で、
その下で以下に示す S式を順次評価してください。
==============================================================================
■A. 設定
A1. (set-text-attribute 1 4 'a :bold t)
(list-text-attributes)
=> ((1 4 a :bold t))
A2. (set-text-attribute 2 2 'b :bold nil :underline t)
(list-text-attributes)
=> ((1 2 a :bold t) (2 2 b :underline t) (2 4 a :bold t))
A3. (setq *a* (list-text-attributes))
=> ((1 2 a :bold t) (2 2 b :underline t) (2 4 a :bold t))
A4. ;; attribute を消去
(clear-all-text-attributes)
(list-text-attributes)
=> nil
■B. 確認
B1. ;; 正順で set-text-attribute した場合の確認
(dolist (attr *a*)
(apply #'set-text-attribute attr))
B11. (list-text-attributes)
=> ((1 2 a :bold t) (2 4 a :bold t))
★ (2 2 b :underline t) が要素に含まれない
B12. (multiple-value-list (find-text-attribute-point 1))
=> (1 2 a nil nil t nil nil nil nil)
B13. (multiple-value-list (find-text-attribute-point 2))
=> (2 4 a nil nil t nil nil nil nil)
B14. (multiple-value-list (find-text-attribute-point 3))
=> (2 4 a nil nil t nil nil nil nil)
B15. ;; attribute を消去
(clear-all-text-attributes)
(list-text-attributes)
=> nil
B2. ;; 逆順で set-text-attribute した場合の確認
(dolist (attr (reverse *a*))
(apply #'set-text-attribute attr))
B21. (list-text-attributes)
=> ((1 2 a :bold t) (2 2 b :underline t) (2 4 a :bold t))
B22. (multiple-value-list (find-text-attribute-point 1))
=> (1 2 a nil nil t nil nil nil nil)
B23. (multiple-value-list (find-text-attribute-point 2))
=> (2 2 b nil nil nil t nil nil nil)
★ point 2 から開始の (2 4 a nil nil t nil nil nil nil) は
表示されない
B24. (multiple-value-list (find-text-attribute-point 3))
=> (2 4 a nil nil t nil nil nil nil)
B3. ;; 複数の text-attribute の関係
(set-text-attribute 3 3 'c :strike-out t)
(list-text-attributes)
=> ((1 2 a :bold t) (2 2 b :underline t) (2 3 a :bold t)
(3 3 c :strike-out t) (3 4 a :bold t))
B31. (save-excursion (goto-char 2) (delete-char))
(list-text-attributes)
=> ((1 2 a :bold t) (2 2 b :underline t) (2 2 c :strike-out t)
(2 3 a :bold t))
★ point 2 を削除しても (2 2) のタグ b の text-attribute は
削除されず (2 3) のタグ a の text-attribute が削除される
★ 同一範囲 2 2 に対して b c のタグで示される二つの
text-attribute が指定されている
B32. (save-excursion (goto-char 2) (delete-char))
(list-text-attributes)
=> ((1 2 a :bold t) (2 2 b :underline t) (2 2 c :strike-out t))
★ B31 と同様 (2 2) のタグ b c はそのままで (2 3) のタグ c の
text-attribute が削除される
==============================================================================
■text-attribute 仕様の確認
1. 現状の、(2 2 b :underline t) といった、from, to が同一 point を指す
text-attribute は本来の仕様上あってはならないものでしょうか?
※text-attribute の名称からは text に対する attribute だと
考えられますが、from と to が同一の場合、意味的には text に対しての
attribute でなく、point に対しての attribute であるため。
以下は 1. にて仕様上問題ない場合についての確認です
2. (list-text-attributes) で返される値をそのままの順番で
set-text-attribute する場合(B11) と、逆順で行う場合 (B21) で
結果が異なります。
B1 実行後の B11 でも、B21 と同様の結果となるべきでしょうか?
同様の結果となるべきである場合の、想定する ed::set-text-attribute の
動作イメージは以下のコードで再定義されるものです。
----------------------------------------------------------------------
(defvar ed::*set-text-attribute-org-func* #'set-text-attribute)
(defun ed::set-text-attribute (from to tag &key
foreground background
bold underline strike-out
prefix extend)
(if (< to from)
(rotatef from to))
(multiple-value-bind (from1 to1 tag1 foreground1 background1
bold1 underline1 strike-out1 prefix1 extend1)
(find-text-attribute-point from)
(prog1
(funcall ed::*set-text-attribute-org-func*
from to tag
:foreground foreground :background background
:bold bold :underline underline :strike-out strike-out
:prefix prefix :extend extend)
(if (and from1 (= from1 to1))
(funcall ed::*set-text-attribute-org-func*
from1 to1 tag1
:foreground foreground1 :background background1
:bold bold1 :underline underline1 :strike-out strike-out1
:prefix prefix1 :extend extend1)))))
----------------------------------------------------------------------
3. B23 で point 2 の text-attribute を探した結果、
(2 2 b nil nil nil t nil nil nil) のみが返り、
(2 4 a nil nil t nil nil nil nil) は返りません。
これは、こういうものと考えた方がよいでしょうか。
そのうち仕様は変更されそうでしょうか?
4. B31 で point 2 にて文字列を削除した場合、範囲が (2 2) のタグ b の
text-attribute は削除されませんが、(2 3) のタグ a のものは
削除されています。
これは、こういうものと考えた方がよいでしょうか。
そのうち仕様は変更されそうでしょうか?
5. B31 実行後、同一範囲 (2 2) に対して複数タグ b c の text-attribute が
ともに存在しています。
これは仕様上あるべきではない状態でしょうか?
------------------------------------------------------------
上記確認に対する私自身の希望は以下の通りです。
1. point に対する情報の保存として、from と to が同一の
場合の set-text-attribute が仕様上許されて欲しいと考えています。
実際に、文字単位 diff を行う diff-detail.l では既に深く考えず
使用してしまっていました。
2. 特に問題がなければ B11 の結果は B21 と同一になって欲しいと
考えています。
3. 特に希望はありません。
4. 特に希望はありません。
5. 特に希望はありませんが、複数存在できることによる利点が何がしか
あるのではないかとも思います。
ただ、2. とも絡み text-attribute に対する操作の統一性を損なう
要因となりそうにも思いますので、b または c のみが存在する方が
よいのかとも思えます。
開始位置、終了位置が同一の text-attribute がどのような振る舞いで
あって欲しいか、皆さんの意見もお聞かせください。
亀井さん、えいやーで十分なので、あるべき仕様についてご教示
お願いいたします。
以上、宜しくお願いいたします。
---
OHKUBO Hiroshi
konata_o@xxxxxxxxxxx
http://ohkubo.s53.xrea.com/