help-gnu-emacs
[Top][All Lists]
Advanced

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

How to remove all text properties?


From: Jean Louis
Subject: How to remove all text properties?
Date: Thu, 10 Nov 2022 07:25:18 +0300

This particular situation is related to showing arbitrary links in
Emacs buffers.

My intention is to have this type of Hyperlinks in Emacs buffers:

⟦ (hyperscope 123) ⟧

The above is template interpolation snippet, reference: RCD Template
Interpolation System for Emacs:
https://hyperscope.link/3/7/1/3/3/RCD-Template-Interpolation-System-for-Emacs.html

The snippet alone is supposed to be bound to 2 possible directions:

- to display itself as Emacs button (link) within Emacs buffer,
  depending of the mode of invocation; 

- to contain function that is to be executed upon pressing the button;

What I wish to solve is removal of button text properties at time
point when I wish to delete the button and reverse it back to
original.

The original link or snippet will be following: ⟦ (hyperscope 123) ⟧

The button will be "Hello"

I wish to reverse the text properties of "Hello" to plain text
properties and display original ⟦ (hyperscope 123) ⟧

Here is how button will be displayed:

(insert-text-button "Hello"
                    'action (lambda (b) (message "Here"))
                    'follow-link t
                    'hyperscope-link 123)

If one evaluates the above, one will see "Hello" underlined and with
some text color, in general it will have different text properties.

After evaluating above, user will get following:

(insert-text-button "Hello"
                    'action (lambda (b) (message "Here"))
                    'follow-link t
                    'hyperscope-link 123)Hello

And then by executing the function below, the "Hello" above will
disappear and it will be reverted to ⟦ (hyperscope 123) ⟧

(defun rcd-revert-source ()
  (let ((point (point)))
    (save-excursion
      (goto-char (point-min))
      (let (my-prop)
        (while (setq my-prop 
                     (text-property-search-forward 
                      'hyperscope-link))
          (when my-prop
            (let ((begin (prop-match-beginning my-prop))
                  (end (prop-match-end my-prop))
                  (value (prop-match-value my-prop)))
              (set-text-properties (1- begin) end nil)
              (delete-region begin end)
              (goto-char begin)
              (insert (format "⟦ (hyperscope-link %s) ⟧" value)))))))
    (goto-char point)))

;; It searches for text properties and reverts it back,
;; but with errors, as font is still red.

(rcd-revert-source)

The problem that I see is that my function above can revert text
properties in this *mail* buffer in major-mode ⇒ mail-mode, but it
cannot revert text properties in emacs-lisp-mode, where "Hello"
becomes read, and then after reverting, the original snippet ⟦
(hyperscope 123) ⟧ becomes red too.

I guess that (rcd-revert-source) is not perfect, what am I missing?

Why are text properties removed in mail-mode but not in Emacs Lisp mode?

--
Jean

Take action in Free Software Foundation campaigns:
https://www.fsf.org/campaigns

In support of Richard M. Stallman
https://stallmansupport.org/



reply via email to

[Prev in Thread] Current Thread [Next in Thread]