now you can C-w to delete the overlay without causing problems.

This commit is contained in:
Zhang Chiyuan 2008-04-10 04:30:52 +00:00
parent 67735deda2
commit 60cf669105

View File

@ -276,6 +276,12 @@ You can customize the key through `yas/trigger-key'."
(hash (make-hash-table :test 'equal)) (hash (make-hash-table :test 'equal))
(parent nil)) (parent nil))
(defun yas/snippet-valid? (snippet)
"See if snippet is valid (ie. still alive)."
(and (not (null snippet))
(not (null (yas/snippet-overlay snippet)))
(not (null (overlay-start (yas/snippet-overlay snippet))))))
(defun yas/snippet-add-field (snippet field) (defun yas/snippet-add-field (snippet field)
"Add FIELD to SNIPPET." "Add FIELD to SNIPPET."
(let ((group (find field (let ((group (find field
@ -463,25 +469,26 @@ the template of a snippet in the current snippet-table."
(defun yas/synchronize-fields (field-group) (defun yas/synchronize-fields (field-group)
"Update all fields' text according to the primary field." "Update all fields' text according to the primary field."
(save-excursion (when (yas/snippet-valid? (yas/group-snippet field-group))
(let* ((inhibit-modification-hooks t) (save-excursion
(primary (yas/group-primary-field field-group)) (let* ((inhibit-modification-hooks t)
(primary-overlay (yas/field-overlay primary)) (primary (yas/group-primary-field field-group))
(text (buffer-substring-no-properties (overlay-start primary-overlay) (primary-overlay (yas/field-overlay primary))
(overlay-end primary-overlay)))) (text (buffer-substring-no-properties (overlay-start primary-overlay)
(dolist (field (yas/group-fields field-group)) (overlay-end primary-overlay))))
(let* ((field-overlay (yas/field-overlay field)) (dolist (field (yas/group-fields field-group))
(original-length (- (overlay-end field-overlay) (let* ((field-overlay (yas/field-overlay field))
(overlay-start field-overlay)))) (original-length (- (overlay-end field-overlay)
(unless (eq field-overlay primary-overlay) (overlay-start field-overlay))))
(goto-char (overlay-start field-overlay)) (unless (eq field-overlay primary-overlay)
(insert (yas/calculate-field-value field text)) (goto-char (overlay-start field-overlay))
(if (= (overlay-start field-overlay) (insert (yas/calculate-field-value field text))
(overlay-end field-overlay)) (if (= (overlay-start field-overlay)
(move-overlay field-overlay (overlay-end field-overlay))
(overlay-start field-overlay) (move-overlay field-overlay
(point)) (overlay-start field-overlay)
(delete-char original-length)))))))) (point))
(delete-char original-length)))))))))
(defun yas/overlay-modification-hook (overlay after? beg end &optional length) (defun yas/overlay-modification-hook (overlay after? beg end &optional length)
"Modification hook for snippet field overlay." "Modification hook for snippet field overlay."
@ -503,34 +510,39 @@ the template of a snippet in the current snippet-table."
"Insert behind hook sometimes doesn't get called. I don't know why. "Insert behind hook sometimes doesn't get called. I don't know why.
So I add modification hook in the big overlay and try to detect `insert-behind' So I add modification hook in the big overlay and try to detect `insert-behind'
event manually." event manually."
(when (and after? (when after?
(= length 0) (cond ((and (= beg end)
(> end beg) (> length 0)
(null (yas/current-snippet-overlay beg)) (= (overlay-start overlay)
(not (bobp))) (overlay-end overlay)))
(let ((field-overlay (yas/current-snippet-overlay (1- beg)))) (yas/exit-snippet (overlay-get overlay 'yas/snippet-reference)))
(if field-overlay ((and (= length 0)
(when (= beg (overlay-end field-overlay)) (> end beg)
(move-overlay field-overlay (null (yas/current-snippet-overlay beg))
(overlay-start field-overlay) (not (bobp)))
end) (let ((field-overlay (yas/current-snippet-overlay (1- beg))))
(yas/synchronize-fields (overlay-get field-overlay 'yas/group))) (if field-overlay
(let ((snippet (yas/snippet-of-current-keymap)) (when (= beg (overlay-end field-overlay))
(done nil)) (move-overlay field-overlay
(if snippet (overlay-start field-overlay)
(do* ((groups (yas/snippet-groups snippet) (cdr groups)) end)
(group (car groups) (car groups))) (yas/synchronize-fields (overlay-get field-overlay 'yas/group)))
((or (null groups) (let ((snippet (yas/snippet-of-current-keymap))
done)) (done nil))
(setq field-overlay (yas/field-overlay (if snippet
(yas/group-primary-field group))) (do* ((groups (yas/snippet-groups snippet) (cdr groups))
(when (and (= (overlay-start field-overlay) (group (car groups) (car groups)))
(overlay-end field-overlay)) ((or (null groups)
(= beg done))
(overlay-start field-overlay))) (setq field-overlay (yas/field-overlay
(move-overlay field-overlay beg end) (yas/group-primary-field group)))
(yas/synchronize-fields group) (when (and (= (overlay-start field-overlay)
(setq done t))))))))) (overlay-end field-overlay))
(= beg
(overlay-start field-overlay)))
(move-overlay field-overlay beg end)
(yas/synchronize-fields group)
(setq done t)))))))))))
(defun yas/undo-expand-snippet (start end key snippet) (defun yas/undo-expand-snippet (start end key snippet)
"Undo a snippet expansion. Delete the overlays. This undo can't be "Undo a snippet expansion. Delete the overlays. This undo can't be