mirror of
https://github.com/joaotavora/yasnippet.git
synced 2025-10-13 21:13:04 +00:00
* mirrors-inside-fields works! hope I didn't break a million other
things...
This commit is contained in:
parent
9d3d2e102c
commit
2e16b2a732
86
yasnippet.el
86
yasnippet.el
@ -2444,6 +2444,7 @@ Otherwise throw exception."
|
|||||||
"A mirror."
|
"A mirror."
|
||||||
start end
|
start end
|
||||||
(transform nil)
|
(transform nil)
|
||||||
|
parent-field
|
||||||
next)
|
next)
|
||||||
|
|
||||||
(defstruct (yas/exit (:constructor yas/make-exit (marker)))
|
(defstruct (yas/exit (:constructor yas/make-exit (marker)))
|
||||||
@ -3178,7 +3179,7 @@ has to be called before the $-constructs are deleted."
|
|||||||
(t
|
(t
|
||||||
(setf (yas/exit-next fom) nextfom))))
|
(setf (yas/exit-next fom) nextfom))))
|
||||||
(yas/compare-fom-begs (fom1 fom2)
|
(yas/compare-fom-begs (fom1 fom2)
|
||||||
(> (yas/fom-start fom2) (yas/fom-start fom1)))
|
(>= (yas/fom-start fom2) (yas/fom-start fom1)))
|
||||||
(yas/link-foms (fom1 fom2)
|
(yas/link-foms (fom1 fom2)
|
||||||
(yas/fom-set-next-fom fom1 fom2)))
|
(yas/fom-set-next-fom fom1 fom2)))
|
||||||
;; make some yas/field, yas/mirror and yas/exit soup
|
;; make some yas/field, yas/mirror and yas/exit soup
|
||||||
@ -3195,6 +3196,23 @@ has to be called before the $-constructs are deleted."
|
|||||||
(when soup
|
(when soup
|
||||||
(reduce #'yas/link-foms soup)))))
|
(reduce #'yas/link-foms soup)))))
|
||||||
|
|
||||||
|
(defun yas/calculate-mirror-parent-fields (snippet mirror)
|
||||||
|
"Attempt to assign a parent field of SNIPPET to the mirror MIRROR.
|
||||||
|
|
||||||
|
Use the tighest containing field if more than one field contains
|
||||||
|
the mirror. Intended to be called *before* the dollar-regions are
|
||||||
|
deleted."
|
||||||
|
(let ((min (point-min))
|
||||||
|
(max (point-max)))
|
||||||
|
(dolist (field (yas/snippet-fields snippet))
|
||||||
|
(when (and (<= (yas/field-start field) (yas/mirror-start mirror))
|
||||||
|
(<= (yas/mirror-end mirror) (yas/field-end field))
|
||||||
|
(< min (yas/field-start field))
|
||||||
|
(< (yas/field-end field) max))
|
||||||
|
(setq min (yas/field-start field)
|
||||||
|
max (yas/field-end field))
|
||||||
|
(setf (yas/mirror-parent-field mirror) field)))))
|
||||||
|
|
||||||
(defun yas/advance-end-maybe (fom newend)
|
(defun yas/advance-end-maybe (fom newend)
|
||||||
"Maybe advance FOM's end to NEWEND if it needs it.
|
"Maybe advance FOM's end to NEWEND if it needs it.
|
||||||
|
|
||||||
@ -3219,6 +3237,12 @@ If it does, also call `yas/advance-end-maybe' on FOM."
|
|||||||
(set-marker (yas/fom-start fom) newstart)
|
(set-marker (yas/fom-start fom) newstart)
|
||||||
(yas/advance-end-maybe fom newstart)))
|
(yas/advance-end-maybe fom newstart)))
|
||||||
|
|
||||||
|
(defun yas/advance-end-of-parents-maybe (field newend)
|
||||||
|
(when (and field
|
||||||
|
(< (yas/field-end field) newend))
|
||||||
|
(set-marker (yas/field-end field) newend)
|
||||||
|
(yas/advance-end-of-parents-maybe (yas/field-parent-field field) newend)))
|
||||||
|
|
||||||
(defvar yas/dollar-regions nil
|
(defvar yas/dollar-regions nil
|
||||||
"When expanding the snippet the \"parse-create\" functions add
|
"When expanding the snippet the \"parse-create\" functions add
|
||||||
cons cells to this var")
|
cons cells to this var")
|
||||||
@ -3468,13 +3492,21 @@ When multiple expressions are found, only the last one counts."
|
|||||||
(save-excursion
|
(save-excursion
|
||||||
(while (re-search-forward yas/multi-dollar-lisp-expression-regexp nil t)
|
(while (re-search-forward yas/multi-dollar-lisp-expression-regexp nil t)
|
||||||
(let* ((real-match-end-1 (yas/scan-sexps (match-beginning 1) 1)))
|
(let* ((real-match-end-1 (yas/scan-sexps (match-beginning 1) 1)))
|
||||||
;; commit the primary field transformation if we don't find
|
;; commit the primary field transformation if:
|
||||||
;; it in yas/dollar-regions (a subnested field) might have
|
;;
|
||||||
;; already caught it.
|
;; 1. we don't find it in yas/dollar-regions (a subnested
|
||||||
|
;; field) might have already caught it.
|
||||||
|
;;
|
||||||
|
;; 2. we really make sure we have either two '$' or some
|
||||||
|
;; text and a '$' after the colon ':'. This is a FIXME: work
|
||||||
|
;; my regular expressions and end these ugly hacks.
|
||||||
|
;;
|
||||||
(when (and real-match-end-1
|
(when (and real-match-end-1
|
||||||
(not (member (cons (match-beginning 0)
|
(not (member (cons (match-beginning 0)
|
||||||
real-match-end-1)
|
real-match-end-1)
|
||||||
yas/dollar-regions)))
|
yas/dollar-regions))
|
||||||
|
(not (eq ?:
|
||||||
|
(char-before (1- (match-beginning 1))))))
|
||||||
(let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1)
|
(let ((lisp-expression-string (buffer-substring-no-properties (match-beginning 1)
|
||||||
real-match-end-1)))
|
real-match-end-1)))
|
||||||
(setf (yas/field-transform parent-field)
|
(setf (yas/field-transform parent-field)
|
||||||
@ -3489,15 +3521,20 @@ When multiple expressions are found, only the last one counts."
|
|||||||
(number (string-to-number (match-string-no-properties 1)))
|
(number (string-to-number (match-string-no-properties 1)))
|
||||||
(field (and number
|
(field (and number
|
||||||
(not (zerop number))
|
(not (zerop number))
|
||||||
(yas/snippet-find-field snippet number))))
|
(yas/snippet-find-field snippet number)))
|
||||||
(when (and real-match-end-0
|
(brand-new-mirror
|
||||||
field)
|
(and real-match-end-0
|
||||||
(push (yas/make-mirror (yas/make-marker (match-beginning 0))
|
field
|
||||||
(yas/make-marker (match-beginning 0))
|
(yas/make-mirror (yas/make-marker (match-beginning 0))
|
||||||
(yas/read-lisp (yas/restore-escapes
|
(yas/make-marker (match-beginning 0))
|
||||||
(buffer-substring-no-properties (match-beginning 2)
|
(yas/read-lisp
|
||||||
(1- real-match-end-0)))))
|
(yas/restore-escapes
|
||||||
|
(buffer-substring-no-properties (match-beginning 2)
|
||||||
|
(1- real-match-end-0))))))))
|
||||||
|
(when brand-new-mirror
|
||||||
|
(push brand-new-mirror
|
||||||
(yas/field-mirrors field))
|
(yas/field-mirrors field))
|
||||||
|
(yas/calculate-mirror-parent-fields snippet brand-new-mirror)
|
||||||
(push (cons (match-beginning 0) real-match-end-0) yas/dollar-regions)))))
|
(push (cons (match-beginning 0) real-match-end-0) yas/dollar-regions)))))
|
||||||
|
|
||||||
(defun yas/simple-mirror-parse-create (snippet)
|
(defun yas/simple-mirror-parse-create (snippet)
|
||||||
@ -3523,10 +3560,13 @@ When multiple expressions are found, only the last one counts."
|
|||||||
(t
|
(t
|
||||||
(let ((field (yas/snippet-find-field snippet number)))
|
(let ((field (yas/snippet-find-field snippet number)))
|
||||||
(if field
|
(if field
|
||||||
(push (yas/make-mirror (yas/make-marker (match-beginning 0))
|
(let ((brand-new-mirror (yas/make-mirror
|
||||||
(yas/make-marker (match-beginning 0))
|
(yas/make-marker (match-beginning 0))
|
||||||
nil)
|
(yas/make-marker (match-beginning 0))
|
||||||
(yas/field-mirrors field))
|
nil)))
|
||||||
|
(push brand-new-mirror
|
||||||
|
(yas/field-mirrors field))
|
||||||
|
(yas/calculate-mirror-parent-fields snippet brand-new-mirror))
|
||||||
(push (yas/make-field number
|
(push (yas/make-field number
|
||||||
(yas/make-marker (match-beginning 0))
|
(yas/make-marker (match-beginning 0))
|
||||||
(yas/make-marker (match-beginning 0))
|
(yas/make-marker (match-beginning 0))
|
||||||
@ -3563,8 +3603,12 @@ When multiple expressions are found, only the last one counts."
|
|||||||
|
|
||||||
(defun yas/mirror-update-display (mirror field)
|
(defun yas/mirror-update-display (mirror field)
|
||||||
"Update MIRROR according to FIELD (and mirror transform)."
|
"Update MIRROR according to FIELD (and mirror transform)."
|
||||||
(let ((reflection (or (yas/apply-transform mirror field)
|
|
||||||
(yas/field-text-for-display field))))
|
(let* ((mirror-parent-field (yas/mirror-parent-field mirror))
|
||||||
|
(reflection (and (not (and mirror-parent-field
|
||||||
|
(yas/field-modified-p mirror-parent-field)))
|
||||||
|
(or (yas/apply-transform mirror field)
|
||||||
|
(yas/field-text-for-display field)))))
|
||||||
(when (and reflection
|
(when (and reflection
|
||||||
(not (string= reflection (buffer-substring-no-properties (yas/mirror-start mirror)
|
(not (string= reflection (buffer-substring-no-properties (yas/mirror-start mirror)
|
||||||
(yas/mirror-end mirror)))))
|
(yas/mirror-end mirror)))))
|
||||||
@ -3573,7 +3617,9 @@ When multiple expressions are found, only the last one counts."
|
|||||||
(if (> (yas/mirror-end mirror) (point))
|
(if (> (yas/mirror-end mirror) (point))
|
||||||
(delete-region (point) (yas/mirror-end mirror))
|
(delete-region (point) (yas/mirror-end mirror))
|
||||||
(set-marker (yas/mirror-end mirror) (point))
|
(set-marker (yas/mirror-end mirror) (point))
|
||||||
(yas/advance-start-maybe (yas/mirror-next mirror) (point))))))
|
(yas/advance-start-maybe (yas/mirror-next mirror) (point))
|
||||||
|
;; super-special advance
|
||||||
|
(yas/advance-end-of-parents-maybe mirror-parent-field (point))))))
|
||||||
|
|
||||||
(defun yas/field-update-display (field snippet)
|
(defun yas/field-update-display (field snippet)
|
||||||
"Much like `yas/mirror-update-display', but for fields"
|
"Much like `yas/mirror-update-display', but for fields"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user