anchor.diff:         (prog1 (progn ,@body)
            (buffer-modify ,buffer)))))
   
  -(defun shift-sticky-objects (buffer linum line charpos n)
  +(defun shift-sticky-objects (line charpos n)
     (line-property-insert-pos line charpos n)
  -  (dolist (m (buffer-points buffer))
  -    (when (and (= linum (point-linum m))
  -               (etypecase (point-kind m)
  -                 ((eql :left-inserting)
  -                  (<= charpos (point-charpos m)))
  -                 ((eql :right-inserting)
  -                  (< charpos (point-charpos m)))
  -                 ((eql :temporary)
  -                  nil)))
  -      (incf (point-charpos m) n))))
  -
  -(defun shift-sticky-objects-newline (buffer linum line charpos)
  +  (dolist (p (line-points line))
  +    (when (etypecase (point-kind p)
  +            ((eql :left-inserting)
  +             (<= charpos (point-charpos p)))
  +            ((eql :right-inserting)
  +             (< charpos (point-charpos p))))
  +      (incf (point-charpos p) n))))
  +
  +(defun shift-sticky-objects-newline (line charpos)
     (line-property-insert-newline line (line-next line) charpos)
  -  (dolist (m (buffer-points buffer))
  -    (cond ((and (= (point-linum m) linum)
  -                (etypecase (point-kind m)
  -                  ((eql :left-inserting)
  -                   (<= charpos (point-charpos m)))
  -                  ((eql :right-inserting)
  -                   (< charpos (point-charpos m)))
  -                  ((eql :temporary)
  -                   nil)))
  -           (setf (point-line m) (line-next (point-line m)))
  -           (incf (point-linum m))
  -           (decf (point-charpos m) charpos))
  -          ((< linum (point-linum m))
  -           (incf (point-linum m))))))
  +  (dolist (p (line-points line))
  +    (when (etypecase (point-kind p)
  +            ((eql :left-inserting)
  +             (<= charpos (point-charpos p)))
  +            ((eql :right-inserting)
  +             (< charpos (point-charpos p))))
  +      (point-change-line p (line-next line))
  +      (decf (point-charpos p) charpos))))
   
   (defun shift-sticky-objects-subtract (point n)
     (let ((line (point-line point))
  -        (linum (point-linum point))
  -        (charpos (point-charpos point))
  -        (buffer (point-buffer point)))
  +        (charpos (point-charpos point)))
       (line-property-delete-pos line charpos n)
  -    (dolist (m (buffer-points buffer))
  -      (when (and (= linum (point-linum m))
  -                 (< charpos (point-charpos m)))
  -        (setf (point-charpos m)
  -              (if (> charpos (- (point-charpos m) n))
  +    (dolist (p (line-points line))
  +      (when (< charpos (point-charpos p))
  +        (setf (point-charpos p)
  +              (if (> charpos (- (point-charpos p) n))
                     charpos
  -                  (- (point-charpos m) n)))))))
  -
  -(defun shift-sticky-objects-subtract-line (point nextp)
  +                  (- (point-charpos p) n)))))))
  +
  +(defun shift-sticky-objects-subtract-line (point)
     (let* ((line (point-line point))
  -         (linum (point-linum point))
  -         (charpos (point-charpos point))
  -         (buffer (point-buffer point)))
  +         (charpos (point-charpos point)))
       (line-property-delete-line line charpos)
  -    (dolist (m (buffer-points buffer))
  -      (cond ((and (= linum (point-linum m))
  -                  (< charpos (point-charpos m)))
  -             (setf (point-charpos m) charpos))
  -            ((< linum (point-linum m))
  -             (when (eq (line-next line) (point-line m))
  -               (setf (point-line m) line)
  -               (incf (point-charpos m) (point-charpos point)))
  -             (decf (point-linum m)))))
  -    (when nextp
  +    (dolist (p (line-points line))
  +      (when (< charpos (point-charpos p))
  +        (setf (point-charpos p) charpos)))
  +    (when (line-next line)
  +      (dolist (p (line-points (line-next line)))
  +        (point-change-line p line)
  +        (incf (point-charpos p) charpos))
         (line-merge line (line-next line) charpos))))
   
  -(defun %insert-newline/point (buffer linum line charpos)
  +(defun %insert-newline/point (buffer line charpos)
     (make-line buffer
                line
                (line-next line)
                (subseq (line-str line) charpos))
  -  (shift-sticky-objects-newline buffer linum line charpos)
  +  (shift-sticky-objects-newline line charpos)
     (incf (buffer-nlines buffer))
     (setf (line-str line)
           (subseq (line-str line) 0 charpos)))
  
positive.code:       (cond
          ((char= char #\newline)
           (%insert-newline/point (point-buffer point)
  				(point-linum point)
                                  (point-line point)
  				(point-charpos point)))
          (t
           (let ((line (point-line point))
                 (charpos (point-charpos point)))
             (shift-sticky-objects (point-buffer point) (point-linum point) line charpos 1)
             (setf (line-str line)
                   (concatenate 'string
                                (subseq (line-str line) 0 charpos)
  
negative.code: 
  (defun %delete-line-eol/point (point start)
    (declare (special killring-stream line))
    (shift-sticky-objects-subtract-line point)
    (write-string (line-str line) killring-stream :start start)
    (setf (line-str line)
          (subseq (line-str line) 0 start)))
  
  (defun %delete-line/point (point start)
    (declare (special killring-stream line buffer n))
    (shift-sticky-objects-subtract-line point)
    (write-string (line-str line) killring-stream :start start)
    (write-char #\newline killring-stream)
    (unless (eq n 'T)
  