branch: master commit bfe14f19ac8f015b0b79b9222cb0059a9a01a7e5 Author: Noam Postavsky <github.10.npost...@spamgourmet.com> Commit: Noam Postavsky <github.10.npost...@spamgourmet.com>
Test and fix problem with mirror+autofill cc-mode fill paragraph narrows to the paragraph being filled. This causes problems if there is a mirror needing to be updated outside of the current paragraph. * yasnippet-tests.el: New test. * yasnippet.el (yas--update-mirrors): Widen while updating the mirrors. --- yasnippet-tests.el | 20 ++++++++++++++ yasnippet.el | 74 +++++++++++++++++++++++++++------------------------- 2 files changed, 58 insertions(+), 36 deletions(-) diff --git a/yasnippet-tests.el b/yasnippet-tests.el index 844cd94..e5c72df 100644 --- a/yasnippet-tests.el +++ b/yasnippet-tests.el @@ -68,6 +68,26 @@ (should (string= (yas--buffer-contents) "bla from another BLA")))) +(ert-deftest mirror-with-transformation-and-autofill () + "Test interaction of autofill with mirror transforms" + (let ((words "one two three four five") + filled-words) + (with-temp-buffer + (c-mode) ; In `c-mode' filling comments works by narrowing. + (yas-minor-mode +1) + (setq fill-column 10) + (auto-fill-mode +1) + (yas-expand-snippet "/* $0\n */") + (yas-mock-insert words) + (setq filled-words (delete-and-extract-region (point-min) (point-max))) + (yas-expand-snippet "/* $1\n */\n$2$2") + (should (string= (yas--buffer-contents) + "/* \n */\n")) + (yas-mock-insert words) + (should (string= (yas--buffer-contents) + (concat filled-words "\n")))))) + + (ert-deftest primary-field-transformation () (with-temp-buffer (yas-minor-mode 1) diff --git a/yasnippet.el b/yasnippet.el index 24cb653..93b21f5 100644 --- a/yasnippet.el +++ b/yasnippet.el @@ -4192,42 +4192,44 @@ When multiple expressions are found, only the last one counts." (defun yas--update-mirrors (snippet) "Update all the mirrors of SNIPPET." - (save-excursion - (dolist (field-and-mirror - (sort - ;; make a list of ((F1 . M1) (F1 . M2) (F2 . M3) (F2 . M4) ...) - ;; where F is the field that M is mirroring - ;; - (cl-mapcan #'(lambda (field) - (mapcar #'(lambda (mirror) - (cons field mirror)) - (yas--field-mirrors field))) - (yas--snippet-fields snippet)) - ;; then sort this list so that entries with mirrors with parent - ;; fields appear before. This was important for fixing #290, and - ;; luckily also handles the case where a mirror in a field causes - ;; another mirror to need reupdating - ;; - #'(lambda (field-and-mirror1 field-and-mirror2) - (> (yas--calculate-mirror-depth (cdr field-and-mirror1)) - (yas--calculate-mirror-depth (cdr field-and-mirror2)))))) - (let* ((field (car field-and-mirror)) - (mirror (cdr field-and-mirror)) - (parent-field (yas--mirror-parent-field mirror))) - ;; before updating a mirror with a parent-field, maybe advance - ;; its start (#290) - ;; - (when parent-field - (yas--advance-start-maybe mirror (yas--fom-start parent-field))) - ;; update this mirror - ;; - (yas--mirror-update-display mirror field) - ;; `yas--place-overlays' is needed if the active field and - ;; protected overlays have been changed because of insertions - ;; in `yas--mirror-update-display' - ;; - (when (eq field (yas--snippet-active-field snippet)) - (yas--place-overlays snippet field)))))) + (save-restriction + (widen) + (save-excursion + (dolist (field-and-mirror + (sort + ;; make a list of ((F1 . M1) (F1 . M2) (F2 . M3) (F2 . M4) ...) + ;; where F is the field that M is mirroring + ;; + (cl-mapcan #'(lambda (field) + (mapcar #'(lambda (mirror) + (cons field mirror)) + (yas--field-mirrors field))) + (yas--snippet-fields snippet)) + ;; then sort this list so that entries with mirrors with parent + ;; fields appear before. This was important for fixing #290, and + ;; luckily also handles the case where a mirror in a field causes + ;; another mirror to need reupdating + ;; + #'(lambda (field-and-mirror1 field-and-mirror2) + (> (yas--calculate-mirror-depth (cdr field-and-mirror1)) + (yas--calculate-mirror-depth (cdr field-and-mirror2)))))) + (let* ((field (car field-and-mirror)) + (mirror (cdr field-and-mirror)) + (parent-field (yas--mirror-parent-field mirror))) + ;; before updating a mirror with a parent-field, maybe advance + ;; its start (#290) + ;; + (when parent-field + (yas--advance-start-maybe mirror (yas--fom-start parent-field))) + ;; update this mirror + ;; + (yas--mirror-update-display mirror field) + ;; `yas--place-overlays' is needed if the active field and + ;; protected overlays have been changed because of insertions + ;; in `yas--mirror-update-display' + ;; + (when (eq field (yas--snippet-active-field snippet)) + (yas--place-overlays snippet field))))))) (defun yas--mirror-update-display (mirror field) "Update MIRROR according to FIELD (and mirror transform)."