mirror of
https://github.com/joaotavora/yasnippet.git
synced 2026-02-04 14:32:26 +00:00
new: make-snippet makes an anonymous snippet lambda
bug: apparently broke edebug though
This commit is contained in:
108
snippet.el
108
snippet.el
@@ -217,58 +217,13 @@ I would need these somewhere in the let* form
|
||||
,(or transform-form
|
||||
'field-text)))
|
||||
|
||||
|
||||
(defmacro define-snippet (name _args &rest body)
|
||||
"Define NAME as a snippet-inserting function.
|
||||
|
||||
NAME's function definition is set to a function with no arguments
|
||||
that inserts the fields components at point.
|
||||
|
||||
Each form in BODY can be:
|
||||
|
||||
* A cons (field FIELD-NAME FIELD-VALUE FIELD-TRANSFORM)
|
||||
definining a snippet field. A snippet field can be navigated to
|
||||
using `snippet-next-field' and
|
||||
`snippet-prev-field'. FIELD-TRANSFORM is currently
|
||||
unimplemented.
|
||||
|
||||
* A cons (mirror FIELD-NAME MIRROR-TRANSFORM) defining a mirror
|
||||
of the field named FIELD-NAME. Each time the text under the
|
||||
field changes, the form MIRROR-TRANSFORM is invoked with the
|
||||
variable `field-text' set to the text under the field. The
|
||||
string produced become the text under the mirror.
|
||||
|
||||
* A string literal which is inserted as a literal part of the
|
||||
snippet and remains unchanged while the snippet is navigated.
|
||||
|
||||
* A symbol designating a function which is called when the
|
||||
snippet is inserted. The string produced is treated as a
|
||||
literal string.
|
||||
|
||||
* A lambda form taking no arguments, called when the snippet is
|
||||
inserted. Again, the string produced is treated as a literal
|
||||
snippet string.
|
||||
|
||||
ARGS is an even-numbered property list of (KEY VAL) pairs. KEY
|
||||
can be:
|
||||
|
||||
* the symbol `:obarray', in which case the symbol NAME in
|
||||
interned in the obarray VAL instead of the global obarray. This
|
||||
options is currently unimplemented."
|
||||
(declare (debug (&define name sexp &rest &or
|
||||
("lambda" sexp def-form) ; curiously, function-form
|
||||
; doesn't work here
|
||||
|
||||
functionp
|
||||
sexp
|
||||
("mirror" sexp def-form)
|
||||
("field" sexp form))))
|
||||
(defun define--snippet-body (body)
|
||||
"Does the actual work for `define-snippet'"
|
||||
(let* ((sym-tuples (snippet--form-sym-tuples body))
|
||||
(marker-init-forms (snippet--make-marker-init-forms sym-tuples))
|
||||
(init-object-forms (snippet--init-field-and-mirror-forms sym-tuples))
|
||||
(first-field-sym (snippet--first-field-sym sym-tuples)))
|
||||
`(defun ,name ()
|
||||
(let* (,@(mapcar #'first init-object-forms)
|
||||
`(let* (,@(mapcar #'first init-object-forms)
|
||||
,@marker-init-forms)
|
||||
|
||||
,@(mapcar #'second init-object-forms)
|
||||
@@ -310,7 +265,59 @@ can be:
|
||||
sym-tuples))))
|
||||
,(if first-field-sym
|
||||
`(snippet--move-to-field ,first-field-sym))
|
||||
(add-hook 'post-command-hook 'snippet--post-command-hook t t)))))
|
||||
(add-hook 'post-command-hook 'snippet--post-command-hook t t))))
|
||||
|
||||
|
||||
(cl-defmacro define-snippet (name () &rest body)
|
||||
"Define NAME as a snippet-inserting function.
|
||||
|
||||
NAME's function definition is set to a function with no arguments
|
||||
that inserts the fields components at point.
|
||||
|
||||
Each form in BODY can be:
|
||||
|
||||
* A cons (field FIELD-NAME FIELD-VALUE FIELD-TRANSFORM)
|
||||
definining a snippet field. A snippet field can be navigated to
|
||||
using `snippet-next-field' and
|
||||
`snippet-prev-field'. FIELD-TRANSFORM is currently
|
||||
unimplemented.
|
||||
|
||||
* A cons (mirror FIELD-NAME MIRROR-TRANSFORM) defining a mirror
|
||||
of the field named FIELD-NAME. Each time the text under the
|
||||
field changes, the form MIRROR-TRANSFORM is invoked with the
|
||||
variable `field-text' set to the text under the field. The
|
||||
string produced become the text under the mirror.
|
||||
|
||||
* A string literal which is inserted as a literal part of the
|
||||
snippet and remains unchanged while the snippet is navigated.
|
||||
|
||||
* A symbol designating a function which is called when the
|
||||
snippet is inserted. The string produced is treated as a
|
||||
literal string.
|
||||
|
||||
* A lambda form taking no arguments, called when the snippet is
|
||||
inserted. Again, the string produced is treated as a literal
|
||||
snippet string.
|
||||
|
||||
ARGS is an even-numbered property list of (KEY VAL) pairs. KEY
|
||||
can be:
|
||||
|
||||
* the symbol `:obarray', in which case the symbol NAME in
|
||||
interned in the obarray VAL instead of the global obarray. This
|
||||
options is currently unimplemented."
|
||||
(declare (debug (&define name sexp &rest &or
|
||||
;; curiously, function-form doesn't work here
|
||||
;;
|
||||
("lambda" sexp def-form)
|
||||
sexp
|
||||
("mirror" sexp def-form)
|
||||
("field" sexp))))
|
||||
`(defun ,name ()
|
||||
,(define--snippet-body body)))
|
||||
|
||||
(cl-defmacro make-snippet (&rest body)
|
||||
"Same as `define-snippet', but return an anonymous function."
|
||||
`(lambda () ,(define--snippet-body body)))
|
||||
|
||||
|
||||
;;; Snippet mechanics
|
||||
@@ -323,7 +330,8 @@ can be:
|
||||
next-field
|
||||
prev-field)
|
||||
|
||||
(defun snippet--init-field (object name start end parent-field mirrors next-field prev-field)
|
||||
(defun snippet--init-field (object name start end parent-field mirrors
|
||||
next-field prev-field)
|
||||
(setf (snippet--field-name object) name
|
||||
(snippet--field-start object) start
|
||||
(snippet--field-end object) end
|
||||
|
||||
Reference in New Issue
Block a user