[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master d0c6fec 16/63: Refactor snippet marker manipulating functi
From: |
Noam Postavsky |
Subject: |
[elpa] master d0c6fec 16/63: Refactor snippet marker manipulating functions |
Date: |
Mon, 17 Jul 2017 22:54:12 -0400 (EDT) |
branch: master
commit d0c6fecab5253e159c1725a663bbc24c02f8a878
Author: Noam Postavsky <address@hidden>
Commit: Noam Postavsky <address@hidden>
Refactor snippet marker manipulating functions
* yasnippet.el (yas--snippet-map-markers): New function.
(yas--markers-to-points, yas--points-to-markers
(yas--collect-snippet-markers): Use it.
---
yasnippet.el | 88 +++++++++++++++++++++---------------------------------------
1 file changed, 31 insertions(+), 57 deletions(-)
diff --git a/yasnippet.el b/yasnippet.el
index 1a95005..a8acfc8 100644
--- a/yasnippet.el
+++ b/yasnippet.el
@@ -2973,6 +2973,20 @@ ENV is a list of elements with the form (VAR FORM)."
(declare (debug (form body)) (indent 1))
`(eval (cl-list* 'let* ,env ',body)))
+(defun yas--snippet-map-markers (fun snippet)
+ "Apply FUN to all marker (sub)fields in SNIPPET.
+Update each field with the result of calling FUN."
+ (dolist (field (yas--snippet-fields snippet))
+ (setf (yas--field-start field) (funcall fun (yas--field-start field)))
+ (setf (yas--field-end field) (funcall fun (yas--field-end field)))
+ (dolist (mirror (yas--field-mirrors field))
+ (setf (yas--mirror-start mirror) (funcall fun (yas--mirror-start
mirror)))
+ (setf (yas--mirror-end mirror) (funcall fun (yas--mirror-end
mirror)))))
+ (let ((snippet-exit (yas--snippet-exit snippet)))
+ (when snippet-exit
+ (setf (yas--exit-marker snippet-exit)
+ (funcall fun (yas--exit-marker snippet-exit))))))
+
(defun yas--apply-transform (field-or-mirror field &optional empty-on-nil-p)
"Calculate transformed string for FIELD-OR-MIRROR from FIELD.
@@ -3286,58 +3300,27 @@ If so cleans up the whole snippet up."
;; Apropos markers-to-points:
;;
-;; This was found useful for performance reasons, so that an
-;; excessive number of live markers aren't kept around in the
-;; `buffer-undo-list'. However, in `markers-to-points', the
-;; set-to-nil markers can't simply be discarded and replaced with
-;; fresh ones in `points-to-markers'. The original marker that was
-;; just set to nil has to be reused.
+;; This was found useful for performance reasons, so that an excessive
+;; number of live markers aren't kept around in the
+;; `buffer-undo-list'. We reuse the original marker object, although
+;; that's probably not necessary.
;;
-;; This shouldn't bring horrible problems with undo/redo, but it
-;; you never know
+;; This shouldn't bring horrible problems with undo/redo, but you
+;; never know.
;;
(defun yas--markers-to-points (snippet)
- "Convert all markers in SNIPPET to a cons (POINT . MARKER)
-where POINT is the original position of the marker and MARKER is
-the original marker object with the position set to nil."
- (dolist (field (yas--snippet-fields snippet))
- (let ((start (marker-position (yas--field-start field)))
- (end (marker-position (yas--field-end field))))
- (set-marker (yas--field-start field) nil)
- (set-marker (yas--field-end field) nil)
- (setf (yas--field-start field) (cons start (yas--field-start field)))
- (setf (yas--field-end field) (cons end (yas--field-end field))))
- (dolist (mirror (yas--field-mirrors field))
- (let ((start (marker-position (yas--mirror-start mirror)))
- (end (marker-position (yas--mirror-end mirror))))
- (set-marker (yas--mirror-start mirror) nil)
- (set-marker (yas--mirror-end mirror) nil)
- (setf (yas--mirror-start mirror) (cons start (yas--mirror-start
mirror)))
- (setf (yas--mirror-end mirror) (cons end (yas--mirror-end mirror))))))
- (let ((snippet-exit (yas--snippet-exit snippet)))
- (when snippet-exit
- (let ((exit (marker-position (yas--exit-marker snippet-exit))))
- (set-marker (yas--exit-marker snippet-exit) nil)
- (setf (yas--exit-marker snippet-exit) (cons exit (yas--exit-marker
snippet-exit)))))))
+ "Save all markers of SNIPPET as positions."
+ (yas--snippet-map-markers (lambda (m)
+ (prog1 (cons (marker-position m) m)
+ (set-marker m nil)))
+ snippet))
(defun yas--points-to-markers (snippet)
- "Convert all cons (POINT . MARKER) in SNIPPET to markers.
-
-This is done by setting MARKER to POINT with `set-marker'."
- (dolist (field (yas--snippet-fields snippet))
- (setf (yas--field-start field) (set-marker (cdr (yas--field-start field))
- (car (yas--field-start field))))
- (setf (yas--field-end field) (set-marker (cdr (yas--field-end field))
- (car (yas--field-end field))))
- (dolist (mirror (yas--field-mirrors field))
- (setf (yas--mirror-start mirror) (set-marker (cdr (yas--mirror-start
mirror))
- (car (yas--mirror-start
mirror))))
- (setf (yas--mirror-end mirror) (set-marker (cdr (yas--mirror-end mirror))
- (car (yas--mirror-end
mirror))))))
- (let ((snippet-exit (yas--snippet-exit snippet)))
- (when snippet-exit
- (setf (yas--exit-marker snippet-exit) (set-marker (cdr (yas--exit-marker
snippet-exit))
- (car (yas--exit-marker
snippet-exit)))))))
+ "Restore SNIPPET's marker positions, saved by `yas--markers-to-points'."
+ (yas--snippet-map-markers (lambda (p-m)
+ (set-marker (cdr p-m) (car p-m))
+ (cdr p-m))
+ snippet))
(defun yas--field-contains-point-p (field &optional point)
(let ((point (or point
@@ -4033,16 +4016,7 @@ The SNIPPET's markers are preserved."
(defun yas--collect-snippet-markers (snippet)
"Make a list of all the markers used by SNIPPET."
(let (markers)
- (dolist (field (yas--snippet-fields snippet))
- (push (yas--field-start field) markers)
- (push (yas--field-end field) markers)
- (dolist (mirror (yas--field-mirrors field))
- (push (yas--mirror-start mirror) markers)
- (push (yas--mirror-end mirror) markers)))
- (let ((snippet-exit (yas--snippet-exit snippet)))
- (when (and snippet-exit
- (marker-buffer (yas--exit-marker snippet-exit)))
- (push (yas--exit-marker snippet-exit) markers)))
+ (yas--snippet-map-markers (lambda (m) (push m markers) m) snippet)
markers))
(defun yas--escape-string (escaped)
- [elpa] master 48cd716 14/63: Use more compact format for snippet menus, (continued)
- [elpa] master 48cd716 14/63: Use more compact format for snippet menus, Noam Postavsky, 2017/07/17
- [elpa] master b62cf52 23/63: Remove lambda list building hack, Noam Postavsky, 2017/07/17
- [elpa] master 7b3c29d 13/63: * doc/faq.org: Typos and grammar., Noam Postavsky, 2017/07/17
- [elpa] master 14819c9 28/63: Make yas-buffer-local-condition into a defcustom, Noam Postavsky, 2017/07/17
- [elpa] master f3d0e03 25/63: * yasnippet-tests.el (snippet-exit-hooks): New test., Noam Postavsky, 2017/07/17
- [elpa] master 4ee3835 08/63: Use expand-env for all snippet evaluations, Noam Postavsky, 2017/07/17
- [elpa] master 203df22 22/63: Use debug-on-error to simplify error handling, Noam Postavsky, 2017/07/17
- [elpa] master 9c9547a 21/63: Don't catch and rethrow yas-{-}exception, Noam Postavsky, 2017/07/17
- [elpa] master e878afb 12/63: Update handling of markers during indentation, Noam Postavsky, 2017/07/17
- [elpa] master 6c4fbb2 24/63: Fix snippet local exit hook, Noam Postavsky, 2017/07/17
- [elpa] master d0c6fec 16/63: Refactor snippet marker manipulating functions,
Noam Postavsky <=
- [elpa] master e74f00e 18/63: Fix whitespace lossage between mirrors, Noam Postavsky, 2017/07/17
- [elpa] master 4f37afd 27/63: Let snippets expand in strings/comments by default, Noam Postavsky, 2017/07/17
- [elpa] master cddb826 29/63: Merge: let snippets expand in strings/comments by default, Noam Postavsky, 2017/07/17
- [elpa] master 462f566 44/63: Don't leave unreadable objects in the undo list, Noam Postavsky, 2017/07/17
- [elpa] master 3949421 41/63: Fix problems with auto-fill-mode interaction, Noam Postavsky, 2017/07/17
- [elpa] master 0d9afb2 31/63: Fix mirror transformation error with expand-env, Noam Postavsky, 2017/07/17
- [elpa] master b4d2f9c 37/63: Update snippets submodule, Noam Postavsky, 2017/07/17
- [elpa] master c5fddf8 34/63: Restore syntax-propertize-function before indenting snippet, Noam Postavsky, 2017/07/17
- [elpa] master 5043a96 38/63: Correctly wrap auto-fill-function when it's toggled on later, Noam Postavsky, 2017/07/17
- [elpa] master 30913fd 35/63: Only update live snippets, Noam Postavsky, 2017/07/17