branch: master commit 85f39cec2b0e34f60266057f5ef2f45193d75339 Author: Noam Postavsky <npost...@users.sourceforge.net> Commit: Noam Postavsky <npost...@users.sourceforge.net>
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."