]> code.delx.au - gnu-emacs-elpa/commitdiff
Only kill snippets for text length change
authorNoam Postavsky <github.10.npostavs@spamgourmet.com>
Sat, 16 Apr 2016 15:31:44 +0000 (11:31 -0400)
committerNoam Postavsky <github.10.npostavs@spamgourmet.com>
Sat, 16 Apr 2016 15:31:44 +0000 (11:31 -0400)
of protection overlay.  Changes that keep the same length of text are
probably harmless (e.g. just change of text properties).  It's possible
that some harmful changes don't change text length, but the protection
overlays are already unable to catch all important changes since they
only cover 1 character each at the edges.

cc-mode modifies text properties in the buffer to cache parsing results,
therefore it's important that yasnippet not kill yasnippets when parsing
is triggered by a function that only wants to parse the
buffer (e.g. which-function-mode).

* yasnippet.el (yas--on-protection-overlay-modification): Check length
of text change to decide if change is harmful.  Fix docstring.

yasnippet.el

index 9bdb5f99fe28c7e5fe996ccec66111310ed880fc..f91e130c584514a626132a2cbbf50fb6f6ab131e 100644 (file)
@@ -3467,12 +3467,11 @@ Move the overlays, or create them if they do not exit."
              ;; (overlay-put ov 'evaporate t)
              (overlay-put ov 'modification-hooks '(yas--on-protection-overlay-modification)))))))
 
-(defun yas--on-protection-overlay-modification (_overlay after? _beg _end &optional _length)
-  "Signals a snippet violation, then issues error.
-
-The error should be ignored in `debug-ignored-errors'"
+(defun yas--on-protection-overlay-modification (_overlay after? beg end &optional length)
+  "Commit the snippet if the protection overlay is being killed."
   (unless (or yas--inhibit-overlay-hooks
-              after?
+              (not after?)
+              (= length (- end beg)) ; deletion or insertion
               (yas--undo-in-progress))
     (let ((snippets (yas--snippets-at-point)))
       (yas--message 3 "Comitting snippets. Action would destroy a protection overlay.")