emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master bfe14f1 10/36: Test and fix problem with mirror+autofill


From: Noam Postavsky
Subject: [elpa] master bfe14f1 10/36: Test and fix problem with mirror+autofill
Date: Sat, 11 Jun 2016 19:21:10 +0000 (UTC)

branch: master
commit bfe14f19ac8f015b0b79b9222cb0059a9a01a7e5
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>

    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)."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]