mirror of
https://github.com/joaotavora/yasnippet.git
synced 2025-10-14 13:33:04 +00:00
wip: fix the overlay-moving bug, but zero-length mirrors/fields still a problem
This commit is contained in:
parent
002d524a32
commit
1f1edb6d4e
49
snippet.el
49
snippet.el
@ -105,10 +105,6 @@
|
|||||||
(set-marker-insertion-type marker t)
|
(set-marker-insertion-type marker t)
|
||||||
(set-marker marker (point))))
|
(set-marker marker (point))))
|
||||||
|
|
||||||
(defmacro snippet--with-current-object (object &rest body)
|
|
||||||
(declare (indent defun) (debug t))
|
|
||||||
`(snippet--call-with-current-object ,object #'(lambda () ,@body)))
|
|
||||||
|
|
||||||
(defun snippet--object-start-marker (field-or-mirror)
|
(defun snippet--object-start-marker (field-or-mirror)
|
||||||
(cond ((snippet--field-p field-or-mirror)
|
(cond ((snippet--field-p field-or-mirror)
|
||||||
(snippet--field-start field-or-mirror))
|
(snippet--field-start field-or-mirror))
|
||||||
@ -121,16 +117,27 @@
|
|||||||
((snippet--mirror-p field-or-mirror)
|
((snippet--mirror-p field-or-mirror)
|
||||||
(snippet--mirror-end field-or-mirror))))
|
(snippet--mirror-end field-or-mirror))))
|
||||||
|
|
||||||
|
(defun snippet--open-markers (start end)
|
||||||
|
(set-marker-insertion-type start nil)
|
||||||
|
(set-marker-insertion-type end t))
|
||||||
|
|
||||||
|
(defun snippet--close-markers (start end)
|
||||||
|
(set-marker-insertion-type start t)
|
||||||
|
(set-marker-insertion-type end nil))
|
||||||
|
|
||||||
(defun snippet--call-with-current-object (object fn)
|
(defun snippet--call-with-current-object (object fn)
|
||||||
(let* ((start (snippet--object-start-marker object))
|
(let* ((start (snippet--object-start-marker object))
|
||||||
(end (snippet--object-end-marker object)))
|
(end (snippet--object-end-marker object)))
|
||||||
(unwind-protect
|
(unwind-protect
|
||||||
(progn
|
(progn
|
||||||
(set-marker-insertion-type start nil)
|
(snippet--open-markers start end)
|
||||||
(set-marker-insertion-type end t)
|
|
||||||
(funcall fn))
|
(funcall fn))
|
||||||
(set-marker-insertion-type start t)
|
(snippet--close-markers start end))))
|
||||||
(set-marker-insertion-type end nil))))
|
|
||||||
|
(defmacro snippet--with-current-object (object &rest body)
|
||||||
|
(declare (indent defun) (debug t))
|
||||||
|
`(snippet--call-with-current-object ,object #'(lambda () ,@body)))
|
||||||
|
|
||||||
|
|
||||||
(defun snippet--insert-field (field text)
|
(defun snippet--insert-field (field text)
|
||||||
(when text
|
(when text
|
||||||
@ -159,12 +166,11 @@
|
|||||||
(let* ((field (overlay-get overlay 'snippet--field))
|
(let* ((field (overlay-get overlay 'snippet--field))
|
||||||
(inhibit-modification-hooks t))
|
(inhibit-modification-hooks t))
|
||||||
(cond (after?
|
(cond (after?
|
||||||
(set-marker-insertion-type (snippet--field-start field) t)
|
(snippet--close-markers (snippet--field-start field) (snippet--field-end field))
|
||||||
(set-marker-insertion-type (snippet--field-end field) nil)
|
(mapc #'snippet--update-mirror (snippet--field-mirrors field))
|
||||||
(mapc #'snippet--update-mirror (snippet--field-mirrors field)))
|
(move-overlay overlay (snippet--field-start field) (snippet--field-end field)))
|
||||||
(t
|
(t
|
||||||
(set-marker-insertion-type (snippet--field-start field) nil)
|
(snippet--open-markers (snippet--field-start field) (snippet--field-end field))))))
|
||||||
(set-marker-insertion-type (snippet--field-end field) t)))))
|
|
||||||
|
|
||||||
(defun snippet--field-text (field)
|
(defun snippet--field-text (field)
|
||||||
(buffer-substring-no-properties (snippet--field-start field)
|
(buffer-substring-no-properties (snippet--field-start field)
|
||||||
@ -381,7 +387,7 @@ I would need these somewhere in the let* form
|
|||||||
,(snippet--start-marker-name sym)
|
,(snippet--start-marker-name sym)
|
||||||
,(snippet--end-marker-name sym)
|
,(snippet--end-marker-name sym)
|
||||||
,parent-sym
|
,parent-sym
|
||||||
(list ,@(gethash sym field-mirrors))
|
(list ,@(reverse (gethash sym field-mirrors)))
|
||||||
,next-sym
|
,next-sym
|
||||||
,prev-sym)))))
|
,prev-sym)))))
|
||||||
|
|
||||||
@ -458,7 +464,7 @@ can be:
|
|||||||
`(insert (funcall ,form)))))
|
`(insert (funcall ,form)))))
|
||||||
|
|
||||||
(setq snippet--field-overlay
|
(setq snippet--field-overlay
|
||||||
(make-overlay (point) (point) nil nil nil))
|
(make-overlay (point) (point) nil nil t))
|
||||||
(overlay-put snippet--field-overlay
|
(overlay-put snippet--field-overlay
|
||||||
'face
|
'face
|
||||||
'snippet-field-face)
|
'snippet-field-face)
|
||||||
@ -486,11 +492,6 @@ can be:
|
|||||||
|
|
||||||
|
|
||||||
;;; some basic test snippets
|
;;; some basic test snippets
|
||||||
|
|
||||||
(define-snippet test ()
|
|
||||||
"some string" buffer-file-name)
|
|
||||||
|
|
||||||
|
|
||||||
(define-snippet printf ()
|
(define-snippet printf ()
|
||||||
"printf (\""
|
"printf (\""
|
||||||
(field 1 "%s")
|
(field 1 "%s")
|
||||||
@ -508,11 +509,17 @@ can be:
|
|||||||
(mirror 1 (concat field-text "qqcoisa"))))
|
(mirror 1 (concat field-text "qqcoisa"))))
|
||||||
"end")
|
"end")
|
||||||
|
|
||||||
|
(define-snippet easy ()
|
||||||
|
"A "
|
||||||
|
(field 1 "field")
|
||||||
|
" and its mirror: "
|
||||||
|
(mirror 1 (format "(mirror of %s)" field-text)))
|
||||||
|
|
||||||
(defun test ()
|
(defun test ()
|
||||||
(interactive)
|
(interactive)
|
||||||
(with-current-buffer (switch-to-buffer (get-buffer-create "*test*"))
|
(with-current-buffer (switch-to-buffer (get-buffer-create "*test*"))
|
||||||
(erase-buffer)
|
(erase-buffer)
|
||||||
(printf)))
|
(easy)))
|
||||||
|
|
||||||
|
|
||||||
(provide 'snippet)
|
(provide 'snippet)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user