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

[xyzzy:08979] 開始終了位置が同じ text-attribute の仕様確認



亀井さん、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/

Index Home