branch: master commit e21420a497c1d79edc6b36ffb1f3bf1bb70f6227 Author: Noam Postavsky <npost...@users.sourceforge.net> Commit: Noam Postavsky <npost...@users.sourceforge.net>
Separate parsing from evaluation of backquote lisp * yasnippet.el (yas--save-backquotes): Parse all backquoted lisp forms and only then evaluate them. --- yasnippet.el | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/yasnippet.el b/yasnippet.el index 8a6258c..5164754 100644 --- a/yasnippet.el +++ b/yasnippet.el @@ -4017,20 +4017,34 @@ 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)))))) + ;; 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))) (defun yas--restore-backquotes () "Replace markers in `yas--backquote-markers-and-strings' with their values."