emacs-elpa-diffs
[Top][All Lists]
Advanced

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

[elpa] master ee4efdb 05/40: Revert "Separate parsing from evaluation of


From: Noam Postavsky
Subject: [elpa] master ee4efdb 05/40: Revert "Separate parsing from evaluation of backquote lisp"
Date: Wed, 26 Oct 2016 23:06:32 +0000 (UTC)

branch: master
commit ee4efdbbde2da236fa06bb18290339d0cdca6699
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>

    Revert "Separate parsing from evaluation of backquote lisp"
    
    This reverts commit e21420a497c1d79edc6b36ffb1f3bf1bb70f6227.  This
    breaks existing snippets which use side-effecting functions inside
    backquotes to insert data instead of return the string to insert.  This
    usage will be deprecated, but we still need to support it for at least
    another release.
    
    * yasnippet.el (yas--save-backquotes): Go back to interleaved parsing
    and evaluating of backquoted lisp forms.
---
 yasnippet.el |   42 ++++++++++++++----------------------------
 1 file changed, 14 insertions(+), 28 deletions(-)

diff --git a/yasnippet.el b/yasnippet.el
index 5164754..8a6258c 100644
--- a/yasnippet.el
+++ b/yasnippet.el
@@ -4017,34 +4017,20 @@ With optional string TEXT do it in string instead of 
the buffer."
 (defun yas--save-backquotes ()
   "Save all the \"`(lisp-expression)`\"-style expressions
 with their evaluated value into `yas--backquote-markers-and-strings'."
-  ;; Gather `(lisp-expression)`s.
-  (let ((end (point-max)))
-    (save-restriction
-      (widen)
-      (while (re-search-forward yas--backquote-lisp-expression-regexp end t)
-        (let ((expr (yas--read-lisp (yas--restore-escapes
-                                     (match-string-no-properties 1))))
-              (marker (make-marker)))
-          (delete-region (match-beginning 0) (match-end 0))
-          (insert "Y") ;; quite horrendous, I love it :)
-          (set-marker marker (point))
-          (insert "Y")
-          (push (cons marker expr) yas--backquote-markers-and-strings)))))
-  ;; Evaluate them.
-  (dolist (m-e yas--backquote-markers-and-strings)
-    (let* ((marker (car m-e))
-           (expr (cdr m-e))
-           (result (save-excursion
-                     (goto-char marker)
-                     (yas--eval-lisp expr))))
-      (setcdr m-e result)
-      (unless result
-        (save-restriction (widen)
-                          (delete-region (1- marker) (1+ marker)))
-        (set-marker marker nil))))
-  ;; Drop the nil results.
-  (setq yas--backquote-markers-and-strings
-        (cl-delete-if-not #'cdr yas--backquote-markers-and-strings)))
+  (while (re-search-forward yas--backquote-lisp-expression-regexp nil t)
+    (let ((current-string (match-string-no-properties 1)) transformed)
+      (save-restriction (widen)
+                        (delete-region (match-beginning 0) (match-end 0)))
+      (setq transformed (yas--eval-lisp (yas--read-lisp (yas--restore-escapes 
current-string '(?`)))))
+      (goto-char (match-beginning 0))
+      (when transformed
+        (let ((marker (make-marker)))
+          (save-restriction
+            (widen)
+            (insert "Y") ;; quite horrendous, I love it :)
+            (set-marker marker (point))
+            (insert "Y"))
+          (push (cons marker transformed) 
yas--backquote-markers-and-strings))))))
 
 (defun yas--restore-backquotes ()
   "Replace markers in `yas--backquote-markers-and-strings' with their values."



reply via email to

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