(put-text-property sub-start sub-end 'display (list prop value)
object)
;; We have old properties.
- (let ((vector nil))
+ (let (type)
;; Make disp into a list.
(setq disp
(cond
((vectorp disp)
- (setq vector t)
+ (setq type 'vector)
(seq-into disp 'list))
- ((not (consp (car disp)))
+ ((or (not (consp (car-safe disp)))
+ ;; If disp looks like ((margin ...) ...), that's
+ ;; still a single display specification.
+ (eq (caar disp) 'margin))
+ (setq type 'scalar)
(list disp))
(t
+ (setq type 'list)
disp)))
;; Remove any old instances.
- (when-let ((old (assoc prop disp)))
- (setq disp (delete old disp)))
+ (when-let* ((old (assoc prop disp)))
+ ;; If the property value was a list, don't modify the
+ ;; original value in place; it could be used by other
+ ;; regions of text.
+ (setq disp (if (eq type 'list)
+ (remove old disp)
+ (delete old disp))))
(setq disp (cons (list prop value) disp))
- (when vector
+ (when (eq type 'vector)
(setq disp (seq-into disp 'vector)))
;; Finally update the range.
(put-text-property sub-start sub-end 'display disp object)))
(insert "Foo bar zot gazonk")
(add-display-text-property 4 8 'height 2.0)
(add-display-text-property 2 12 'raise 0.5)
- (should (equal (get-text-property 2 'display) '(raise 0.5)))
- (should (equal (get-text-property 5 'display)
- '((raise 0.5) (height 2.0))))
- (should (equal (get-text-property 9 'display) '(raise 0.5))))
+ (add-display-text-property 6 10 'height 1.0)
+ (should (equal-including-properties
+ (buffer-string)
+ #("Foo bar zot gazonk"
+ 1 3 (display (raise 0.5))
+ 3 5 (display ((raise 0.5) (height 2.0)))
+ 5 9 (display ((height 1.0) (raise 0.5)))
+ 9 11 (display (raise 0.5))))))
(with-temp-buffer
(insert "Foo bar zot gazonk")
(put-text-property 4 8 'display [(height 2.0)])
(add-display-text-property 2 12 'raise 0.5)
- (should (equal (get-text-property 2 'display) '(raise 0.5)))
- (should (equal (get-text-property 5 'display)
- [(raise 0.5) (height 2.0)]))
- (should (equal (get-text-property 9 'display) '(raise 0.5))))
+ (add-display-text-property 6 10 'height 1.0)
+ (should (equal-including-properties
+ (buffer-string)
+ #("Foo bar zot gazonk"
+ 1 3 (display (raise 0.5))
+ 3 5 (display [(raise 0.5) (height 2.0)])
+ 5 7 (display [(height 1.0) (raise 0.5)])
+ 7 9 (display ((height 1.0) (raise 0.5)))
+ 9 11 (display (raise 0.5))))))
+ (with-temp-buffer
+ (insert "Foo bar zot gazonk")
+ (add-display-text-property 4 8 '(margin nil) "Hi")
+ (add-display-text-property 2 12 'raise 0.5)
+ (add-display-text-property 6 10 '(margin nil) "Bye")
+ (should (equal-including-properties
+ (buffer-string)
+ #("Foo bar zot gazonk"
+ 1 3 (display (raise 0.5))
+ 3 5 (display ((raise 0.5) ((margin nil) "Hi")))
+ 5 9 (display (((margin nil) "Bye") (raise 0.5)))
+ 9 11 (display (raise 0.5))))))
(with-temp-buffer
(should (equal-including-properties
(let ((str (copy-sequence "some useless string")))