Separate parsing from evaluation of backquote lisp

* yasnippet.el (yas--save-backquotes): Parse all backquoted lisp forms
and only then evaluate them.
This commit is contained in:
Noam Postavsky 2016-05-02 23:18:12 -04:00
parent c7441486db
commit e21420a497

View File

@ -4017,20 +4017,34 @@ With optional string TEXT do it in string instead of the buffer."
(defun yas--save-backquotes () (defun yas--save-backquotes ()
"Save all the \"`(lisp-expression)`\"-style expressions "Save all the \"`(lisp-expression)`\"-style expressions
with their evaluated value into `yas--backquote-markers-and-strings'." with their evaluated value into `yas--backquote-markers-and-strings'."
(while (re-search-forward yas--backquote-lisp-expression-regexp nil t) ;; Gather `(lisp-expression)`s.
(let ((current-string (match-string-no-properties 1)) transformed) (let ((end (point-max)))
(save-restriction (widen) (save-restriction
(delete-region (match-beginning 0) (match-end 0))) (widen)
(setq transformed (yas--eval-lisp (yas--read-lisp (yas--restore-escapes current-string '(?`))))) (while (re-search-forward yas--backquote-lisp-expression-regexp end t)
(goto-char (match-beginning 0)) (let ((expr (yas--read-lisp (yas--restore-escapes
(when transformed (match-string-no-properties 1))))
(let ((marker (make-marker))) (marker (make-marker)))
(save-restriction (delete-region (match-beginning 0) (match-end 0))
(widen) (insert "Y") ;; quite horrendous, I love it :)
(insert "Y") ;; quite horrendous, I love it :) (set-marker marker (point))
(set-marker marker (point)) (insert "Y")
(insert "Y")) (push (cons marker expr) yas--backquote-markers-and-strings)))))
(push (cons marker transformed) 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 () (defun yas--restore-backquotes ()
"Replace markers in `yas--backquote-markers-and-strings' with their values." "Replace markers in `yas--backquote-markers-and-strings' with their values."