[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master e67592c 03/42: Don't use overlays to find active snippets
From: |
Noam Postavsky |
Subject: |
[elpa] master e67592c 03/42: Don't use overlays to find active snippets |
Date: |
Sun, 22 Dec 2019 17:37:56 -0500 (EST) |
branch: master
commit e67592ce1bd4ccc533107765bdfebfa02e9fb945
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>
Don't use overlays to find active snippets
* yasnippet.el (yas--active-snippets): New buffer-local variable.
(yas-active-snippets): Use it, when asked for all active snippets.
(yas--commit-snippet): Remove finished snippet from list of active
snippets.
(yas--snippet-create): Add new snippet to list of active snippets.
(yas--check-commit-snippet): Consult list of active snippetes.
---
yasnippet.el | 47 +++++++++++++++++++++++++++--------------------
1 file changed, 27 insertions(+), 20 deletions(-)
diff --git a/yasnippet.el b/yasnippet.el
index b6e3d0e..d06165f 100644
--- a/yasnippet.el
+++ b/yasnippet.el
@@ -3070,6 +3070,10 @@ other fields."
(defvar yas--active-field-overlay nil
"Overlays the currently active field.")
+(defvar yas--active-snippets nil
+ "List of currently active snippets")
+(make-variable-buffer-local 'yas--active-snippets)
+
(defvar yas--field-protection-overlays nil
"Two overlays protect the current active field.")
@@ -3273,19 +3277,19 @@ equivalent to a range covering the whole buffer."
(setq beg (point-min) end (point-max)))
((not end)
(setq end (1+ beg))))
-
- ;; Note: don't use `mapcar' here, since it would allocate in
- ;; proportion to the amount of overlays, even though the list of
- ;; active snippets should be very small. That is important because
- ;; this function is called in the post-command hook (via
- ;; `yas--check-commit-snippet').
- (let ((snippets nil))
- (dolist (ov (overlays-in beg end))
- (let ((snippet (overlay-get ov 'yas--snippet)))
- ;; Snippets have multiple overlays, so check for dups.
- (when (and snippet (not (memq snippet snippets)))
- (push snippet snippets))))
- (cl-sort snippets #'>= :key #'yas--snippet-id)))
+ (if (and (eq beg (point-min))
+ (eq end (point-max)))
+ yas--active-snippets
+ ;; Note: don't use `mapcar' here, since it would allocate in
+ ;; proportion to the amount of overlays, even though the list of
+ ;; active snippets should be very small.
+ (let ((snippets nil))
+ (dolist (ov (overlays-in beg end))
+ (let ((snippet (overlay-get ov 'yas--snippet)))
+ ;; Snippets have multiple overlays, so check for dups.
+ (when (and snippet (not (memq snippet snippets)))
+ (push snippet snippets))))
+ (cl-sort snippets #'>= :key #'yas--snippet-id))))
(define-obsolete-function-alias 'yas--snippets-at-point
'yas-active-snippets "0.12")
@@ -3445,6 +3449,9 @@ This renders the snippet as ordinary text."
;;
(yas--markers-to-points snippet)
+ ;; It's no longer an active snippet.
+ (cl-callf2 delq snippet yas--active-snippets)
+
;; Take care of snippet revival on undo.
(if (and yas-snippet-revival (listp buffer-undo-list))
(push `(apply yas--snippet-revive ,yas-snippet-beg ,yas-snippet-end
,snippet)
@@ -3538,13 +3545,12 @@ HOOK should be a symbol, a hook variable, as in
`run-hooks'."
"Check if point exited the currently active field of the snippet.
If so cleans up the whole snippet up."
- (let* ((snippets (yas-active-snippets 'all))
- (snippets-left snippets)
- (snippet-exit-transform)
+ (let* ((snippet-exit-transform nil)
+ (exited-snippets-p nil)
;; Record the custom snippet `yas-after-exit-snippet-hook'
;; set in the expand-env field.
(snippet-exit-hook yas-after-exit-snippet-hook))
- (dolist (snippet snippets)
+ (dolist (snippet yas--active-snippets)
(let ((active-field (yas--snippet-active-field snippet)))
(yas--letenv (yas--snippet-expand-env snippet)
;; Note: the `force-exit' field could be a transform in case of
@@ -3552,10 +3558,10 @@ If so cleans up the whole snippet up."
(setq snippet-exit-transform (yas--snippet-force-exit snippet))
(cond ((or snippet-exit-transform
(not (and active-field (yas--field-contains-point-p
active-field))))
- (setq snippets-left (delete snippet snippets-left))
(setf (yas--snippet-force-exit snippet) nil)
(setq snippet-exit-hook yas-after-exit-snippet-hook)
- (yas--commit-snippet snippet))
+ (yas--commit-snippet snippet)
+ (setq exited-snippets-p t))
((and active-field
(or (not yas--active-field-overlay)
(not (overlay-buffer yas--active-field-overlay))))
@@ -3569,7 +3575,7 @@ If so cleans up the whole snippet up."
(yas--update-mirrors snippet)))
(t
nil)))))
- (unless (or (null snippets) snippets-left)
+ (unless (or yas--active-snippets (not exited-snippets-p))
(when snippet-exit-transform
(yas--eval-for-effect snippet-exit-transform))
(let ((yas-after-exit-snippet-hook snippet-exit-hook))
@@ -4062,6 +4068,7 @@ Returns the newly created snippet."
;; Move to end
(goto-char (point-max))
+ (push snippet yas--active-snippets)
snippet))))
- [elpa] master updated (2604824 -> 32f3512), Noam Postavsky, 2019/12/22
- [elpa] master 4af3354 02/42: Make less garbage in overlay heavy buffers, Noam Postavsky, 2019/12/22
- [elpa] master e67592c 03/42: Don't use overlays to find active snippets,
Noam Postavsky <=
- [elpa] master 79b90c9 04/42: Remove compatibility code for Emacs 22 and earlier, Noam Postavsky, 2019/12/22
- [elpa] master d3bb879 05/42: Remove last-buffer-undo-list compat definition, Noam Postavsky, 2019/12/22
- [elpa] master 4f78d03 01/42: Close #937: Officially support automatically moving to next field, Noam Postavsky, 2019/12/22
- [elpa] master 1e71360 06/42: Per #947: fix typo in README.md, Noam Postavsky, 2019/12/22
- [elpa] master 7a178a2 07/42: Remove spurious change of before-change-functions, Noam Postavsky, 2019/12/22
- [elpa] master 8328c38 08/42: Fix another failure of cc-mode indentation, Noam Postavsky, 2019/12/22
- [elpa] master eeb05f0 10/42: Handle field adjust of pending active fields, Noam Postavsky, 2019/12/22
- [elpa] master 8452227 13/42: Consider fundamental-mode as ultimate ancestor, Noam Postavsky, 2019/12/22
- [elpa] master fb253ac 15/42: New public function yas-maybe-expand-abbrev-key-filter, Noam Postavsky, 2019/12/22
- [elpa] master bceb65b 16/42: Make backspace/DEL clear field (#957), Noam Postavsky, 2019/12/22