branch: externals/async
commit afd1ad5f69e3fd04e8d358ea0da96de4899ff04d
Author: Thierry Volpiatto <thierry.volpia...@gmail.com>
Commit: Thierry Volpiatto <thierry.volpia...@gmail.com>

    Allow removing text properties in strings when injecting
    
    variables.
    
    * async.el (async-variables-noprops-function): New user var.
    (async-variables-noprops): Default fn for 
`async-variables-noprops-function`.
    (async-inject-variables): Use it, takes one more optional arg `noprops`.
---
 async.el | 36 +++++++++++++++++++++++++++++++++---
 1 file changed, 33 insertions(+), 3 deletions(-)

diff --git a/async.el b/async.el
index c1fb40b..e2889d1 100644
--- a/async.el
+++ b/async.el
@@ -35,6 +35,11 @@
   "Simple asynchronous processing in Emacs"
   :group 'emacs)
 
+(defcustom async-variables-noprops-function #'async-variables-noprops
+  "Default function to remove text properties in variables."
+  :group 'async
+  :type 'function)
+
 (defvar async-debug nil)
 (defvar async-send-over-pipe t)
 (defvar async-in-child-emacs nil)
@@ -45,13 +50,35 @@
 (defvar async-current-process nil)
 (defvar async--procvar nil)
 
+(defun async-variables-noprops (sequence)
+  "Remove text properties in SEQUENCE.
+
+Argument SEQUENCE may be a list or a string, if anything else it
+returned unmodified.
+
+Note that this is a naive function that doesn't remove text properties
+in SEQUENCE recursively, only at the first level which suffice in most
+cases."
+  (cond ((stringp sequence)
+         (substring-no-properties sequence))
+        ((listp sequence)
+         (cl-loop for elm in sequence
+                  if (stringp elm)
+                  collect (substring-no-properties elm)
+                  else collect elm))
+        (t sequence)))
+
 (defun async-inject-variables
-  (include-regexp &optional predicate exclude-regexp)
+  (include-regexp &optional predicate exclude-regexp noprops)
   "Return a `setq' form that replicates part of the calling environment.
+
 It sets the value for every variable matching INCLUDE-REGEXP and
 also PREDICATE.  It will not perform injection for any variable
-matching EXCLUDE-REGEXP (if present).  It is intended to be used
-as follows:
+matching EXCLUDE-REGEXP (if present).
+When NOPROPS is non nil it tries to strip out text properties of each
+variable's value with `async-variables-noprops-function'.
+
+It is intended to be used as follows:
 
     (async-start
        `(lambda ()
@@ -73,6 +100,9 @@ as follows:
                           (or exclude-regexp "-syntax-table\\'")
                           (symbol-name sym))))
                (let ((value (symbol-value sym)))
+                 (when noprops
+                   (setq value (funcall async-variables-noprops-function
+                                        value)))
                  (when (or (null predicate)
                            (funcall predicate sym))
                    (setq bindings (cons `(quote ,value) bindings)

Reply via email to