Revert "Separate parsing from evaluation of backquote lisp"

This reverts commit e21420a497c1d79edc6b36ffb1f3bf1bb70f6227.  This
breaks existing snippets which use side-effecting functions inside
backquotes to insert data instead of return the string to insert.  This
usage will be deprecated, but we still need to support it for at least
another release.

* yasnippet.el (yas--save-backquotes): Go back to interleaved parsing
and evaluating of backquoted lisp forms.
This commit is contained in:
Noam Postavsky 2016-06-21 21:27:27 -04:00
parent e21420a497
commit ee4efdbbde

View File

@ -4017,34 +4017,20 @@ 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
(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)))
(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))))))
(defun yas--restore-backquotes ()
"Replace markers in `yas--backquote-markers-and-strings' with their values."