wip: fix the overlay-moving bug, but zero-length mirrors/fields still a problem

This commit is contained in:
Joao Tavora 2013-10-14 15:09:20 +01:00
parent 002d524a32
commit 1f1edb6d4e

View File

@ -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)