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

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

[elpa] master 85f39ce 06/40: Warn about backquote exprs modifying the bu


From: Noam Postavsky
Subject: [elpa] master 85f39ce 06/40: Warn about backquote exprs modifying the buffer
Date: Wed, 26 Oct 2016 23:06:32 +0000 (UTC)

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

    Warn about backquote exprs modifying the buffer
    
    * yasnippet.el (yas--save-backquotes): Show a warning if evaluating the
    backquote expression modifies the buffer.
---
 yasnippet.el |   41 +++++++++++++++++++++++++++--------------
 1 file changed, 27 insertions(+), 14 deletions(-)

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