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

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

[elpa] master e21420a 04/40: Separate parsing from evaluation of backquo


From: Noam Postavsky
Subject: [elpa] master e21420a 04/40: Separate parsing from evaluation of backquote lisp
Date: Wed, 26 Oct 2016 23:06:31 +0000 (UTC)

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

    Separate parsing from evaluation of backquote lisp
    
    * yasnippet.el (yas--save-backquotes): Parse all backquoted lisp forms
    and only then evaluate them.
---
 yasnippet.el |   42 ++++++++++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 14 deletions(-)

diff --git a/yasnippet.el b/yasnippet.el
index 8a6258c..5164754 100644
--- a/yasnippet.el
+++ b/yasnippet.el
@@ -4017,20 +4017,34 @@ 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'."
-  (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))))))
+  ;; 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)))
 
 (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]