mirror of
https://github.com/joaotavora/yasnippet.git
synced 2025-10-13 13:13:03 +00:00
use a keymap overlay with rear-sticky to support TAB key behind a field.
This commit is contained in:
parent
e3e154e33f
commit
d781580ab0
34
yasnippet.el
34
yasnippet.el
@ -92,6 +92,7 @@ current column if this variable is non-`nil'.")
|
||||
(fields (list primary-field))
|
||||
(next nil)
|
||||
(prev nil)
|
||||
(keymap-overlay nil)
|
||||
snippet)
|
||||
(defstruct (yas/field (:constructor yas/make-field (overlay number value)))
|
||||
"A field in a snippet."
|
||||
@ -317,7 +318,18 @@ will be deleted before inserting template."
|
||||
(setf (yas/group-next prev) group))
|
||||
(setq prev group)))
|
||||
|
||||
;; Step 7: Replace fields with default values
|
||||
;; Step 7: Create keymap overlay for each group
|
||||
(dolist (group (yas/snippet-groups snippet))
|
||||
(let* ((overlay (yas/field-overlay (yas/group-primary-field group)))
|
||||
(keymap-overlay (make-overlay (overlay-start overlay)
|
||||
(overlay-end overlay)
|
||||
nil
|
||||
nil
|
||||
t)))
|
||||
(overlay-put keymap-overlay 'keymap yas/keymap)
|
||||
(setf (yas/group-keymap-overlay group) keymap-overlay)))
|
||||
|
||||
;; Step 8: Replace fields with default values
|
||||
(dolist (group (yas/snippet-groups snippet))
|
||||
(let ((value (yas/group-value group)))
|
||||
(dolist (field (yas/group-fields group))
|
||||
@ -329,16 +341,15 @@ will be deleted before inserting template."
|
||||
(insert value)
|
||||
(delete-char length)))))
|
||||
|
||||
;; Step 8: restore all escape characters
|
||||
;; Step 9: restore all escape characters
|
||||
(yas/replace-all yas/escape-dollar "$")
|
||||
(yas/replace-all yas/escape-backquote "`")
|
||||
(yas/replace-all yas/escape-backslash "\\")
|
||||
|
||||
;; Step 9: Set up properties of overlays, including keymaps
|
||||
;; Step 10: Set up properties of overlays
|
||||
(dolist (group (yas/snippet-groups snippet))
|
||||
(let ((overlay (yas/field-overlay
|
||||
(yas/group-primary-field group))))
|
||||
(overlay-put overlay 'keymap yas/keymap)
|
||||
(overlay-put overlay 'yas/snippet snippet)
|
||||
(overlay-put overlay 'yas/group group)
|
||||
(overlay-put overlay 'yas/modified? nil)
|
||||
@ -350,12 +361,12 @@ will be deleted before inserting template."
|
||||
'face
|
||||
'highlight))))
|
||||
|
||||
;; Step 10: move to end and make sure exit-marker exist
|
||||
;; Step 11: move to end and make sure exit-marker exist
|
||||
(goto-char (point-max))
|
||||
(unless (yas/snippet-exit-marker snippet)
|
||||
(setf (yas/snippet-exit-marker snippet) (copy-marker (point) t)))
|
||||
|
||||
;; Step 11: Construct undo information
|
||||
;; Step 12: Construct undo information
|
||||
(unless (eq original-undo-list t)
|
||||
(add-to-list 'original-undo-list
|
||||
`(apply yas/undo-expand-snippet
|
||||
@ -364,11 +375,11 @@ will be deleted before inserting template."
|
||||
,key
|
||||
,snippet)))
|
||||
|
||||
;; Step 12: remove the trigger key
|
||||
;; Step 13: remove the trigger key
|
||||
(widen)
|
||||
(delete-char length)
|
||||
|
||||
;; Step 13: place the cursor at a proper place
|
||||
;; Step 14: place the cursor at a proper place
|
||||
(let ((groups (yas/snippet-groups snippet))
|
||||
(exit-marker (yas/snippet-exit-marker snippet)))
|
||||
(if groups
|
||||
@ -416,7 +427,8 @@ otherwise, nil returned."
|
||||
(defun yas/next-field-group ()
|
||||
"Navigate to next field group. If there's none, exit the snippet."
|
||||
(interactive)
|
||||
(let ((overlay (yas/current-snippet-overlay)))
|
||||
(let ((overlay (or (yas/current-snippet-overlay)
|
||||
(yas/current-snippet-overlay (- (point) 1)))))
|
||||
(if overlay
|
||||
(let ((next (yas/group-next
|
||||
(overlay-get overlay 'yas/group))))
|
||||
@ -430,7 +442,8 @@ otherwise, nil returned."
|
||||
(defun yas/prev-field-group ()
|
||||
"Navigate to prev field group. If there's none, exit the snippet."
|
||||
(interactive)
|
||||
(let ((overlay (yas/current-snippet-overlay)))
|
||||
(let ((overlay (or (yas/current-snippet-overlay)
|
||||
(yas/current-snippet-overlay (- (point) 1)))))
|
||||
(if overlay
|
||||
(let ((prev (yas/group-prev
|
||||
(overlay-get overlay 'yas/group))))
|
||||
@ -446,6 +459,7 @@ otherwise, nil returned."
|
||||
(interactive)
|
||||
(goto-char (yas/snippet-exit-marker snippet))
|
||||
(dolist (group (yas/snippet-groups snippet))
|
||||
(delete-overlay (yas/group-keymap-overlay group))
|
||||
(dolist (field (yas/group-fields group))
|
||||
(delete-overlay (yas/field-overlay field)))))
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user