[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 4a6d923 1/8: Slightly improve on fix for #515: Refactor co
From: |
João Távora |
Subject: |
[elpa] master 4a6d923 1/8: Slightly improve on fix for #515: Refactor code and add tests |
Date: |
Mon, 07 Mar 2016 08:43:31 +0000 |
branch: master
commit 4a6d923c9db7e0b3f1ef6753cf438da1ffe89777
Author: João Távora <address@hidden>
Commit: Noam Postavsky <address@hidden>
Slightly improve on fix for #515: Refactor code and add tests
While I agree with the solution for #515 in commit 17fe790 for now,
other approaches might be interesting in the future, like clearing on
other types of insertion, not just self-insertion.
So add some tests and refactor a new function that could be used for
that purpose later on. For now, change no behaviour.
* yasnippet-tests.el (dont-clear-on-partial-deletion-issue-515,
dont-clear-on-yank-issue-515): New tests. (yas-mock-yank): New
function.
* yasnippet.el (yas--skip-and-clear-field-p): New function.
(yas--on-field-overlay-modification): Use it.
---
yasnippet-tests.el | 37 +++++++++++++++++++++++++++++++++++++
yasnippet.el | 13 +++++++++----
2 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/yasnippet-tests.el b/yasnippet-tests.el
index 29a61dc..040c83a 100644
--- a/yasnippet-tests.el
+++ b/yasnippet-tests.el
@@ -142,6 +142,39 @@
;; (should (string= (yas--buffer-contents)
;; "brother from another mother!"))))
+(ert-deftest dont-clear-on-partial-deletion-issue-515 ()
+ "Ensure fields are not cleared when user doesn't really mean to."
+ (with-temp-buffer
+ (yas-minor-mode 1)
+ (yas-expand-snippet "my ${1:kid brother} from another ${2:mother}")
+
+ (ert-simulate-command '(kill-word 1))
+ (ert-simulate-command '(delete-char 1))
+
+ (should (string= (yas--buffer-contents)
+ "my brother from another mother"))
+ (should (looking-at "brother"))
+
+ (ert-simulate-command '(yas-next-field))
+ (should (looking-at "mother"))
+ (ert-simulate-command '(yas-prev-field))
+ (should (looking-at "brother"))))
+
+(ert-deftest dont-clear-on-yank-issue-515 ()
+ "A yank shouldn't clear and unmodified field." ; or should it? -- jt
+ (with-temp-buffer
+ (yas-minor-mode 1)
+ (yas-expand-snippet "my ${1:kid brother} from another ${2:mother}")
+
+ (yas-mock-yank "little")
+ (yas-mock-insert " ")
+
+ (should (string= (yas--buffer-contents)
+ "my little kid brother from another mother"))
+ (ert-simulate-command '(yas-next-field))
+ (ert-simulate-command '(yas-prev-field))
+ (should (looking-at "little kid brother"))))
+
;;; Snippet expansion and character escaping
;;; Thanks to @zw963 (Billy) for the testing
@@ -814,6 +847,10 @@ add the snippets associated with the given mode."
(let ((last-command-event (aref string i)))
(ert-simulate-command '(self-insert-command 1)))))
+(defun yas-mock-yank (string)
+ (let ((interprogram-paste-function (lambda () string)))
+ (ert-simulate-command '(yank nil))))
+
(defun yas-make-file-or-dirs (ass)
(let ((file-or-dir-name (car ass))
(content (cdr ass)))
diff --git a/yasnippet.el b/yasnippet.el
index dcec0e2..5a14529 100644
--- a/yasnippet.el
+++ b/yasnippet.el
@@ -3385,7 +3385,14 @@ Move the overlay, or create it if it does not exit."
(overlay-put yas--active-field-overlay 'insert-behind-hooks
'(yas--on-field-overlay-modification))))
-(defun yas--on-field-overlay-modification (overlay after? _beg _end &optional
_length)
+(defun yas--skip-and-clear-field-p (field _beg _end &optional _length)
+ "Tell if newly modified FIELD should be cleared and skipped.
+BEG, END and LENGTH like overlay modification hooks."
+ (and (eq this-command 'self-insert-command)
+ (not (yas--field-modified-p field))
+ (= (point) (yas--field-start field))))
+
+(defun yas--on-field-overlay-modification (overlay after? beg end &optional
length)
"Clears the field and updates mirrors, conditionally.
Only clears the field if it hasn't been modified and point is at
@@ -3401,9 +3408,7 @@ field start. This hook does nothing if an undo is in
progress."
(yas--field-update-display field))
(yas--update-mirrors snippet))
(field
- (when (and (eq this-command 'self-insert-command)
- (not (yas--field-modified-p field))
- (= (point) (yas--field-start field)))
+ (when (yas--skip-and-clear-field-p field beg end)
(yas--skip-and-clear field))
(setf (yas--field-modified-p field) t))))))
- [elpa] master updated (ab7d7f3 -> 9983491), João Távora, 2016/03/07
- [elpa] master 4a6d923 1/8: Slightly improve on fix for #515: Refactor code and add tests,
João Távora <=
- [elpa] master acf2cdd 2/8: Decide field clearing commands based on delsel, João Távora, 2016/03/07
- [elpa] master 80941c0 3/8: Update snippets submodule, João Távora, 2016/03/07
- [elpa] master 42601d2 4/8: Apply changes from GNU ELPA, João Távora, 2016/03/07
- [elpa] master 8632262 5/8: Don't use yas-x-prompt by default, João Távora, 2016/03/07
- [elpa] master 88b7950 6/8: Reduce `yas-new-snippet-default', João Távora, 2016/03/07
- [elpa] master 572c73d 7/8: Avoid error in case this-command isn't a symbol., João Távora, 2016/03/07
- [elpa] master 9983491 8/8: Update packages/yasnippet by subtree-merging from its github-based upstream, João Távora, 2016/03/07