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