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

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

[elpa] master 655bda8 07/40: Merge: restore backquote evaluation behavio


From: Noam Postavsky
Subject: [elpa] master 655bda8 07/40: Merge: restore backquote evaluation behaviour
Date: Wed, 26 Oct 2016 23:06:32 +0000 (UTC)

branch: master
commit 655bda804b11269790c0b8a19aea75d7165ebc3c
Merge: e21420a 85f39ce
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>

    Merge: restore backquote evaluation behaviour
    
    But add warnings if snippets use insertion from backquote expressions.
---
 yasnippet.el |   53 ++++++++++++++++++++++++++---------------------------
 1 file changed, 26 insertions(+), 27 deletions(-)

diff --git a/yasnippet.el b/yasnippet.el
index 5164754..406b514 100644
--- a/yasnippet.el
+++ b/yasnippet.el
@@ -4017,34 +4017,33 @@ 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
+  (let* ((yas--change-detected nil)
+         (detect-change (lambda (_beg _end) (setq yas--change-detected t))))
+    (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 (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)))
+                          (delete-region (match-beginning 0) (match-end 0)))
+        (let ((before-change-functions
+               (cons detect-change before-change-functions)))
+          (setq transformed (yas--eval-lisp (yas--read-lisp
+                                             (yas--restore-escapes
+                                              current-string '(?`))))))
+        (goto-char (match-beginning 0))
+        (when transformed
+          (let ((marker (make-marker))
+                (before-change-functions (cdr before-change-functions)))
+            (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)))))
+    (when yas--change-detected
+      (lwarn '(yasnippet backquote-change) :warning
+             "`%s' modified buffer in a backquote expression."
+             (if yas--current-template
+                 (yas--template-name yas--current-template)
+               "Snippet")))))
 
 (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]